亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

瀏覽:3日期:2023-09-03 10:56:27

簡介

該文檔主要介紹以Nacos為配置中心,實現(xiàn)Spring Cloud GateWay 實現(xiàn)動態(tài)路由的功能。Spring Cloud Gateway啟動時候,就將路由配置和規(guī)則加載到內(nèi)存里,無法做到不重啟網(wǎng)關(guān)就可以動態(tài)的對應(yīng)路由的配置和規(guī)則進行增加,修改和刪除。通過nacos的配置下發(fā)的功能可以實現(xiàn)在不重啟網(wǎng)關(guān)的情況下,實現(xiàn)動態(tài)路由。

集成

Spring Cloud GateWay集成

spring-cloud-starter-gateway:路由轉(zhuǎn)發(fā)、請求過濾(權(quán)限校驗、限流以及監(jiān)控等)

spring-boot-starter-webflux:反應(yīng)式Web框架

spring-boot-starter-actuator:監(jiān)控系統(tǒng)健康

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

Nacos集成

nacos-client:nacos客戶端,現(xiàn)在用比較新的版本0.9.0

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>0.9.0</version></dependency>

動態(tài)路由

DynamicRouteServiceImpl:提供動態(tài)路由的基礎(chǔ)方法,可通過獲取bean操作該類的方法。該類提供新增路由、更新路由、刪除路由,然后實現(xiàn)發(fā)布的功能。

@Servicepublic class DynamicRouteServiceImpl implements ApplicationEventPublisherAware { @Autowired private RouteDefinitionWriter routeDefinitionWriter; private ApplicationEventPublisher publisher; /** * 增加路由 * @param definition * @return */ public String add(RouteDefinition definition) { routeDefinitionWriter.save(Mono.just(definition)).subscribe(); this.publisher.publishEvent(new RefreshRoutesEvent(this)); return 'success'; } /** * 更新路由 * @param definition * @return */ public String update(RouteDefinition definition) { try { this.routeDefinitionWriter.delete(Mono.just(definition.getId())); } catch (Exception e) { return 'update fail,not find route routeId: '+definition.getId(); } try { routeDefinitionWriter.save(Mono.just(definition)).subscribe(); this.publisher.publishEvent(new RefreshRoutesEvent(this)); return 'success'; } catch (Exception e) { return 'update route fail'; } } /** * 刪除路由 * @param id * @return */ public String delete(String id) { try { this.routeDefinitionWriter.delete(Mono.just(id)); return 'delete success'; } catch (Exception e) { e.printStackTrace(); return 'delete fail'; } } @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.publisher = applicationEventPublisher; }}

RouteDefinition: 提供路由實體類,主要有predicates匹配來自用戶的請求,filters服務(wù)路由

@Validatedpublic class RouteDefinition {@NotEmptyprivate String id = UUID.randomUUID().toString();@NotEmpty@Validprivate List<PredicateDefinition> predicates = new ArrayList<>();@Validprivate List<FilterDefinition> filters = new ArrayList<>();@NotNullprivate URI uri;private int order = 0;public RouteDefinition() {}public RouteDefinition(String text) {int eqIdx = text.indexOf('=');if (eqIdx <= 0) {throw new ValidationException('Unable to parse RouteDefinition text ’' + text + '’' +', must be of the form name=value');}setId(text.substring(0, eqIdx));String[] args = tokenizeToStringArray(text.substring(eqIdx+1), ',');setUri(URI.create(args[0]));for (int i=1; i < args.length; i++) {this.predicates.add(new PredicateDefinition(args[i]));}}public String getId() {return id;}public void setId(String id) {this.id = id;}public List<PredicateDefinition> getPredicates() {return predicates;}public void setPredicates(List<PredicateDefinition> predicates) {this.predicates = predicates;}public List<FilterDefinition> getFilters() {return filters;}public void setFilters(List<FilterDefinition> filters) {this.filters = filters;}public URI getUri() {return uri;}public void setUri(URI uri) {this.uri = uri;}public int getOrder() {return order;}public void setOrder(int order) {this.order = order;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;RouteDefinition routeDefinition = (RouteDefinition) o;return Objects.equals(id, routeDefinition.id) &&Objects.equals(predicates, routeDefinition.predicates) &&Objects.equals(order, routeDefinition.order) &&Objects.equals(uri, routeDefinition.uri);}@Overridepublic int hashCode() {return Objects.hash(id, predicates, uri);}@Overridepublic String toString() {return 'RouteDefinition{' +'id=’' + id + ’’’ +', predicates=' + predicates +', filters=' + filters +', uri=' + uri +', order=' + order +’}’;}}

