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