我的微服務學習筆記系列目錄:https://www.cnblogs.com/mrxiaobai-wen/p/14278656.html
在前面簡單的了解了一下注冊中心Nacos的使用(https://www.cnblogs.com/mrxiaobai-wen/p/14304495.html),然后這兩天上手了一下Spring Cloud Gateway,在這里做一個總結。
微服務網關簡介
-
什么是網關:顧名思義,它就是一個關口,所有想要進入到我們系統的請求都首先要經過這個關口才行。
-
為什么需要網關:比如我在前面上手Nacos的時候,創建了兩個服務,分別是nacos-server-spring-cloud和nacos-consumer-spring-cloud,兩個不同的服務,不同的端口,不同的地址。那么我在訪問這兩個服務的時候要分別記錄兩個地址訪問兩個不同的服務。但是這個系統是有機聯系的,它們一起組成了一套系統。那么有沒有什么方式可以讓我只請求一個地方就能獲取到我所需要的所有內容呢?那么這里就可以使用上網關。
我們所有的請求都請求到網關上,至於轉到哪一類服務上,轉到哪一類服務的哪個實例上,完全由網關自己去判斷。
如下圖,用戶請求某個服務,微服務系統內部服務之間相互依賴:
graph LR 用戶1[用戶1] --> 網關[網關] 用戶2[用戶2] --> 網關[網關] 網關[網關] --> 服務一[服務一] 網關[網關] --> 服務二[服務二] 網關[網關] --> 服務三[服務三] 服務一[服務一] --> 服務二[服務二] 服務三[服務三] --> 服務二[服務二]這樣,我們就能夠屏蔽微服務內部的結構,對外提供一個統一的入口,而外部也不用關注微服務系統內部的結構。
-
網關能做什么:
- 負載均衡
- 限流降級
- 授權認證
- 日志記錄
列出的是幾個常見的使用場景。
-
常見微服務網關:
Spring Cloud Gateway介紹
Spring Cloud的一個子項目,其設計如圖:

它有三個組件:
-
路由(Route):一組斷言與一組過濾器的集合,是網關的基本組件。
-
斷言(Predicate):是否匹配路由的判斷條件。
-
過濾器(Filter):對請求的處理邏輯,比如校驗、鑒權、日志記錄等等。
整體邏輯就是:請求進入到網關后,首先根據路由配置中的斷言匹配handler,然后執行filter鏈。
Spring Cloud Gateway使用
-
首先引入必要依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies>根據我們下面的配置文件,我們使用到了注冊中心,所以在這里還要引入nacos的依賴。
-
創建配置文件application.yml
spring: application: name: spring-cloud-geteway cloud: gateway: discovery: locator: enabled: true lower-case-service-id: true routes: - id: nacos-server-spring-cloud uri: lb://nacos-server-spring-cloud predicates: - Path=/nacos-server-spring-cloud/** filters: - StripPrefix= 1 - id: nacos-consumer-spring-cloud uri: lb://nacos-consumer-spring-cloud predicates: - Path=/nacos-consumer-spring-cloud/** filters: - StripPrefix= 1注冊中心配置bootstrap.yml
spring: application: name: spring-cloud-geteway cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 file-extension: yaml #指定yaml格式的配置 encode: UTF-8其中routes就是配置路由列表,這里使用了之前用到的nacos-server-spring-cloud和nacos-consumer-spring-cloud兩個服務。
predicates: - Path=/nacos-server-spring-cloud/**則是標識匹配以nacos-server-spring-cloud開頭的請求。
在filters中只用到了一個
- StripPrefix= 1表示網關將請求轉發到下游服務之前從請求中剝離的路徑個數,這里配置了1,那么表示會將前面的nacos-server-spring-cloud路徑去掉,然后再按照相應的地址進行轉發。
-
配置主類
@SpringBootApplication @EnableDiscoveryClient public class SpringCloudGatewayApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudGatewayApplication.class, args); } }
上面的准備工作做完后,啟動網關、server、consumer、nacos服務,然后請求網關即可轉發到對應的微服務上了。
代碼完整地址:
