搭建Zuul网关

2020-10-29  本文已影响0人  liangxifeng833
image.png

在上一个项目的configCenter父项目中新增maven Module子项目zuul_gateway;
该服务为网关服务,所有请求先经过该网关后,由网关负责去注册中心获取对应服务真实地址,然后在本地做负载均衡请求真实服务器地址。
本网关服务对外端口:8102
app-member会员服务端口:8101
app-order订单服务端口:8103
该网关服务需要将自己注册到eureka注册中心,所以需要EurekaServer服务。

image.png

pom.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>configCenter</artifactId>
        <groupId>configCenter</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>zuul_gateway</artifactId>

    <dependencies>
        <!--spring-cloud2.0比较支持zuul网关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>
</project>

application.yml 文件内容:

server:
  port: 8102

###服务别名--该服务注册到服务中心的名称
spring:
  application:
    name: service-zuul
zuul:
  routes:
    ### 定义转发规则,这里的api-a是自定义的,也可以修改为api-member
    api-a:
      ### 客户端请求http://127.0.0.1/api-member开头的,都会转发到会员服务
      path: /api-member/**
      #这里的app-member是会员服务在注册中信中的别名
      #zuul网关默认整合ribbon,自动实现负载均衡轮训效果
      serviceId: app-member
    api-b:
      path: /api-order/**
      serviceId: app-order


eureka:
  client:
    serviceUrl:
      ###当前会员服务注册到eureka服务中心(所有eureka集群地址)
      defaultZone: http://eureka-server1:7100/eureka

项目启动 ZuulGatewayApplication.java

package zuul_gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
//@EnableEurekaClient 将当前服务注册到Eureka
@EnableEurekaClient
//开启Zuul网关代理
@EnableZuulProxy
public class ZuulGatewayApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(ZuulGatewayApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ZuulGatewayApplication.class);
    }
}

启动网关服务并测试

image.png

在zuul_gateway网关项目中添加过滤器

package zuul_gateway;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 网关token过滤器
 * @author liangxifeng
 * @date 2020-08-09
 */
@Component
public class TokenFilter extends ZuulFilter {
    //过滤器类型pre,表示请求之前执行
    @Override
    public String filterType() {
        return "pre";
    }

    //过滤器执行顺序,当一个请求在同一阶段存在多个过滤器的时候,多个过滤器执行顺序
    @Override
    public int filterOrder() {
        return 0;
    }

    //判断过滤器是否生效,这里return true生效
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 拦截业务逻辑代码
     * 所有通过网关的请求,都必须通过该方法验证,才能继续放行
     * 如果验证失败,则返回401
     */
    @Override
    public Object run() throws ZuulException {
        //案例:拦截所有服务接口,判断服务接口上是否有传递userToken参数
        //1. 获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //2. 获取Request
        HttpServletRequest request = currentContext.getRequest();
        //3. 获取token
        String userToken = request.getParameter("userToken");
        if (StringUtils.isEmpty(userToken)) {
            //如果token为空,则网关直接返回
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseBody("userToken is null");
            currentContext.setResponseStatusCode(401);
            return null;
        }
        //正常调用其他服务接口
        return null;
    }
}

动态Zuul网关路由转发

我的视频总结地址:https://www.bilibili.com/video/BV1z64y1F727/
我的源代码地址:https://github.com/liangxifeng833/springcloud/tree/master/configCenter/zuul_gateway

上一篇 下一篇

猜你喜欢

热点阅读