Spring Cloud 中怎么使用Gateway配置路由動態(tài),很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
創(chuàng)新互聯(lián)為客戶提供專業(yè)的網(wǎng)站設計、做網(wǎng)站、程序、域名、空間一條龍服務,提供基于WEB的系統(tǒng)開發(fā). 服務項目涵蓋了網(wǎng)頁設計、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、手機網(wǎng)站開發(fā)等網(wǎng)站方面業(yè)務。
Spring Cloud Gateway的配置由一系列的“ RouteDefinitionLocator”接口實現(xiàn)類控制,此接口如下所示:
public interface RouteDefinitionLocator { Flux<RouteDefinition> getRouteDefinitions(); }
默認情況下,通過Spring Boot的@ConfigurationProperties機制,Spring Cloud Gateway 使用PropertiesRouteDefinitionLocator從配置文件中加載路由的配置信息。之前的路由配置中,使用了一種快捷的配置方式,也可以指定具體的參數(shù)名,如下面的兩種配置方式效果是完全一樣的:
spring: cloud: gateway: routes: - id: setstatus_route uri: http://example.org filters: - name: SetStatus args: status: 401 - id: setstatusshortcut_route uri: http://example.org filters: - SetStatus=401
在一些網(wǎng)關的應用場景中,使用屬性配置的方式就可以了,但是在一些生產(chǎn)環(huán)境中,有一些路由配置信息可能是來自別的地方,比如數(shù)據(jù)庫。在將來的Spring Cloud Gateway版本中,也會添加一些基于數(shù)據(jù)庫的RouteDefinitionLocator實現(xiàn)類,比如redis,MongoDB。
在RouteLocatorBuilder中定義的一些 Fluent API,使用它可以在Java代碼中配置相關的路由信息,如下面代碼所示:
// static imports from GatewayFilters and RoutePredicates @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder, AddRequestHeaderGatewayFilterFactory throttle) { NameValueConfig requestHeader = new NameValueConfig(); requestHeader.setName("routes-a"); requestHeader.setValue("yes"); return builder.routes() .route(r -> r.host("localhost:8080").and().path("/routes-api/a/**") .filters(f ->{ f.addResponseHeader("X-TestHeader", "foobar"); return f.redirect(HttpStatus.MOVED_PERMANENTLY.value(), "http://www.xinyues.com"); }) .uri("http://localhost:8080").id("custom-1") ) .route(r -> r.path("/routes-api/b/**") .filters(f -> f.addResponseHeader("X-AnotherHeader", "baz")) .uri("http://localhost:8080").id("custom-2") ) .route(r -> r.order(0) .host("localhost:8080").and().path("/routes-api/c/**") .filters(f -> f.filter(throttle.apply(requestHeader))) .uri("http://localhost:8080").id("custom-3") ) .build(); }
這段代碼是我自己參考原文檔實現(xiàn)的,原文檔上面那個ThrottleGatewayFilterFactory找不到。這里我添加了自定義 的routes Id,可以從源碼中查看:https://gitee.com/wgslucky/SpringCloud,啟動源碼項目,在瀏覽器中輸入:http://localhost:8080/actuator/gateway/routes,可以看到網(wǎng)關加載的所有的路由信息,可以看到代碼中路由id為custom-x的路由信息,說明在Java添加的路由配置與在配置文件中添加的路由配置都被加載到了。如果瀏覽器安裝了Json插件更直觀一些。這是一個路由的配置Json數(shù)組。根據(jù)上面代碼中的路由配置,在瀏覽器中輸入:http://localhost:8080/routes-api/a/test,可以看到成功跳轉到了目標網(wǎng)站,說明路由配置成功了。 這種形式也可以添加一些自定義的Predicate判斷,在RouteDefinitionLocator中定義的Predicates可以使用邏輯and。使用Fluent Java Api,可以使用and(),or()和negate()操作Predicate類。例如上面代碼中的第一個路由就使用and()添加了兩個Predicate。
Spring Cloud Gateway可以使用服務發(fā)現(xiàn)客戶端接口DiscoveryClient,從服務注意中心獲取服務注冊信息,然后配置相應的路由。注意,需要在配置中添加如下配置開啟這個功能:
spring.cloud.gateway.discovery.locator.enabled=true
然后確保已引入DiscoveryClient的實現(xiàn)類的服務發(fā)現(xiàn)客戶端依賴,比如Eureka,Consul或Zookeeper。
默認情況下,通過服務發(fā)現(xiàn)客戶端DiscoveryClient自動配置的路由信息中,只包括一個默認的Predicate和Filter。默認的Predicate是一個Path Predicate,模式是 /serviceId/**
,serviceId就是從服務發(fā)現(xiàn)客戶端中獲取的服務ID。默認的Filter是一個重寫路徑過濾器,它的正則表達式為:/serviceId/(?<remaining>.*)
,它的作用是將請求路徑中的serviceId去掉,變?yōu)?code>/(?<remaining>.*),如果想要添加自定義的Predicate和Filters,可以這樣配置:spring.cloud.gateway.discovery.locator.predicates[x]
和spring.cloud.gateway.discovery.locator.filters[y]
,當使用這種配置方式時,不會再保留原來默認的Predicate和Filter了,如果你還需要原來的配置,需要手動添加到配置中,如下面所示: application.properties
spring.cloud.gateway.discovery.locator.predicates[0].name: Path spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]: "'/'+serviceId+'/**'" spring.cloud.gateway.discovery.locator.predicates[1].name: Host spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]: "'**.foo.com'" spring.cloud.gateway.discovery.locator.filters[0].name: Hystrix spring.cloud.gateway.discovery.locator.filters[0].args[name]: serviceId spring.cloud.gateway.discovery.locator.filters[1].name: RewritePath spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId + '/(?<remaining>.*)'" spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'"
application.yml
spring: cloud: gateway: discovery: locator: enabled: true predicates: - name: Path args: pattern: "'/'+serviceId+'/test'" filters: - name: RedirectTo args: status: 301 url: "'http://www.xinyues.com'"
需要注意的是,在這些配置中,所有的配置的值都是會被Spel解析的,所以如果是字符串的話,需要使用引號。比如,application.yml中,如果配置成這樣:url: http://www.xinyues.com
會報錯的,詳細見:https://www.cnblogs.com/wgslucky/p/11743740.html
application.yml
這種配置是保留原來的默認的Predicate和Filter
spring: cloud: gateway: discovery: locator: enabled: true predicates: - name: Path args: pattern: "'/'+serviceId+'/**'" filters: - name: AddRequestHeader args: name: "'foo'" value: "'bar'" - name: RewritePath args: regexp: "'/' + serviceId + '/(?<remaining>.*)'" replacement: "'/${remaining}'"
可以看到所有的字符串必須在引號的單引號內(nèi)。
手機支架懶人支架桌面ipad平板電腦創(chuàng)意便攜式支架多功能直播抖音拍照落地床頭直播車載折疊支撐架
到這里下載源碼:https://gitee.com/wgslucky/SpringCloud
修改application.yml,激活discoveryclient配置文件
spring: profiles: active: - discoveryclient
啟動spring-cloud-gateway項目
啟動spring-cloud-app-a項目
然后瀏覽器中輸入:http://localhost:8080/actuator/gateway/routes,可以看到已添加成功定義好到spring-cloud-app-a服務的路由信息了,如下所示: 可以看到里面有一個默認的filter和predicate。而且可以看出,在配置文件中配置的路由信息,java代碼中添加的路由配置信息,都加載到網(wǎng)關中,說明這三種配置路由信息的方式是可以一起使用的。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
網(wǎng)站欄目:SpringCloud中怎么使用Gateway配置路由動態(tài)
鏈接地址:http://m.newbst.com/article26/jegdcg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、移動網(wǎng)站建設、網(wǎng)站維護、微信公眾號、服務器托管、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)