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"
    }
]

  

 

 

  

 

posted @   风吹一点云  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2018-08-01 手机号中间四位替换
点击右上角即可分享
微信分享提示