NacosGatewayProperties:自定義屬性綁定值,可通過配置文件配置屬性。

@ConfigurationProperties(prefix='nacos', ignoreUnknownFields = true)@Configurationpublic class NacosGatewayProperties {private String address;private String dataId;private String groupId;private Long timeout;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getDataId() {return dataId;}public void setDataId(String dataId) {this.dataId = dataId;}public String getGroupId() {return groupId;}public void setGroupId(String groupId) {this.groupId = groupId;}public Long getTimeout() {return timeout;}public void setTimeout(Long timeout) {this.timeout = timeout;}}

DynamicRouteServiceImplByNacos: 實現(xiàn)runner,通過nacos下發(fā)動態(tài)路由配置

@Componentpublic class DynamicRouteServiceImplByNacos implements CommandLineRunner{@Autowired private DynamicRouteServiceImpl dynamicRouteService;@Autowired private NacosGatewayProperties nacosGatewayProperties; /** * 監(jiān)聽Nacos Server下發(fā)的動態(tài)路由配置 * @param dataId * @param group */ public void dynamicRouteByNacosListener (){ try { ConfigService configService=NacosFactory.createConfigService(nacosGatewayProperties.getAddress()); String content = configService.getConfig(nacosGatewayProperties.getDataId(), nacosGatewayProperties.getGroupId(), nacosGatewayProperties.getTimeout()); System.out.println(content); configService.addListener(nacosGatewayProperties.getDataId(), nacosGatewayProperties.getGroupId(), new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {List<RouteDefinition> list = JsonUtils.toList(configInfo, RouteDefinition.class);list.forEach(definition->{dynamicRouteService.update(definition);});}@Overridepublic Executor getExecutor() { return null;} }); } catch (NacosException e) { e.printStackTrace(); } }@Overridepublic void run(String... args) throws Exception { dynamicRouteByNacosListener();} }

nacos配置下發(fā)

nacos配置

nacos: address: 127.0.0.1:8848 data-id: dhap-gateway # group-id: AAA timeout: 5000

nacos屬性文件定義

新建dataID為groupID為AAA

基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

[{'filters': [],'id': 'blog1','order': 0,'predicates': [{'args': {'pattern': '/z'},'name': 'Path'}],'uri': 'https://blog.csdn.net/zhangchangbin123'}, {'filters': [],'id': 'blog1','order': 0,'predicates': [{'args': {'pattern': '/c'},'name': 'Path'}],'uri': 'https://blog.csdn.net/zhangchangbin123'}]

查看路由信息

基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

到此這篇關(guān)于基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法的文章就介紹到這了,更多相關(guān)Spring Cloud Gateway動態(tài)路由內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 1314亚洲人成网站在线观看 | 亚洲第一视频区 | 国内小情侣一二三区在线视频 | 中日韩欧美在线观看 | 亚洲综合日韩精品欧美综合区 | 亚洲精品视频在线观看视频 | 97超精品视频在线观看 | 这里只有精品国产 | 免费看欧美一级特黄a大片一 | 国产精品真实对白精彩久久 | 中国人黑人xxⅹ性猛 | 亚洲无线乱码高清在线观看一区 | 99久久中文字幕伊人 | 中文字幕色综合久久 | 亚洲乱码视频在线观看 | 国产成人精品综合久久久软件 | 国产亚洲精品成人婷婷久久小说 | www.香蕉视频在线观看 | 久久这里只有精品2 | 91亚洲国产系列精品第56页 | 玖玖精品在线视频 | 日韩亚洲一区中文字幕 | 国产婷婷成人久久av免费高清 | 亚洲精品亚洲人成在线播放 | 免费无遮挡嘿嘿嘿视频动态 | 亚洲精品久久久久福利网站 | 奥田咲在线播放 | 国产精品免费观看视频播放 | 看黄色一级毛片 | 91亚洲精品久久 | 久久精品国产99久久6动漫欧 | 欧美黄色特级视频 | 国产日产欧美a级毛片 | 在线国产二区 | 一本一道波多野结衣一区二区 | 亚洲一区二区三区在线观看蜜桃 | 精品欧美一区二区三区免费观看 | 免费国产好深啊好涨好硬视频 | 免费视频精品一区二区三区 | 爱爱视频免费网站 | 久久一本日韩精品中文字幕屁孩 |