1. 程式人生 > >SpringCloud系列——Ribbon 負載均衡

SpringCloud系列——Ribbon 負載均衡

  Zuul 是在Spring Cloud Netflix平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架,是Netflix基於jvm的路由器和伺服器端負載均衡器,相當於是裝置和 Netflix 流應用的 Web 網站後端所有請求的前門。本文基於上篇(SpringCloud系列——Ribbon 負載均衡)實現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(www.weilaiyule178.com) {
  
  return true;
  
  }
  
  }
  
  複製程式碼
  
  啟動類
  
  新增@EnableZuulProxy註解並使用自定義過濾器
  
  複製程式碼
  
  @EnableZuulProxy
  
  @SpringBootApplication
  
  public class yongshiyule178.com  ZuulServerApplication {
  
  public static void main(String[www.michenggw.com] args) {
  
  SpringApplication.run(ZuulServerApplication.class, args);
  
  }
  
  @Bean
  
  public AccessFilter accessFilter() {
  
  return new AccessFilter(www.yigouyule2.cn);
  
  }
  
  }
  
  複製程式碼
  
    效果演示
  
  啟動所有專案,我們在Eureka上註冊了四個服務,相比上篇(SpringCloud系列——Ribbon 負載均衡)多了一個Zuul
  
  這個埠對外暴露,相對於總入口,後面接不同的路徑由,Zuul路由到對應的服務上
  
  1、沒有accessToken是,無法通過檢查
  
  2、攜帶accessToken時,可正常路由,並且Feign呼叫、Ribbon負載均衡
  
  後記
  
  我們為什麼要使用Zuul呢?
  
  1、請求校驗、路由轉發,介面校驗與業務邏輯分離
  
  2、隱藏諸多服務路徑,只暴露統一入口,安全
  
  更多Zuul配置,請看官方文件