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è)是門戶服務(wù)(作用是提供給運(yùn)營(yíng)人員管理入口--包括:管理路由、綁定路由),一個(gè)是網(wǎng)關(guān)服務(wù)(gateway組件,為門戶服務(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)文章
一文告訴你為什么要重寫hashCode()方法和equals()方法
本篇文章帶大家了解一下為什么重寫hashCode()方法和equals()方法,文中有非常詳細(xì)的說(shuō)明以及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
java比較兩個(gè)json文件的差異及說(shuō)明
這篇文章主要介紹了java比較兩個(gè)json文件的差異及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
intellij 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-08
java開(kāi)發(fā)之鬧鐘的實(shí)現(xiàn)代碼
本篇文章介紹了,在java中鬧鐘的實(shí)現(xiàn)代碼。需要的朋友參考下2013-05-05
Java 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-07
MyBatis-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

