nacos|nacos gateway动态路由实战

目录

  • nacos gateway动态路由
    • 一、引入本次测试需要的pom依赖
    • 二、配置文件设置(*配置文件不生效的把名字改为bootstrap.yml)
    • 三、动态路由实现
    • 四、nacos配置中心设置
    • 五、测试
  • gateway网关相关配置
    • 在启动类中添加注解@EeableDiscoveryClient
    • 配置nacos注册中心地址
    • bootstrap.properties 填写配置中心地址
    • nacos里创建命名空间gateway
    • 在主类中屏蔽数据源
    • 在项目里创建application.yml

nacos gateway动态路由 说明:本次测试使用的gateway是2.2.2.RELEASE版本,其他版本可能存在不同

一、引入本次测试需要的pom依赖
org.springframework.cloudspring-cloud-starter-gatewaycom.alibaba.cloudspring-cloud-starter-alibaba-nacos-configcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoverycom.alibabafastjson1.2.47


二、配置文件设置(*配置文件不生效的把名字改为bootstrap.yml)
server:port: 8200 spring:application:name: lc-gateway cloud:nacos:discovery:#注册中心地址server-addr: 106.12.146.239:8848config:server-addr: 106.12.146.239:8848# 配置中心-指定命名空间namespace: bb79a8c4-e4e1-4a27-bceb-0810f278b5aa# 指定配置文件后缀file-extension: yaml#配置组group: DEFAULT_GROUP#配置dateIddata-id: lc-gateway#获取配置超时时间timeout: 5000 gateway:#设置超时时间默认httpclient:connect-timeout: 1000response-timeout: 5s

ps:这里集成了nacos配置中心想了解详情请移步spring cloud集成nacos配置中心

三、动态路由实现
package com.lc.api.gateway.config; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; 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 reactor.core.publisher.Mono; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.concurrent.Executor; /** * 动态路由,可以通过获取Bean才做该类,提供增删改查已经发布功能 * * @Author: lc * @Date: 2020/7/8 15:49 */@Servicepublic class DynamicRouteConfig implements ApplicationEventPublisherAware { private static final Logger logger = LoggerFactory.getLogger(DynamicRouteConfig.class); @Autowiredprivate RouteDefinitionWriter routedefinitionWriter; private ApplicationEventPublisher publisher; @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; private static final List ROUTE_LIST = new ArrayList<>(); @PostConstructpublic 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() {@Overridepublic void receiveConfigInfo(String config) {publisher(config); } @Overridepublic Executor getExecutor() {return null; }}); } catch (Exception e) {e.printStackTrace(); }} /*** 增加路由** @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 {logger.info("Start updating dynamic routing ...."); List routeDefinitionList = JSONObject.parseArray(config, RouteDefinition.class); for (RouteDefinition route : routeDefinitionList) {logger.info(route.toString()); addRoute(route); }publisher.publishEvent(new RefreshRoutesEvent(this.routedefinitionWriter)); logger.info("update completed "); } catch (Exception e) {logger.error("Failed to update routing information", e); e.printStackTrace(); } } @Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {publisher = applicationEventPublisher; } }


四、nacos配置中心设置
1.说明
nacos|nacos gateway动态路由实战
文章图片

2.新建一个网关配置
nacos|nacos gateway动态路由实战
文章图片

3. 添加配置格式如下
nacos|nacos gateway动态路由实战
文章图片

这里我就不注释了大家应该都能看懂
[{"filters": [{"args": {"parts": "1"},"name": "StripPrefix"}],"id": "authent1","order": -1,"predicates": [{"args": {"pattern": "/authent/**"},"name": "Path"}],"uri": "lb://lc-authenticate"}]


五、测试
nacos|nacos gateway动态路由实战
文章图片


gateway网关相关配置 创建,使用initilizer,
  • Group:com.atguigu.gulimall
  • Artifact: gulimall-gateway
  • package:com.atguigu.gulimall.gateway
搜索gateway选中。
pom.xml里加上common依赖, 修改jdk版本

在启动类中添加注解@EeableDiscoveryClient
nacos|nacos gateway动态路由实战
文章图片


配置nacos注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848spring.application.name=gulimall-gatewayserver.port=88


bootstrap.properties 填写配置中心地址
spring.application.name=gulimall-gatewayspring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.namespace=ab66aff2-0bd5-4f80-8a68-760d6ff7d96d


nacos里创建命名空间gateway
然后在命名空间里创建文件guilmall-gateway.yml
spring:application:name: gulimall-gateway


在主类中屏蔽数据源
nacos|nacos gateway动态路由实战
文章图片


在项目里创建application.yml
spring:cloud:gateway:routes:- id: after_routeuri: https://www.xiaomi.compredicates:- Query=url,xiaomi#若参数等于断言 则跳转到指定的uri

运行结果
nacos|nacos gateway动态路由实战
文章图片

【nacos|nacos gateway动态路由实战】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读