<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## **1. 概括簡介** > Cloud全家桶中有個很重要的組件就是網關,在1.x版本中都是采用Zuul網關;但是在2.x版本中,zuul的升級遲遲未更新,Spring Cloud最后自己研發了一個網關代替zuul, 那就是Spring Cloud GateWay ### **1.1 GateWay基本介紹** 網關在微服務系統架構的位置如下圖: ![](https://img.kancloud.cn/86/27/86275512b2c253f46edf93b053f4cdf8_1547x707.png) 以下是來自官網的翻譯: ![](https://img.kancloud.cn/54/34/543444a3a6ec7cb00efe0d8fd3fd98ad_1751x332.png) Spring Cloud GateWay 是基于WebFlux框架 ,使用Reactor模式, 而WebFlux框架底層使用的Netty,GateWay源碼架構: ![](https://img.kancloud.cn/fc/2d/fc2d8dc6c75fb0385af076c101e5ae4f_713x467.png) ### **1.2 GateWay作用** 1. 反向代理 2. 鑒權 3. 流量控制 4. 熔斷 5. 日志監控 … ### **1.3 微服務網關所處的位置** ![](https://img.kancloud.cn/ff/07/ff07118ec4362969c2c8962fd2e002d9_935x654.png) ### **1.4 zuul 和 gateway 各自特點和區別** ![](https://img.kancloud.cn/1f/a2/1fa299cac61df8b409ddd1d634f36144_1488x348.png) ### **1.5 SpringCloud GateWay 特征** ![](https://img.kancloud.cn/2e/d1/2ed13943090449030232b26d973b49a4_895x413.png) ### **1.6 GateWay三大核心概念** 1. **Route(路由)** 路由是構建網關的基本模塊,它**有ID**,**目標URI**,一系列的**斷言**過濾器組成,如果斷言為true則配備該路由,然后進行轉發。 2. **Predicate(斷言)** 類屬于正則匹配,匹配成功,就進行路由轉發。 3. **Filter(過濾)** Filter 指的是Spring框架中GatewayFilter的實例,使用過濾器,可以在請求前或者之后對請求進行修改,可以完成**api鑒權、限流、日志**等功能 ### **1.7 GateWay三大核心示意圖** ![](https://img.kancloud.cn/58/b0/58b05748563b818a6f99cf79f7efaac1_1737x625.png) ### 1.8 GateWay 工作流程 官網的工作流程圖: ![](https://img.kancloud.cn/7a/be/7abe78cfdd34aaeb072f2e509cf92856_595x747.png) ![](https://img.kancloud.cn/10/ae/10ae506f7d22a927abbacfb868fb6b84_1762x385.png) **GateWay核心邏輯:路由轉發 + 執行過濾器鏈** ## **2. GateWay入門配置** ### **2.1 創建gateway模塊** 1. 新建一個springboot模塊:springcloud-gateway9527 添加依賴 ``` <!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` 2. yml配置文件添加配置 ``` server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: # 路由集合 routes: - id: payment_routh #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名 uri: http://localhost:8003 #匹配后提供服務的路由地址 predicates: - Path=/payment/get/** # 斷言,路徑相匹配的進行路由 - id: payment_routh2 #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名 uri: http://localhost:8002 #匹配后提供服務的路由地址 predicates: - Path=/order/getPaymenttimeoutById/** # 斷言,路徑相匹配的進行路由 #- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #- Cookie=username,zzyy #- Header=X-Request-Id, \d+ # 請求頭要有X-Request-Id屬性并且值為整數的正則表達式 eureka: instance: hostname: cloud-gateway-service client: #服務提供者provider注冊進eureka服務列表內 service-url: register-with-eureka: true fetch-registry: true defaultZone: http://localhost:7001/eureka ``` 3. 主啟動類 ``` @EnableEurekaClient @SpringBootApplication public class SpringcloudGateway9527Application { ``` 啟動測試: 通過gateway網關 訪問 8003 端口的微服務成功 ![](https://img.kancloud.cn/51/98/5198e34b8df8231f7e82a25d5a4f5d10_676x156.png) ### **2.2 GateWay動態路由** * **通過微服務名實現動態路由** 默認情況下Gateway 會根據注冊中心注冊的服務列表,以注冊中心上的微服務名為路徑創建動態路由進行轉發,從而實現動態路由功能(能負載均衡) * 路由配置修改(負載均衡) * 需要修改YML配置文件 * 需要注意的是uri的協議為lb,表示啟用Gateway的負載均衡功能。 ``` lb://serviceName ``` gateway在微服務中自動為我們創建負載均衡uri,注意:注意添加`discovery.locator.enabled=true`表示開啟從注冊中心動態創建路由的功能,利用微服務名進行路由或者在主啟動類加上`@EnableDiscoveryClient `表示開啟服務注冊和發現 ``` @EnableDiscoveryClient @SpringBootApplication public class FyjmallGatewayApplication { ``` `uri: lb://cloud-payment-service` 表示匹配后提供服務的路由地址, cloud-payment-service是注冊中心上的微服務名 ``` spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #開啟從注冊中心動態創建路由的功能,利用微服務名進行路由 # 路由集合 routes: - id: payment_routh #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名 uri: lb://cloud-payment-service #匹配后提供服務的路由地址 # uri: http://localhost:8003 #匹配后提供服務的路由地址 predicates: - Path=/payment/get/** # 斷言,路徑相匹配的進行路由 - id: payment_routh2 #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名 uri: lb://cloud-payment-service #匹配后提供服務的路由地址 # uri: http://localhost:8002 #匹配后提供服務的路由地址 predicates: - Path=/order/getPaymenttimeoutById/** # 斷言,路徑相匹配的進行路由 ``` ### 2.3 路由先后順序 路由斷言匹配 是按照 配置的先后順序的,如果路由配置斷言匹配先匹配上,那么久進行路由,接下來的路由就不會走了 以上配置就能實現動態路由,實現負載均衡的功能 GateWay Predicate(斷言) 我們先看上面我們的配置,如下圖紅框總的predicate配置,表示對路徑進行配,如果路徑匹配成功就進行路由,匹配不成功就不進行路由,相當于進行的斷言判斷 ![](https://img.kancloud.cn/b7/63/b7632b064fbf381740102176f211cf7d_1058x549.png) 官網Predicate配置,官網地址: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#gateway-request-predicates-factories 1 官網配置截圖: ![](https://img.kancloud.cn/d3/6b/d36bc58488a49432ea80e04aa13a72b3_1747x850.png) **常用的 Route Predicate:** ![](https://img.kancloud.cn/22/2c/222ca2146c990def65b57aa3cd767c50_449x644.png) 對應的在yml配置: ![](https://img.kancloud.cn/55/24/5524a2e58cd6f52ca6750d0b21576dbc_699x176.png) 注意predicates: 下面可以配置多個斷言規則如下圖: ![](https://img.kancloud.cn/f8/b4/f8b4469d81410253e0fcb45babac5b78_889x107.png) 更多Predicate配置請參考官網 ## 3. GateWay 過濾器(Filter) 1. GateWay Filter 只能在業務邏輯之前,和業務邏輯之后 2. GateWay Filter 種類分為 單一的 GateWayFilter 和全局的 GlobalFilter ### 3.1 單一的 GateWayFilter 單一GateWay Filter配置如下截圖: ![](https://img.kancloud.cn/a8/26/a8262bbd004fe605821d13f41c0f312c_1639x364.png) ![](https://img.kancloud.cn/52/68/5268233221f969c44a2608b1f9af7f86_1136x526.png) 注意 AddRequestParameter 參數表示添加請求參數,還有許多這樣的參數配置,請參考官網。 ### 3.2 自定義全局過濾器 1. 自定義過濾器要實現2個接口,GlobalFilter,Ordered 2. 主要能夠實現全局日志記錄,統一網關鑒權等… 案例代碼: ``` @Component public class MyGlobalFilter implements GlobalFilter,Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String username = exchange.getRequest().getQueryParams().getFirst("username"); if (username == null) { exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } // 放行 return chain.filter(exchange); } // 表示排名 @Override public int getOrder() { return 0; } } ``` 測試: 請求帶有參數username,可以成功訪問 ![](https://img.kancloud.cn/a2/c4/a2c4fe55e7005ea295e542c2aa3f04f7_586x111.png) 請求沒有帶有參數username,無法訪問 ![](https://img.kancloud.cn/49/c2/49c289e771b7c818b9161ddffd601ca6_809x323.png) 或者參數 總結: 通過以上案例,我們可以自己定義全局GlobalFilter,對請求進行過濾,可以根據我們自己的定義的規則來過濾每一個請求 [https://www.jianshu.com/p/38d0657abb00](https://www.jianshu.com/p/38d0657abb00)
                  <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>

                              哎呀哎呀视频在线观看