SpringGateway集成Nacos实现动态路由配置
通过Spring Gateway 集成Nacos实现配置管理,并且实现动态路由管理。
一、创建test-gateway项目,POM文件如下: 4.0.0 com.golte.parent golte-parent 1.0.0 com.golte.gateway golte-gateway 0.0.1-SNAPSHOT golte-gateway Gateway project for Spring Boot 1.8 Hoxton.SR8 2.2.3.RELEASE 1.2.73 org.springframework.cloud spring-cloud-starter-gateway com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-alibaba-sentinel-gateway org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine com.alibaba fastjson ${fastjson.version} org.springframework.cloud spring-cloud-dependencies ${spring.cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${alibaba.cloud.version} pom import test-gateway org.springframework.boot spring-boot-maven-plugin
二、创建项目配置文件bootstrap.ymlserver: port: 80 spring: profiles: active: dev application: name: test-gateway cloud: nacos: config: namespace: ${spring.profiles.active} server-addr: http://127.0.0.1:8848 extension-configs[0]: data-id: test_gateway_commons.yml group: DEFAULT_GROUP refresh: true #Nacos动态路由配置,json格式 nacos: gateway: route: config: data-id: gateway_dynamic_router group: DEFAULT_GROUP
a、test_gateway_commons.yml内容如下:#sentinel 相关配置 spring: cloud: sentinel: transport: dashboard: http://127.0.0.1:8080 port: 8719 scg: fallback: mode: response response-status: 455 response-body: error! nacos: discovery: namespace: dev server-addr: 127.0.0.1:8848 management: endpoints: web: exposure: include: "*"
三、创建网关配置类 GatewayConfig.javaimport org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Configuration public class GatewayConfig { public static final long DEFAULT_TIMEOUT = 30000; public static String NACOS_SERVER_ADDR; public static String NACOS_NAMESPACE; public static String NACOS_ROUTE_DATA_ID; public static String NACOS_ROUTE_GROUP; @Value("${spring.cloud.nacos.discovery.server-addr}") public void setNacosServerAddr(String nacosServerAddr) { NACOS_SERVER_ADDR = nacosServerAddr; } @Value("${spring.cloud.nacos.discovery.namespace}") public void setNacosNamespace(String nacosNamespace) { NACOS_NAMESPACE = nacosNamespace; } @Value("${nacos.gateway.route.config.data-id}") public void setNacosRouteDataId(String nacosRouteDataId) { NACOS_ROUTE_DATA_ID = nacosRouteDataId; } @Value("${nacos.gateway.route.config.group}") public void setNacosRouteGroup(String nacosRouteGroup) { NACOS_ROUTE_GROUP = nacosRouteGroup; } }
四、创建动态路由服务DynamicRouteServiceImpl.javaimport org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.event.RefreshRoutesEvent; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.cloud.gateway.route.RouteDefinitionWriter; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; /** * 动态更新路由网关service * 1)实现一个Spring提供的事宜推送接口ApplicationEventPublisherAware * 2)提供动态路由的基础方式,可通过获取bean操作该类的方式。该类提供新增路由、更新路由、删除路由,然后实现公布的功效。 */ @Slf4j @Service public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware { @Autowired private RouteDefinitionWriter routeDefinitionWriter; /** * 公布事宜 */ @Autowired private ApplicationEventPublisher publisher; @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.publisher = applicationEventPublisher; } /** * 删除路由 * @param id * @return */ public String delete(String id) { try { log.info("gateway delete route id {}",id); this.routeDefinitionWriter.delete(Mono.just(id)); return "delete success"; } catch (Exception e) { return "delete fail"; } } /** * 更新路由 * @param definition * @return */ public String update(RouteDefinition definition) { try { log.info("gateway update route {}",definition); 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 definition * @return */ public String add(RouteDefinition definition) { log.info("gateway add route {}",definition); routeDefinitionWriter.save(Mono.just(definition)).subscribe(); this.publisher.publishEvent(new RefreshRoutesEvent(this)); return "success"; } }
五、创建通过Nacos读取动态路由配置服务DynamicRouteServiceImplByNacos.javaimport java.util.List; import java.util.Properties; import java.util.concurrent.Executor; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; import com.alibaba.fastjson.JSON; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.exception.NacosException; import lombok.extern.slf4j.Slf4j; /** * * 通过nacos下发动态路由设置,监听Nacos中gateway-route设置 * */ @Component @Slf4j @DependsOn({ "gatewayConfig" }) // 依赖于gatewayConfig bean public class DynamicRouteServiceImplByNacos { @Autowired private DynamicRouteServiceImpl dynamicRouteService; private ConfigService configService; @PostConstruct public void init() { log.info("gateway route init..."); try { configService = initConfigService(); if (configService == null) { log.warn("initConfigService fail"); return; } String configInfo = configService.getConfig(GatewayConfig.NACOS_ROUTE_DATA_ID, GatewayConfig.NACOS_ROUTE_GROUP, GatewayConfig.DEFAULT_TIMEOUT); log.info("获取网关当前设置:r {}", configInfo); List definitionList = JSON.parseArray(configInfo, RouteDefinition.class); for (RouteDefinition definition : definitionList) { log.info("update route : {}", definition.toString()); dynamicRouteService.add(definition); } } catch (Exception e) { log.error("初始化网关路由时发生错误", e); } dynamicRouteByNacosListener(GatewayConfig.NACOS_ROUTE_DATA_ID, GatewayConfig.NACOS_ROUTE_GROUP); } /** * 监听Nacos下发的动态路由设置 * * @param dataId * @param group */ public void dynamicRouteByNacosListener(String dataId, String group) { try { configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { log.info("举行网关更新: r{}", configInfo); List definitionList = JSON.parseArray(configInfo, RouteDefinition.class); for (RouteDefinition definition : definitionList) { log.info("update route : {}", definition.toString()); dynamicRouteService.update(definition); } } @Override public Executor getExecutor() { log.info("getExecutor r"); return null; } }); } catch (NacosException e) { log.error("从nacos吸收动态路由设置失足!!!", e); } } /** * 初始化网关路由 nacos config * * @return */ private ConfigService initConfigService() { try { Properties properties = new Properties(); properties.setProperty("serverAddr", GatewayConfig.NACOS_SERVER_ADDR); properties.setProperty("namespace", GatewayConfig.NACOS_NAMESPACE); return configService = NacosFactory.createConfigService(properties); } catch (Exception e) { log.error("初始化网关路由时发生错误", e); return null; } } }
六、配置动态路由配置文件gateway_dynamic_router,内容如下:[{ "id": "user-admin-router", "order": 5, "predicates": [{ "args": { "pattern": "/useradmin/**" }, "name": "Path" }], "filters":[ { "name":"StripPrefix", "args":{"_genkey_0":1} } ], "uri": "lb://test-user-admin" },{ "id": "user-app-router", "order": 4, "predicates": [{ "args": { "pattern": "/users/**" }, "name": "Path" }], "filters":[ { "name":"StripPrefix", "args":{"_genkey_0":1} } ], "uri": "lb://test-user-app" }]
通过以上步骤就完成Spring Gateway 集成Nacos 实现动态路由配置功能。以后只要通过修改Nacos的配置文件就可以时间服务的动态上下线了。不需要再重启网关了。
奔驰转发杨笠视频遭网友抵制近日,梅赛德斯奔驰也陷入巨大争议中。10月14日,梅赛德斯奔驰官方微博联手VOGUE转发了一段全新长轴距C级车的广告视频,视频中是脱口秀演员杨笠一身正装被闪光灯包围着走在红毯上,被
弗利萨的儿子艾泽来地球复仇,超三悟天克斯直接被打断胳膊大家都知道弗利萨属于冰冻恶魔一族的,据说这个族群有个特点就是出生后冰冻睡眠会对战斗力有很大的影响。弗利萨大家都知道,出场时战斗力直接爆表,如果悟空没有变身超赛根本不是对手,而他出生
全球首例无人车撞死行人视频流出,Uber安全员全程在看手机?Uber无人驾驶汽车撞死人一直是这两天的热点,本来Uber的自动驾驶技术已经很不靠谱,人工干预的平均里程只有1。1公里。对比起无人驾驶的老大Waymo,简直是弱爆了。要知道Waym
口罩在磁共振检查中竟然也会伤人!警惕!又一起磁共振事故据韩国媒体KBS报道,韩国一名60岁男性患者在一次磁共振检查事故中丧生。事故的起因是携带氧气瓶进入检查室。当时,患者正躺在磁共振机器里,放在推车上的氧气瓶被推入检查室。这个氧气瓶高
酷相思,梦落枫玉杵馀丹,金刀剩彩,重染吴江孤树。几点朱铅,几度怨啼秋暮。忆旧梦,绿鬓轻凋诉新恨,绛唇微注。最堪怜,月拂渐霜,绣蓉一镜晚妆妒。千林摇落渐少,何事西风老色,争妍如许。二月残花,空识小
健澜科技ampampamp西湖论健医学影像机器人机智过人的背后在央视综合频道晚间黄金时段首播的机智过人各个项目正在紧锣密鼓地录制之中。这款由中国科学院和中央电视台共同打造的人工智能(AI)现象级节目,据信已筛选二十多个可代表AI最高水准的项目
realmeGT大师套娃版正式发布,颜值与实力并存7月21日下午2点,realme正式发布了realmeGT大师版和大师探索版。作为两款主打设计的手机,售价肯定不如之前的realme那么劲爆,但对喜欢设计和手感的用户来说,也是一个
魅族18正式发布,疯狂堆料的魅族值得买吗3月4日,魅族在珠海大剧院正式发布了魅族18系列,魅族有史以来最好的屏幕魅族有史以来最强的拍照魅族有史以来最贵的价格魅族18首先是魅族18,原以为会是魅族18系列的乞丐版,但魅族这
motoedges正式发布,全球首发骁龙870在很早之前,就有人说过想看一款处理器的定位,看它的首发机型就行了。无论是今年发布的小米11(4000价位),还是之前发布的红米Note9Pro(1500价位)或者是iQOOZ1(2
iQOO7正式发布,骁龙888120W超快闪充20210111,iQOO召开全感操控新品发布会,正式推出了全新5G性能旗舰iQOO7发布活动中,iQOO宣布与BMWMMotorsport延续全球顶级合作伙伴合作关系,继续共同传
1999起,全方位提升,K40系列正式发布和之前爆料的一样,这次的K40系列产品力十足。不仅全系搭载三星AMOLEDE4直屏,并且厚度颜值都得到了全面提升,话不多说,直接来看吧。红米K40首先是RedmiK40。作为K30