三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

1、Ribbon客戶端負載均衡1.1 依賴

三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.2 配置信息# feign默認加載了ribbon負載均衡,默認負載均衡機制是:輪詢# 負載均衡機制是添加在消費端(客戶端)的,如果改為隨機,指定服務名,指定規則edocmall-server:  ribbon:    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule1.3 測試1.3.0 測試準備1.3.0.1 復制一個服務端
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.3.0.2 eureka查看服務
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.3.0.3 查詢數據
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.3.1 默認是輪詢1.3.1.1 第一個服務端
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.3.1.2 第二個服務端
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.3.2 指定為隨機 后1.3.2.1 第一個服務端
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.3.2.2 第二個服務端
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
1.3.3 可以自定義 負載均衡規則(省略)2、Zuul網關2.1 模塊說明
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
2.2 主要依賴<!--   eureka 客戶端依賴     --><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-eureka</artifactId></dependency><!-- zuul 依賴 --><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-zuul</artifactId></dependency>2.3 配置信息# 端口server:  port: 8100# 服務名spring:  application:    name: edocmall-zuul# eureka 注冊中心的配置eureka:  client:    service-url:      defaultZone: http://127.0.0.1:8096/eureka  # 關閉自我保護機制,保證不可用的服務及時剔除  server:    enable-self-preservation: false# zuul 網關配置zuul:  ignored-services: '*'  # 默認情況下 , zuul網關服務會自動將eureka上的所有注冊服務名(serviceId)設置為默認路由地址(path),如果只能按照path配置路徑進行路由,必須手動屏蔽默認路由; *:表示所有的服務名不能作為路由地址,也可以指定具體服務名不能作為路由地址  routes:    edocmall-web-kgc: #默認路由的服務名,可以寫真實的服務名也可以自定義      #方式一#      path: /edocmall-web/**  # 指定自定義網關的映射路勁前綴,代理的請求,必須是指定的訪問路徑,才可以進入網關,否者無法進行網關映射處理#      url: http://127.0.0.1:8098 # 指定請求服務的真實地址(一定要確保可以進行訪問即地址有效) , 注意,無法進行集群處理,不利于維護和擴展      #方式二      path: /edocmall-zuul/** #指定自定義網關路徑 , 配合service使用,實現通過指定服務名進行接口調用      serviceId: edocmall-web  # 指定的是eureka注冊中心上,真實服務名,好處:(不需要維護請求地址)只需要指定服務名,自動根據服務名路由到對應的所有集群服務上    edocmall-server-kgc:      path: /edocmall-zuul2/**      serviceId: edocmall-server2.4 主啟動類上的注解@EnableEurekaClient@EnableZuulProxy //開啟網關代理功能2.5 測試2.5.1 不屏蔽默認路由serviceId: edocmall-web和path: /edocmall-zuul/**都可以訪問
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
2.5.2 屏蔽默認路由 ignored-services: '*'只有path: /edocmall-zuul/**都可以訪問【三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心】
三 SpringBoot - Ribbon客戶端負載均衡,Zuul網關,Config配置中心

文章插圖
2.6 自定義網關過濾器2.6.1 自定義網關過濾器//Description: 自定義網關過濾器@Componentpublic class AuthZuulFilter extends ZuulFilter {    @Override    public String filterType() {        //指定網關過濾器的類型,允許返回值只能是:pre,post,route,error        //pre : 在請求被路由轉發前調用,通常用于權限校驗,日志處理等        //post : 在請求被路由轉發后調用,一般都是收集服務調用信息        //route : 在請求被路由轉發是調用(服務被調用前),通常用戶在特定服務調用前增加參數處理        //error: 在請求被路由轉發過程中,出現異常是調用        return "pre";    }    @Override    public int filterOrder() {        //指定網關過濾器的優先級,允許值是int類型整數,值越小優先級越高        return 0;    }    @Override    public boolean shouldFilter() {        //指定網關過濾器是否需要執行自定義的業務邏輯處理,如果是false不執行,true執行,執行自定義業務邏輯處理 , 就是下面的run方法內的業務邏輯        return true;    }    @Override    public Object run() {        //自定義網關過濾器需要執行的業務邏輯處理        //模擬場景:當請求到達網關,網關接收請求進行請求映射處理,把必須要先校驗權限 ,         // 如果權限校驗失敗 , 不進行路由轉發 , 只有權限校驗成功,才可以路由轉發到真實服務上        //引入知識點:用戶在登錄狀態保持,一般是通過token令牌實現的,當用戶登錄成功,會返回一個token令牌給客戶端保存,        // 如果再次請求 , 自動攜帶改=該令牌 , 如果令牌有效 , 權限通過,否者登錄校驗失敗,不允許訪問        //為了方便演示,token變為請求參數,方便獲取(正常流程是后端登錄成功后返回給客戶端,且必須要保存在請求頭 , 方便攜帶),如果請求地址中沒有token參數,就不給訪問,如果有,可以訪問        RequestContext requestContext = RequestContext.getCurrentContext();        HttpServletRequest request = requestContext.getRequest();        //根據請求對象獲取請求參數        String token = request.getParameter("token");        // TOO 必須要校驗token的有效性        //權限校驗 , 如果token令牌是有效的,可以進行路由轉發,否者需要重新登陸        if(StringUtils.isBlank(token)){            //token失敗,權限校驗失敗,必須過濾調當前請求,不能進行路由轉發            requestContext.setSendZuulResponse(false);            //修改返回提示信息            requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());//            requestContext.setResponseBody(HttpStatus.FORBIDDEN.getReasonPhrase());            requestContext.setResponseBody("token令牌校驗失敗,請求非法 , 被攔截");            //設置響應的內容格式,防止中文亂碼            HttpServletResponse response = requestContext.getResponse();            response.setContentType("text/html;charset=utf-8");        }        //返回RequestContext 對象        return requestContext;    }}

推薦閱讀