1. 程式人生 > >SpringCloud系列——Zuul 動態路由 SpringCloud系列——Ribbon 負載均衡 SpringCloud系列——Eureka 服務註冊與發現 SpringCloud系列——Ribbon 負載均衡

SpringCloud系列——Zuul 動態路由 SpringCloud系列——Ribbon 負載均衡 SpringCloud系列——Eureka 服務註冊與發現 SpringCloud系列——Ribbon 負載均衡

  前言

  Zuul 是在Spring Cloud Netflix平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架,是Netflix基於jvm的路由器和伺服器端負載均衡器,相當於是裝置和 Netflix 流應用的 Web 網站後端所有請求的前門。本文基於上篇(SpringCloud系列——Ribbon 負載均衡)實現Zuul動態路由

  GitHub地址:https://github.com/Netflix/zuul

  官方文件:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.RC2/single/spring-cloud-netflix.html#_router_and_filter_zuul

 

  程式碼編寫

  首先我們在springCloud下面新建一個springboot專案:zuul-server,pom繼承parent,並且在Eureka上面註冊(還不會服務註冊與發現的,請戳:SpringCloud系列——Eureka 服務註冊與發現

   maven引入Zuul

        <!-- Zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <
artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>

  配置檔案

server.port=10010
spring.application.name=zuul-server
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
#健康檢查(需要spring-boot-starter-actuator依賴)
eureka.client.healthcheck.enabled=true
# 續約更新時間間隔(預設30秒) eureka.instance.lease-renewal-interval-in-seconds=10 # 續約到期時間(預設90秒) eureka.instance.lease-expiration-duration-in-seconds=10 #zuul代理配置 zuul.routes.服務名.path,服務名要與註冊的一致 #應用名對映 zuul.routes.myspringboot.path=/myspringboot/** zuul.routes.myspringboot.service-id=myspringboot #URL對映 #zuul.routes.myspringboot.path=/myspringboot/** #zuul.routes.myspringboot-url.url=http://localhost:10087/

  自定義Zuul過濾器

  更多的檢查規則後續慢慢健全

/**
 * Zuul過濾器,實現了路由檢查
 */
public class AccessFilter extends ZuulFilter {

    /**
     * 通過int值來定義過濾器的執行順序
     */
    @Override
    public int filterOrder() {
        // PreDecoration之前執行
        return PRE_DECORATION_FILTER_ORDER - 1;
    }

    /**
     * 過濾器的型別,在zuul中定義了四種不同生命週期的過濾器型別:
     *     public static final String ERROR_TYPE = "error";
     *     public static final String POST_TYPE = "post";
     *     public static final String PRE_TYPE = "pre";
     *     public static final String ROUTE_TYPE = "route";
     */
    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    /**
     * 過濾器的具體邏輯
     */
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        System.out.println(String.format("%s AccessFilter request to %s", request.getMethod(),request.getRequestURL().toString()));
        String accessToken = request.getParameter("accessToken");
        //有許可權令牌
        if (!StringUtils.isEmpty(accessToken)) {
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            //可以設定一些值
            ctx.set("isSuccess", true);
            return null;
        } else {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody("{\"result\":\"accessToken is not correct!\"}");
            //可以設定一些值
            ctx.set("isSuccess", false);
            return null;
        }
    }

    /**
     * 返回一個boolean型別來判斷該過濾器是否要執行
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }
}

  啟動類

  新增@EnableZuulProxy註解並使用自定義過濾器

@EnableZuulProxy
@SpringBootApplication
public class ZuulServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServerApplication.class, args);
    }

    @Bean
    public AccessFilter accessFilter() {
        return new AccessFilter();
    }
}

 

   效果演示

  啟動所有專案,我們在Eureka上註冊了四個服務,相比上篇(SpringCloud系列——Ribbon 負載均衡)多了一個Zuul

 

  瀏覽器訪問 http://localhost:10010/myspringboot/feign/ribbon、http://localhost:10010/myspringboot/feign/ribbon?accessToken=123456

  http://localhost:10010/ 這個埠對外暴露,相對於總入口,後面接不同的路徑由,Zuul路由到對應的服務上

  1、沒有accessToken是,無法通過檢查

  2、攜帶accessToken時,可正常路由,並且Feign呼叫、Ribbon負載均衡

 

  後記

  我們為什麼要使用Zuul呢?

  1、請求校驗、路由轉發,介面校驗與業務邏輯分離

  2、隱藏諸多服務路徑,只暴露統一入口,安全

  更多Zuul配置,請看官方文件