gateway+nocas动态路由
创建一个新项目添加maven依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <dependencies> <!-- nacos 服务注册发现(客户端)依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- gateway 网关依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version> 1.2 . 47 </version> </dependency> </dependencies> |
bootstrap.properties
1 2 3 4 5 6 7 8 9 10 | #服务名称<br>spring.application.name=gateway-service<br>#nocas账号密、码、地址 spring.cloud.nacos.config.username=nacos spring.cloud.nacos.config.password=xxxxxxx spring.cloud.nacos.config.contextPath=/nacos spring.cloud.nacos.config.server-addr=xxxxxxx: 8848 spring.cloud.nacos.config.file-extension=yaml<br>#指定读取的配置 spring.cloud.nacos.config.extension-configs[ 0 ].data-id=gateway-route.yaml spring.cloud.nacos.config.extension-configs[ 0 ].group=DEFAULT_GROUP spring.cloud.nacos.config.extension-configs[ 0 ].refresh= true <br>#默认 public 其它空间填写namespace的Id spring.cloud.nacos.config.namespace=5436e42c-95f8-4bab- 9964 - 125268521248 |
新建DynamicRouteConfig 用于加载路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | @RefreshScope @Component public class DynamicRouteConfig implements ApplicationEventPublisherAware { private static Logger log= LoggerFactory.getLogger(DynamicRouteConfig. class ); @Value ( "${spring.cloud.nacos.config.data-id}" ) private String dataId; @Value ( "${spring.cloud.nacos.config.group}" ) private String group; @Value ( "${spring.cloud.nacos.config.server-addr}" ) private String serverAddr; @Value ( "${spring.cloud.nacos.config.namespace}" ) private String namespace; @Value ( "${spring.cloud.nacos.config.timeout}" ) private long timeout; @Autowired private RouteDefinitionWriter routeDefinitionWriter; @Autowired private ApplicationEventPublisher applicationEventPublisher; private static final List<String> ROUTE_LIST = new ArrayList<String>(); @PostConstruct public void dynamicRouteByNacosListener(){ try { Properties prop = new Properties(); prop.put( "serverAddr" , serverAddr); prop.put( "namespace" , namespace); ConfigService config = NacosFactory.createConfigService(prop); String content = config.getConfig(dataId, group, timeout); publisher(content); config.addListener(dataId, group, new Listener() { public void receiveConfigInfo(String config) { publisher(config); } public Executor getExecutor() { return null ; } }); } catch (Exception e){ log.error( "gateway动态路由加载失败," ,e); } } /** * 增加路由 * * @param def * @return */ public Boolean addRoute(RouteDefinition def) { try { routeDefinitionWriter.save(Mono.just(def)).subscribe(); ROUTE_LIST.add(def.getId()); } catch (Exception e) { e.printStackTrace(); } return true ; } /** * 删除路由 * * @return */ public Boolean clearRoute() { for (String id : ROUTE_LIST) { routeDefinitionWriter.delete(Mono.just(id)).subscribe(); } ROUTE_LIST.clear(); return Boolean.FALSE; } /** * 发布路由 */ private void publisher(String config) { clearRoute(); try { log.info( "Start updating dynamic routing ...." ); List<RouteDefinition> routeDefinitionList = JSONObject.parseArray(config, RouteDefinition. class ); for (RouteDefinition route : routeDefinitionList) { log.info(route.toString()); addRoute(route); } applicationEventPublisher.publishEvent( new RefreshRoutesEvent( this .routeDefinitionWriter)); log.info( "update completed " ); } catch (Exception e) { log.error( "Failed to update routing information" , e); e.printStackTrace(); } } public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { applicationEventPublisher = applicationEventPublisher; } } |
nocas配置中添加 gateway-route.yaml 配置,修改路由配置实时生效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | [ { "filters" : [ { "args" : { "parts" : "1" }, "name" : "StripPrefix" } ], "id" : "order_route" , "order" : - 1 , "predicates" : [ { "args" : { "pattern" : "/service-order/**" }, "name" : "Path" } ], "uri" : "lb://service-openfeign" }, { "filters" : [ { "args" : { "parts" : "1" }, "name" : "StripPrefix" } ], "id" : "stock_route" , "order" : 0 , "predicates" : [ { "args" : { "pattern" : "/service-stock/**" }, "name" : "Path" } ], "uri" : "lb://service-openfeign" } ] |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2018-08-01 手机号中间四位替换