SpringCloud Gateway動(dòng)態(tài)路由配置詳解
路由
gateway最主要的作用是,提供統(tǒng)一的入口,路由,鑒權(quán),限流,熔斷;這里的路由就是請(qǐng)求的轉(zhuǎn)發(fā),根據(jù)設(shè)定好的某些條件,比如斷言,進(jìn)行轉(zhuǎn)發(fā)。
動(dòng)態(tài)
動(dòng)態(tài)的目的是讓程序更加可以在運(yùn)行的過(guò)程中兼容更多的業(yè)務(wù)場(chǎng)景。
涉及到兩個(gè)服務(wù),一個(gè)是門(mén)戶服務(wù)(作用是提供給運(yùn)營(yíng)人員管理入口--包括:管理路由、綁定路由),一個(gè)是網(wǎng)關(guān)服務(wù)(gateway組件,為門(mén)戶服務(wù)提供:查詢路由信息、添加路由、刪除路由、編輯路由接口)。
路由模型實(shí)體類
/** * 路由模型 * * @author 苦瓜不苦 * @date 2022/11/13 23:23 **/ @Data public class RouteDefinitionObject { /** * 路由的Id */ private String id; /** * 路由斷言集合配置 */ private List<PredicateDefinition> predicates; /** * 路由過(guò)濾器集合配置 */ private List<FilterDefinition> filters; /** * 路由規(guī)則轉(zhuǎn)發(fā)的目標(biāo)uri */ private String uri; /** * 路由執(zhí)行的順序 */ private Integer order = 0; @Data public static class PredicateDefinition { /** * 斷言對(duì)應(yīng)的Name */ private String name; /** * 配置的斷言規(guī)則 */ private Map<String, String> args; } @Data public static class FilterDefinition { /** * 斷言對(duì)應(yīng)的Name */ private String name; /** * 配置的斷言規(guī)則 */ private Map<String, String> args; } }
動(dòng)態(tài)路徑配置
/** * 動(dòng)態(tài)路由配置 * * @author 苦瓜不苦 * @date 2022/11/13 23:26 **/ @Slf4j @RestController @RequestMapping("/route") public class GatewayRouteConfig implements ApplicationEventPublisherAware { public final Map<String, RouteDefinitionObject> MAP = new ConcurrentHashMap<>(); private final RouteDefinitionWriter routeDefinitionWriter; private ApplicationEventPublisher applicationEventPublisher; public GatewayRouteConfig(RouteDefinitionWriter routeDefinitionWriter) { this.routeDefinitionWriter = routeDefinitionWriter; } @Override public void setApplicationEventPublisher(@NonNull ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } /** * 新增路由 * {"filters":[{"name":"StripPrefix","args":{"_genkey_0":"2"}}],"id":"item-system","uri":"lb://item-system","order":0,"predicates":[{"name":"Path","args":{"_genkey_0":"/api/system/**"}}]} */ @PostMapping("/save") public R<String> save(@RequestBody RouteDefinitionObject routeDefinitionObject) { try { // 路由模型轉(zhuǎn)換成路由對(duì)象 RouteDefinition definition = BeanUtil.toBean(routeDefinitionObject, RouteDefinition.class); URI uri = routeDefinitionObject.getUri().startsWith("http") ? UriComponentsBuilder.fromHttpUrl(routeDefinitionObject.getUri()).build().toUri() : URI.create(routeDefinitionObject.getUri()); definition.setUri(uri); // 新增 routeDefinitionWriter.save(Mono.just(definition)).subscribe(); applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this)); MAP.put(routeDefinitionObject.getId(), routeDefinitionObject); return R.success(); } catch (Exception e) { log.error("\n", e); } return R.failed(); } /** * 刪除路由 */ @GetMapping("/delete") public R<Mono<ResponseEntity<Object>>> delete(@RequestParam("id") String id) { try { Mono<ResponseEntity<Object>> responseEntityMono = routeDefinitionWriter.delete(Mono.just(id)) .then(Mono.defer(() -> Mono.just(ResponseEntity.ok().build()) )).onErrorResume((t) -> t instanceof NotFoundException , (t) -> Mono.just(ResponseEntity.notFound().build()) ); MAP.remove(id); return R.success(responseEntityMono); } catch (Exception e) { log.error("\n", e); } return R.failed(); } /** * 更新路由 * {"filters":[{"name":"StripPrefix","args":{"_genkey_0":"2"}}],"id":"item-system","uri":"lb://item-system","order":0,"predicates":[{"name":"Path","args":{"_genkey_0":"/api/system/**"}}]} */ @PostMapping("/update") public R<String> update(@RequestBody RouteDefinitionObject routeDefinitionObject) { try { // 刪除 delete(routeDefinitionObject.getId()); // 新增 save(routeDefinitionObject); return R.success(); } catch (Exception e) { log.error("\n", e); } return R.failed(); } /** * 查詢路由 */ @GetMapping("/list") public R<Collection<RouteDefinitionObject>> list() { return R.success(MAP.values()); } }
路由模型JSON數(shù)據(jù)
{ "filters":[ { "name":"StripPrefix", "args":{ "_genkey_0":"2" } } ], "id":"item-system", "uri":"lb://item-system", "order":0, "predicates":[ { "name":"Path", "args":{ "_genkey_0":"/api/system/**" } } ] }
以上就是SpringCloud Gateway動(dòng)態(tài)路由配置詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud Gateway動(dòng)態(tài)路由的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文告訴你為什么要重寫(xiě)hashCode()方法和equals()方法
本篇文章帶大家了解一下為什么重寫(xiě)hashCode()方法和equals()方法,文中有非常詳細(xì)的說(shuō)明以及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05java比較兩個(gè)json文件的差異及說(shuō)明
這篇文章主要介紹了java比較兩個(gè)json文件的差異及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x)
這篇文章主要介紹了intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08java開(kāi)發(fā)之鬧鐘的實(shí)現(xiàn)代碼
本篇文章介紹了,在java中鬧鐘的實(shí)現(xiàn)代碼。需要的朋友參考下2013-05-05Java volatile關(guān)鍵字原理剖析與實(shí)例講解
volatile是Java提供的一種輕量級(jí)的同步機(jī)制,Java?語(yǔ)言包含兩種內(nèi)在的同步機(jī)制:同步塊(或方法)和?volatile?變量,本文將詳細(xì)為大家總結(jié)Java volatile關(guān)鍵字,通過(guò)詳細(xì)的代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07MyBatis-Plus動(dòng)態(tài)表名的使用
本文主要介紹了MyBatis-Plus動(dòng)態(tài)表名的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04