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