SpringCloud系列——Zuul 動態路由


  前言

  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配置,請看官方文檔

 

  代碼開源

  代碼已經開源、托管到我的GitHub、碼雲:

  GitHub:https://github.com/huanzi-qch/springCloud

  碼雲:https://gitee.com/huanzi-qch/springCloud


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM