博客
关于我
Nacos+Spring Cloud Gateway动态路由配置
阅读量:575 次
发布时间:2019-03-11

本文共 6614 字,大约阅读时间需要 22 分钟。

Nacos动态路由配置实践

Nacos环境准备

在开始之前,我们需要确保Nacos环境的配置正确。通过在Windows本地启动Nacos并登录控制台,我们可以创建一个命名空间dev,并在默认分组下创建gateway-router的数据ID。以下是Nacos的基本配置说明:

# Nacos配置中心配置建议在bootstrap.properties中配置spring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8ea

GatewayApplication类中,我们需要启用DiscoveryClient以确保连接到Nacos配置中心:

@SpringBootApplication@EnableDiscoveryClientpublic class GatewayApplication {    public static void main(String[] args) {        SpringApplication.run(GatewayApplication.class, args);    }}

项目构建

我们创建一个简单的Spring Boot多模块项目,推荐使用IntelliJ IDEA。项目结构如下:

父模块:nacos

com.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
${alibaba-nacos.version}
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
${alibaba-nacos.version}

子模块:gateway、nacos-consumer、nacos-provider

三个服务的端口分别为:

  • nacos-consumer: 6001
  • nacos-provider: 6002
  • gateway: 6003

测试动态路由配置

1. 初始化路由配置

GatewayConfig类中,我们从Nacos读取必要的配置:

@Configurationpublic 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;    }}

bootstrap.properties中,我们配置Nacos的相关参数:

spring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8eanacos.gateway.route.config.data-id=gateway-routernacos.gateway.route.config.group=DEFAULT_GROUP

2. 动态路由配置监听

我们实现了一个监听器,用于动态更新路由配置:

public class DynamicRouteServiceImplByNacos {    @Autowired    private DynamicRouteServiceImpl dynamicRouteService;    private ConfigService configService;    @PostConstruct    public void init() {        configService = initConfigService();        if (configService != null) {            String configInfo = configService.getConfig(                GatewayConfig.NACOS_ROUTE_DATA_ID,                GatewayConfig.NACOS_ROUTE_GROUP,                GatewayConfig.DEFAULT_TIMEOUT            );            List
definitionList = JSON.parseArray(configInfo, RouteDefinition.class); for (RouteDefinition definition : definitionList) { dynamicRouteService.add(definition); } dynamicRouteByNacosListener( GatewayConfig.NACOS_ROUTE_DATA_ID, GatewayConfig.NACOS_ROUTE_GROUP ); } } private ConfigService initConfigService() { Properties properties = new Properties(); properties.setProperty("serverAddr", GatewayConfig.NACOS_SERVER_ADDR); properties.setProperty("namespace", GatewayConfig.NACOS_NAMESPACE); return NacosFactory.createConfigService(properties); } public void dynamicRouteByNacosListener(String dataId, String group) { configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { List
definitionList = JSON.parseArray(configInfo, RouteDefinition.class); dynamicRouteService.updateList(definitionList); } @Override public Executor getExecutor() { return null; } }); }}

3. 动态路由更新

我们实现了路由的增删改操作,并通过发布事件通知路由更新:

public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware {    @Autowired    private RouteDefinitionWriter routeDefinitionWriter;    @Autowired    private RouteDefinitionLocator routeDefinitionLocator;    @Autowired    private ApplicationEventPublisher publisher;    @Override    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {        this.publisher = applicationEventPublisher;    }    public String delete(String id) {        try {            this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();            this.publisher.publishEvent(new RefreshRoutesEvent(this));            return "delete success";        } catch (Exception e) {            return "delete fail";        }    }    public String updateList(List
definitions) { try { List
routeDefinitionsExits = routeDefinitionLocator.getRouteDefinitions().buffer().blockFirst(); if (!CollectionUtils.isEmpty(routeDefinitionsExits)) { routeDefinitionsExits.forEach(routeDefinition -> delete(routeDefinition.getId())); } definitions.forEach(definition -> updateById(definition)); return "success"; } catch (Exception e) { return "update fail"; } } public String updateById(RouteDefinition definition) { try { routeDefinitionWriter.delete(Mono.just(definition.getId())); routeDefinitionWriter.save(Mono.just(definition)).subscribe(); this.publisher.publishEvent(new RefreshRoutesEvent(this)); return "success"; } catch (Exception e) { return "update fail, not find route routeId: " + definition.getId(); } } public String add(RouteDefinition definition) { try { routeDefinitionWriter.save(Mono.just(definition)).subscribe(); this.publisher.publishEvent(new RefreshRoutesEvent(this)); return "success"; } catch (Exception e) { return "add fail"; } }}

测试

1. 启动服务

分别启动gatewaynacos-consumernacos-provider三个服务,确保它们已经注册到Nacos中。

2. 访问网关服务

通过访问gateway服务的端口(6003),观察路由配置是否正确加载。可以通过Nacos控制台监听路由配置的变化,确保gateway-router配置正确更新。

3. 调用服务

通过访问/consume/sayHello/{name}/provide/sayHello/{name},确保路由正确转发到nacos-consumernacos-provider服务。

总结

Spring Cloud Gateway是实现微服务架构中动态路由配置的理想选择。Nacos作为配置中心,支持动态获取配置文件,适用于一些全局配置的管理。通过以上实现,我们展示了如何在Nacos环境下动态配置和管理路由。

转载地址:http://nhsvz.baihongyu.com/

你可能感兴趣的文章
Objective-C实现Knapsack problem背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>
Objective-C实现knight tour骑士之旅算法(附完整源码)
查看>>
Objective-C实现knight Tour骑士之旅算法(附完整源码)
查看>>
Objective-C实现KnightTour骑士巡回赛问题算法(附完整源码)
查看>>
Objective-C实现KNN算法(附完整源码)
查看>>
Objective-C实现KNN算法(附完整源码)
查看>>
Objective-C实现KNN算法(附完整源码)
查看>>
Objective-C实现knuth morris pratt(KMP)算法(附完整源码)
查看>>
Objective-C实现knuth-morris-pratt(KMP)算法(附完整源码)
查看>>
Objective-C实现Koch snowflake科赫雪花曲线算法(附完整源码)
查看>>
Objective-C实现koch snowflake科赫雪花算法(附完整源码)
查看>>
Objective-C实现KPCA(附完整源码)
查看>>
Objective-C实现KruskalMST最小生成树的算法(附完整源码)
查看>>
Objective-C实现kruskal克鲁斯卡尔算法(附完整源码)
查看>>
Objective-C实现kth order statistick阶统计量算法(附完整源码)
查看>>
Objective-C实现lamberts ellipsoidal distance朗伯椭球距离算法(附完整源码)
查看>>
Objective-C实现largest AdjacentNumber最大相邻数算法 (附完整源码)
查看>>
Objective-C实现largest subarray sum最大子数组和算法(附完整源码)
查看>>