<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 簡介 zuul的核心是一系列的過濾器,可以完成.核心功能是過濾和路由 * 身份認證與安全: 識別每個資源的驗證要求,并拒絕哪些與要求不符的請求 * 審查與監控: 在邊緣位置追蹤有意義的數據和統計結果,從而帶來精確的生產視圖 * 動態路由: 動態的將請求路由到不同的后端集群 * 壓力測試: 逐漸增加指向集群的流量,以了解性能 * 負載均衡: 為每一中負載類型分配對應容量,并棄用超出限定值的請求 * 靜態響應處理: 在邊緣位置直接建議部分響應,從而避免其轉發到內部集群 * 多區域彈性: 跨越AWS Region進行請求路由,實現ELB(Elastic Load Balancing)使用的多樣化,以及讓系統的邊緣更貼近系統的使用者 zuul目前默認使用的Http客戶端是Apache Http Client,也可以使用RestClient或者okHttp3.OKHttpClient. 如果想使用RestClient,可以設置`ribbon.restclient.enabled=true` 想要使用okhttp3.OkHttpClient,可以設置`ribbon.okhttp.enabled=true` ![](https://img.kancloud.cn/90/68/9068a73f00908f7dc79d14a6394f3843_922x496.png) # 創建項目 idea`->` `new module` ~~~ <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> ~~~ ~~~ @EnableZuulProxy @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } } ~~~ # 配置 ~~~ server: port: 10010 zuul: routes: hehe: path: /user-service/** url: http://0.0.0.0:8085/ ~~~ 這樣寫就是自己定義個規則 路徑是user-service為前綴的所有,轉發到`0.0.0.0:8085` **加入eureka** 加配置 ~~~ <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ~~~ ~~~ eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka zuul: routes: user-service: path: /user-service/** serviceId: user-service ~~~ 可以簡化成 前面是服務名 ~~~ zuul: routes: user-service: /user/** ~~~ **默認的路由規則** 比如服務名是 `user_service`, 默認映射路徑是 `user-service/**` 默認去eureka拉取,全部映射了 **禁用某個路由規則** ~~~ zuul: routes: user-service: /user/** ignored-services: - consumer-service ~~~ **路由前綴** 局部的 ~~~ zuul: routes: user-service: path: /user/** serviceId: user-service strip-prefix: false ~~~ 那這個url: [http://127.0.0.1:10010/user/user/1](http://127.0.0.1:10010/user/user/1) 就可以寫成 [http://127.0.0.1:10010/user/1](http://127.0.0.1:10010/user/1) 就是這個前綴不去除,直接轉發,那么重復的 user,就只寫一個就行 全局的,一般是用來去除全局的prefix, 對局部沒效果, 一般不用 ~~~ zuul: routes: user-service: /** strip-prefix: false prefix: /user # 配置前綴 ~~~ # 過濾器 zuul作為網關的一個重要功能, 就是實現請求鑒權. ## ZuulFilter 過濾器的頂級父類 ~~~ public abstract class ZuulFilter { abstract public String filterType(); // 過濾類型 abstract public int filterOrder(); //過濾順序 boolean shouldFilter(); // IZuulFilter, 要不要過濾 Object run() throw ZuulException; // IZuulFilter, //過濾邏輯 ~~~ * shouldFilter: 返回一個Boolean值,判斷該過濾器是否需要執行, 返回true執行 * run: 過濾器的具體業務邏輯 * filterType: 返回字符串,代表過濾類型,包含以下四種 - pre: 請求在被路由前執行 - routing: 在路由請求時調用 - post: 在routing和error過濾之后調用 - error: 處理請求時發生錯誤調用, 走完還會走post * filterOrder: 通過返回的int值來定義過濾器的執行順序,數字越小優先級越高 ![](https://img.kancloud.cn/e9/75/e975876a279b86208656a34a4aa937d1_1308x796.png) `custom filters`: 自定義過濾器,可以在任何生命周期 **正常流程:** 請求到達先經過pre類型的過濾器, 而后到達routing類型, 進行路由, 請求就到達真正的服務提供者,執行請求,返回結果, 會到達post過濾器, 而后返回響應 **異常流程:** * 整個過程中, pre或者routing 過濾器出現異常, 都會直接進入error過濾器, 再error處理完畢后, 會將請求交給 post 過濾器, 最后返回給用戶 * 如果是error過濾器自己出現異常, 最終也會進入post過濾器, 而后返回 * 如果是post過濾器出現異常,會跳轉到error過濾器, 但是與pre和routing不同的是, 請求不會再到達post過濾器了 ## 自定義攔截器 需要用到的工具包 ~~~ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> ~~~ ~~~ package com.jdxia.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component public class LoginFilter extends ZuulFilter { //前置 @Override public String filterType() { return FilterConstants.PRE_TYPE; } //執行順序,數字越小優先級越高 @Override public int filterOrder() { return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1; } //是否需要執行, 返回true執行 @Override public boolean shouldFilter() { return true; } //邏輯 http://127.0.0.1:10010/user/user/1?access-token=123 @Override public Object run() throws ZuulException { //獲取請求的上下文 Zuul包的 RequestContext ctx = RequestContext.getCurrentContext(); //獲取請求參數 HttpServletRequest request = ctx.getRequest(); //判斷是否存在 String token = request.getParameter("access-token"); //不存在, 未登入, 則攔截 StringUtils maven: org.apache.commons.lang3 if (StringUtils.isBlank(token)) { //攔截 ctx.setSendZuulResponse(false); //設置 返回403 ctx.setResponseStatusCode(HttpStatus.SC_FORBIDDEN); } return null; } } ~~~ # 負載均衡和熔斷 zuul中默認集成了Ribbon負載均衡和Hystix熔斷. 但是所有的超時策略都是走的默認值, 比如熔斷超時時間只有1s,很容易就觸發 建議手動配置 ~~~ hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 6000 ribbon: ConnectionTimeOut: 500 ReadTimeOut: 1000 MaxAutoRetriesNextServer: 0 # 不重試 ~~~ ribbon超時 = (read + connect) * (重試) ribbon超時不能大于hystrix的 # zuul高可用 **額外** `spring-cloud-config`: 消息配置中心,自動去git拉取最新的配置,緩存.使用git的webhook鉤子,去通知配置中心,說配置發生了變化,配置中心會通過消息總線去通知所有的微服務,更新配置 `spring-cloud-bus`: 消息總線 `spring-cloud-stream`: 消息總線 `spring-cloud-hystrix-dashboard`: 容錯統計, 形成圖形化界面 `spring-cloud-sleuth`: 鏈路追蹤,結合Zipkin
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看