天天看點

springcloud——接口網關zuul

zuul接口網關

  • 攔截所有請求,網關進行請求轉發(類似nginx反向代理)
  • 路由分發
  • 請求參數驗證(token)
  • 不必再每個子產品配置攔截器
    springcloud——接口網關zuul

zuul網關現實

  • 搭建環境,項目依賴
<groupId>com.link</groupId>
    <artifactId>zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>zuul</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.link</groupId>
        <artifactId>springcloud01</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

           
  • 項目配置
server:
  port: 8884

spring:
  application:
    name: service-zuul

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/

# zuul路由分發,類似代理作用
# 以: /api-a/ 到 service-ribbon服務
# 例:http://localhost:8886/api-a/getUserList
#     ==> http://service-ribbon的位址/getUserList
zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: service-ribbon
    api-b:
      path: /api-b/**
      serviceId: service-feign

           
  • 配置網關過濾器
  • 網關攔截參數
@Component
public class MyFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);

    /**
     * 路由時過濾類型,分四種:
     *     pre:路由前
     *     routing:路由時
     *     post:路由後
     *     error:發送錯誤
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 過濾的順序
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否過濾請求:
     *      邏輯判斷,是否要過濾
     *      true: 過濾,執行過濾邏輯
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 過濾器的具體邏輯
     * 進行權限校驗:
     *      此處url不帶token将被攔截
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){

            }
            return null;
        }
        log.info("ok");
        return null;
    }
}


@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class ZuulApplication {}
           
  • 啟動服務

service-ribbon

service-feign

server-zuul

效果:

http://localhost:8884/api-a/getUserList ==> http://service-ribbon的位址/getUserList

http://localhost:8884/api-b/getUserList ==> http://service-feign的位址/getUserList

繼續閱讀