期望结果:
yml依赖:
<dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-gatewayartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-validationartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-configartifactId><version>0.9.0.RELEASEversion>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId><version>0.9.0.RELEASEversion>dependency>dependencies>
注意:Hoxton.SR4这个版本是需要添加spring-boot-starter-validation的,不然会报错的。其他版本不清楚会不会
bootstrap.yml配置:
spring:application:name:gateway-nacoscloud:nacos:discovery:server-addr: 127.0.0.1:8848enabled:trueconfig:file-extension:yamlserver-addr: 127.0.0.1:8848server:port: 8080
java代码实现:
启动类:
@SpringBootApplication@EnableDiscoveryClient//开启服务注册publicclassNacosGatewayApp {publicstaticvoidmain(String[] args) { SpringApplication.run(NacosGatewayApp.class,args); } }
nacos动态路由实现类:
/** *@Author: gyc *@Date: 2020/12/4 16:18 */@ComponentpublicclassNacosRouteDefinitionRepositoryimplementsRouteDefinitionRepository ,ApplicationContextAware {@Autowiredprivate NacosConfigProperties nacosConfigProperties;private String dataId ="gatewayId";private String groupId ="gatewayGroup";public FluxgetRouteDefinitions() { List list =new ArrayList();try {//获取组名是gatewayGroup,dataId是gatewayId的配置。5000代表超时时间 String content = nacosConfigProperties.configServiceInstance().getConfig(dataId,groupId,5000); List tmpList = JSONObject.parseArray(content, RouteDefinition.class);if(tmpList !=null){ list = tmpList; } }catch (Exception e) { e.printStackTrace(); }return Flux.fromIterable(list); }public Monosave(Mono route) {returnnull; }public Monodelete(Mono routeId) {returnnull; }/** * 项目启动的时候会触发这个方法。 * 方法实现: 监听节点的变化,如果节点变化就发送RefreshRoutesEvent事件。 * gateway收到RefreshRoutesEvent事件的话,就会触发getRouteDefinitions方法了 *@param applicationContext *@throws BeansException */publicvoidsetApplicationContext(final ApplicationContext applicationContext)throws BeansException {try { nacosConfigProperties.configServiceInstance().addListener(dataId, groupId,new Listener() {public ExecutorgetExecutor() {returnnull; }publicvoidreceiveConfigInfo(String s) {//如果节点变化就发送RefreshRoutesEvent事件。 applicationContext.publishEvent(new RefreshRoutesEvent(this)); } }); }catch (NacosException e) { e.printStackTrace(); } } }
整体实现:
因为NacosRouteDefinitionRepository
实现了ApplicationContextAware
接口,所以项目启动的时候会触发setApplicationContext
方法。
setApplicationContext: 监听节点的变化,如果节点变化就发送RefreshRoutesEvent事件。
gateway收到RefreshRoutesEvent事件的话,就会触发getRouteDefinitions方法了(这里需要实现RouteDefinitionRepository接口,才会触发方法)
下面在下个图就是程序的走向。
yml的依赖:
<dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId><version>0.9.0.RELEASEversion>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency>dependencies>
application.yml配置文件:
server:port: 8061spring:application:name:nacos-clientcloud:nacos:discovery:register-enabled:trueserver-addr: 127.0.0.1:8848
代码实现:
/** *@author gyc *@date 2020/12/6 */@SpringBootApplication@EnableDiscoveryClientpublicclassNacosClientApp {publicstaticvoidmain(String[] args) { SpringApplication.run(NacosClientApp.class,args); } }
@RestController@RequestMappingpublicclassHelloController {@GetMapping("/sayHello")public StringsayHello(){return"sayHello"; } }
由上面的gateway的配置来看,我们是没有给gateway配置路由信息的。这时候我们是要通过nacos的统一的配置中心来做个配置。
注意: 我们这个是通过读取json的方式,来做解析的,这里断言和过滤器的的配置方式需要是使用Fully Expanded Arguments
可以看会我之前的有一篇叫做Spring Cloud Gateway入门demo博文里面的断言和过滤器配置方式章节,地址如下:
Spring Cloud Gateway入门demo - 大笨象会跳舞 - 博客园
新增一个配置信息:
配置内容如下:
[{"id":"first_route","predicates": [{"name":"Path","args": {"_genkey_0":"/first"} }],"filters": [{"name" :"StripPrefix","args":{"parts":"1"} }],"uri":"https://www.bilibili.com/","order": 0 }, {"id":"nacos-client","predicates": [{"name":"Path","args": {"_genkey_0":"/nacos/**"} }],"filters": [{"name" :"StripPrefix","args":{"parts":"1"} }],"uri":"lb://nacos-client","order": 0 } ]
这个配置包括两个路由的信息
通过输入http://127.0.0.1:8080/first,跳到哔哩哔哩主页。然后通过修改nacos的配置中心里面gateway的配置,使得再次输入地址,跳到百度主页
如果加载不出gif图请访问:登录 - Gitee.com
下一个:c++动态库与静态库
Lebanon Address 版权所有
Powered by WordPress