摘要:單服務我們簡單編寫一個請求地址,輸出字符串信息,添加依賴如下所示配置文件如下所示服務名注冊到服務端口號配置該服務的服務名稱為,這里對應的。
在上一篇文章Spring Cloud GateWay 路由轉發規則介紹中我們講解了SpringCloud Gateway內部提供的斷言、謂語,讓我們可以組合更精確的業務場景進行請求,既然SpringCloud GateWay擔任了網關的角色,在之前Zuul可以通過服務名進行自動轉發,SpringCloud Gateway是否可以實現自動轉發呢?
初始化Gateway服務Spring Cloud Gateway可以根據配置的斷言、謂語進行滿足條件轉發,也可以自動同步服務注冊中心的服務列表進行指定serviceId前綴進行轉發,這里的serviceId是業務服務的spring.application.name配置參數。
SpringCloud 版本控制依賴把SpringCloud的版本依賴添加到pom.xml內,如下所示:
//...1.8 Greenwich.SR1 //... org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
我們本章使用Eureka作為服務注冊中心來完成服務請求轉發講解,需要把Spring Cloud Gateway網關項目作為一個Client注冊到Eureka Server,先來看下添加的依賴,pom.xml如下所示:
//...//.... org.springframework.cloud spring-cloud-starter-gateway org.springframework.cloud spring-cloud-starter-netflix-eureka-client
接下來我們需要開啟Gateway服務注冊中心的發現配置,開啟后才能自動同步服務注冊中心的服務列表,application.yml配置文件如下所示:
# 服務名稱 spring: application: name: spring-cloud-gateway # 開啟 Gateway 服務注冊中心服務發現 cloud: gateway: discovery: locator: enabled: true # Eureka Server 配置 eureka: client: service-url: defaultZone: http://localhost:10000/eureka/ # 配置Gateway日志等級,輸出轉發細節信息 logging: level: org.springframework.cloud.gateway: debug
配置參數解釋如下所示:
spring.application.name:服務名
spring.cloud.gateway.discovery.locator.enabled:開啟SpringCloud Gateway的注冊中心發現配置,開啟后可自動從服務注冊中心拉取服務列表,通過各個服務的spring.application.name作為前綴進行轉發,該配置默認為false。
eureka.client.service-url.defaultZone:配置Eureka Server默認的空間地址
logging.level.org.springframework.cloud.gateway:設置SpringCloud Gateway日志等級為debug,用于輸出轉發的細節日志,方便查看細節流程。
注冊網關到Eureka在入口類添加對應的注解,開啟服務自動注冊,如下所示:
@SpringBootApplication @EnableDiscoveryClient public class SpringCloudGatewayApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudGatewayApplication.class, args); } }服務注冊中心
對應上面網關配置的Eureka Server的地址,我們需要添加對應的配置,pom.xml如下所示:
//...//... org.springframework.cloud spring-cloud-starter-netflix-eureka-server
添加依賴后對Eureka Server進行配置,配置文件application.yml如下所示:
# 服務名 spring: application: name: sample-eureka-server # 端口號 server: port: 10000 # Eureka 配置信息 eureka: client: service-url: defaultZone: http://localhost:${server.port}/eureka/ fetch-registry: false register-with-eureka: false
這里我們修改默認的端口號為10000,為了匹配在網關項目的配置信息,至于fetch-registry、register-with-eureka可以去我之前的文章查看,SpringCloud組件:將服務提供者注冊到Eureka集群
開啟Eureka Server我們通過@EnableEurekaServer注解來開啟服務,如下所示:
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
網關、服務注冊中心我們都已經準備好了,下面我們可以編寫業務邏輯服務,來驗證SpringCloud Gateway具體是否可以根據serviceId進行轉發請求。單服務
我們簡單編寫一個GET請求地址,輸出字符串信息,pom.xml添加依賴如下所示:
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-eureka-client
配置文件application.yml如下所示:
# 服務名 spring: application: name: user-service # 注冊到Eureka eureka: client: service-url: defaultZone: http://localhost:10000/eureka/ # 服務端口號 server: port: 9090
配置該服務的服務名稱為user-service,這里對應SpringCloud Gateway的serviceId。
注冊服務到Eureka@SpringBootApplication @EnableDiscoveryClient @RestController public class UserServiceApplication { /** * logger instance */ static Logger logger = LoggerFactory.getLogger(UserServiceApplication.class); public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); logger.info("「「「「「用戶服務啟動完成.」」」」」"); } @GetMapping(value = "/index") public String index() { return "this is user index"; } }
user-service提供了/index的請求地址,當訪問時,會對應輸出this is user index。
測試服務請求轉發接下來我們進行驗證,測試順序如下所示:
第一步:啟動Eureka Server
第二步:啟動SpringCloud Gateway
啟動成功后控制臺會打印響應的注冊到Eureka的日志信息,如下所示:
DiscoveryClient_SPRING-CLOUD-GATEWAY/192.168.1.56:spring-cloud-gateway: registering service... Netty started on port(s): 8080
SpringCloud Gateway內部通過Netty完成WebServer的請求轉發。
第三步:啟動user-service服務
啟動成功后控制臺打印相應注冊日志,如下所示:
DiscoveryClient_USER-SERVICE/192.168.1.56:user-service:9090: registering service... Tomcat started on port(s): 9090 (http) with context path ""
第四步:測試訪問
SpringCloud Gateway會每間隔30秒進行重新拉取服務列表后路由重定義操作,日志信息如下所示:
# Spring Cloud Gateway RouteDefinition CompositeDiscoveryClient_SPRING-CLOUD-GATEWAY applying {pattern=/SPRING-CLOUD-GATEWAY/**} to Path RouteDefinition CompositeDiscoveryClient_SPRING-CLOUD-GATEWAY applying filter {regexp=/SPRING-CLOUD-GATEWAY/(?.*), replacement=/${remaining}} to RewritePath RouteDefinition matched: CompositeDiscoveryClient_SPRING-CLOUD-GATEWAY # User Service RouteDefinition CompositeDiscoveryClient_USER-SERVICE applying {pattern=/USER-SERVICE/**} to Path RouteDefinition CompositeDiscoveryClient_USER-SERVICE applying filter {regexp=/USER-SERVICE/(? .*), replacement=/${remaining}} to RewritePath RouteDefinition matched: CompositeDiscoveryClient_USER-SERVICE
通過上面的日志信息我們已經可以推斷出SpringCloud Gateway映射spring.application.name的值作為服務路徑前綴,不過是大寫的,預計我們可以通過http://localhost:8080/USER-SERVICE/index訪問到對應的信息。
訪問測試如下:
~ curl http://localhost:8080/USER-SERVICE/index this is user index
通過網關訪問具體服務的格式:http://網關IP:網關端口號/serviceId/**
多服務的負載均衡如果Eureka Server上有兩個相同serviceId的服務時,SpringCloud Gateway會自動完成負載均衡。
復制一個user-service服務實例,修改服務端口號,如下所示:
# 服務名稱 spring: application: name: user-service # Eureka Server eureka: client: service-url: defaultZone: http://localhost:10000/eureka/ # 服務端口號 server: port: 9091
在復制的項目內使用相同的spring.application.name保持serviceId一致,只做端口號的修改,為了區分GateWay完成了負載均衡,我們修改/index請求的返回內容如下所示:
@GetMapping(value = "/index") public String index() { return "this is user lb index"; }
訪問http://localhost:8080/USER-SERVICE/index,輸出內容如下所示:
this is user lb index this is user index this is user lb index this is user index ...總結
通過本章的講解,我們已經對SpringCloud Gateway的轉發有一個簡單的理解,通過從服務注冊中心拉取服務列表后,自動根據serviceId映射路徑前綴,同名服務多實例時會自動實現負載均衡。
源碼位置Gitee:https://gitee.com/hengboy/spr...
ApiBoot:https://gitee.com/hengboy/api...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74415.html
摘要:本篇介紹并集成是一個服務器,也可以說是進入系統的唯一節點。它還可能有其他功能,如授權監控負載均衡緩存請求分片和管理靜態響應處理等。負責請求轉發合成和協議轉換。它可以在協議與內部使用的非友好型協議間進行轉換,如協議協議。 ????????本篇介紹并集成ZUUL API getaway:API Gateway是一個服務器,也可以說是進入系統的唯一節點。這跟面向對象設計模式中的Facade模...
摘要:是一個相對比較新的微服務框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統解決方案。提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務框架,...
摘要:授權框架使第三方應用程序來獲取對服務的有限訪問機會。無論是通過編排資源所有者和服務之間的交互批準的資源所有者,或通過允許第三方應用程序來獲取自己的訪問權限。 SpringCloud打造微服務平臺--概覽 簡述 SpringCloud是什么 Spring Boot和SpringCloud是什么關系 Spring Boot是Spring的一套快速WEB開發的腳手架,可建立獨立的Sprin...
閱讀 2975·2021-11-16 11:51
閱讀 2608·2021-09-22 15:02
閱讀 3723·2021-08-04 10:21
閱讀 3605·2019-08-30 15:43
閱讀 1947·2019-08-30 11:04
閱讀 3599·2019-08-29 17:14
閱讀 490·2019-08-29 12:16
閱讀 2933·2019-08-28 18:31