1、gateway相關介紹
在微服務架構中,系統(tǒng)往往由多個微服務組成,而這些服務可能部署在不同機房、不同地區(qū)、不同域名下。這種情況下,客戶端(例如瀏覽器、手機、軟件工具等)想要直接請求這些服務,就需要知道它們具體的地址信息,例如 IP 地址、端口號等。這種客戶端直接請求服務的方式存在很多的復雜問題。如:需要維護大量的服務地址、存在跨域請求的問題、每個微服務需要獨立認證等。所以我們可以通過?API 網(wǎng)關(gateway)來解決這些問題。所有客戶端請求都發(fā)生到網(wǎng)關,由網(wǎng)關統(tǒng)一轉發(fā)到不同的地址。網(wǎng)關還可以?處理一些非業(yè)務功能的邏輯,例如權限驗證、監(jiān)控、緩存等。本篇主要講解通過網(wǎng)關統(tǒng)一請求轉發(fā)到不同微服務。
2、創(chuàng)建網(wǎng)關服務
首先創(chuàng)建maven項目新建網(wǎng)關模塊:
pom導入網(wǎng)關相關依賴:
<dependencies> <!--Eureka Client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--特別注意:在 gateway 網(wǎng)關服務中不能引入 spring-boot-starter-web 的依賴,否則會報錯--> <!-- Spring cloud gateway 網(wǎng)關依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
<!-- LoadBalancer -->
<!-- 引入spring-cloud-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--ribbon Spring Cloud Ribbon 在高版本移除了 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>-->
<!-- <version>2.2.5.RELEASE</version>-->
<!-- </dependency>-->
</dependencies>
創(chuàng)建springboot啟動類:
@SpringBootApplication @EnableEurekaClient public class GateWayApplication { public static void main(String[] args) { SpringApplication.run(GateWayApplication.class,args); } }
啟動類創(chuàng)建成功后,在resources資源目錄下創(chuàng)建application.yml文件,用來配置gateway。首先設置服務端口和服務名稱:
server: port: 8081 spring: application: name: gateway-server-one
在把網(wǎng)關注冊到注冊中心:
#客戶端注冊 eureka: instance: instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #localhost hostname: localhost client: register-with-eureka: true #是否向注冊中心注冊自己 默認為true fetch-registry: true #是否需要檢索服務 默認為true service-url: defaultZone: http://eternity:1234qwer@localhost:4405/eureka/
配置好之后,可以啟動網(wǎng)關。查看網(wǎng)關服務是否可以正常啟動以及是否在注冊中心注冊成功,如果注冊成功然后在開始配置網(wǎng)關參數(shù)。
可以看到服務啟動成功,我們看看注冊中心是否成功:
eureka中心已經(jīng)有了,說明啟動成功。
3、配置gateway路由
spring: application: name: gateway-server-one cloud: loadbalancer: ribbon: enabled: false #使用LoadBalancer, Ribbon 在高版本移除了 切換到ReactiveLoadBalancerClientFilter gateway: discovery: locator: #路由訪問方式:http://Gateway_HOST:Gateway_PORT/大寫的serviceId/**,其中微服務應用名默認大寫訪問。 enabled: true #開啟通過名稱找到服務器功能 lower-case-service-id: true #使用小寫service-id routes: - id: hibernate-server-one-route #路由的ID,沒有固定規(guī)則,但要求唯一,建議與服務名對應 uri: http://localhost:8800 #匹配后提供服務的路由地址 predicates: #以下是斷言條件,必選全部符合條件 - Path=/admin/user/** #斷言,路徑相匹配的進行路由 - Method=GET #只能時 GET 請求時,才能訪問 - id: xxl-job-server-one-route # uri: http://localhost:8801 #可以設置為服務名 uri: lb://XXL-JOB-SERVER-MODEL #可以設置為服務名 predicates: - Path=/admin/user/** #斷言,路徑相匹配的進行路由, 注意:Path 中 P 為大寫 - After=2022-06-06T03:29:37.318-07:00 # [Asia/Shanghai] # after來進行設置,后面添加一個時間,就是指在什么時間之后這個服務才可以被訪問,否則將無法被訪問到 # - After=2030-01-20T17:42:47.789-07:00 # [America/Denver]
配置成功后再次啟動網(wǎng)關,查看服務器是否轉發(fā)成功。
通過網(wǎng)關gateway請求路徑訪問查找用戶信息:
http://localhost:8081/admin/user/
通過postman測試接口,查詢成功。
4、gateway負載均衡
通過在配置文件中配置路徑的uri為注冊中心服務器名稱,可以實現(xiàn)gateway負載均衡。訪問時通過服務名稱去查找服務名下面的多個實例,根據(jù)配置的策略實現(xiàn)轉發(fā)到不同實例服務。
uri: lb://XXL-JOB-SERVER-MODEL #可以設置為服務名
在通過服務名稱轉發(fā)的過程中,有可能轉發(fā)失敗。報找不到服務,接口報錯:
查看網(wǎng)關控制臺發(fā)現(xiàn)也報錯:
java.net.UnknownHostException: failed to resolve 'xxl-job-server-model' after 4 queries at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final] Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): |_ checkpoint ? org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] |_ checkpoint ? HTTP POST "/admin/user/" [ExceptionHandlingWebHandler] Stack trace: at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final] at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:966) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final] at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:414) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
沒有找到服務名,剛開始以為是設置路由的服務名和注冊中心的服務名不一致。經(jīng)過查找發(fā)現(xiàn)是一致。最后查找發(fā)現(xiàn)是客戶端微服務注冊到注冊中心的hostname配置錯誤,需要配置和注冊中心一致的hostname。不然網(wǎng)關通過服務名找不到相關地址:
查看eureka服務注冊地址:
所以需要配置客戶端hostname:
hostname: localhost
再次重新運行系統(tǒng),發(fā)現(xiàn)報錯問題已經(jīng)解決。文章來源:http://www.zghlxwxcb.cn/news/detail-474499.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-474499.html
到了這里,關于spring cloud gateway網(wǎng)關(一)之網(wǎng)關路由的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!