请选择 进入手机版 | 继续访问电脑版

[java] nacos gateway动态路由实战

[复制链接]
查看81 | 回复10 | 2021-9-14 07:50:36 | 显示全部楼层 |阅读模式
目次

nacos gateway动态路由

阐明 :本次测试利用 的gateway是2.2.2.RELEASE版本,其他版本大概 存在不同

一、引入本次测试必要 的pom依赖

  1. <!--gateway网关依赖-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-gateway</artifactId>
  5. </dependency>
  6. <!--nacos依赖-->
  7. <dependency>
  8. <groupId>com.alibaba.cloud</groupId>
  9. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.alibaba.cloud</groupId>
  13. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  14. </dependency>
  15. <!--json工具包-->
  16. <dependency>
  17. <groupId>com.alibaba</groupId>
  18. <artifactId>fastjson</artifactId>
  19. <version>1.2.47</version>
  20. </dependency>
复制代码

二、设置 文件设置(*设置 文件不见效 的把名字改为bootstrap.yml)

  1. server:
  2. port: 8200
  3. spring:
  4. application:
  5. name: lc-gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. #注册中心地址
  10. server-addr: 106.12.146.239:8848
  11. config:
  12. server-addr: 106.12.146.239:8848
  13. # 配置中心-指定命名空间
  14. namespace: bb79a8c4-e4e1-4a27-bceb-0810f278b5aa
  15. # 指定配置文件后缀
  16. file-extension: yaml
  17. #配置组
  18. group: DEFAULT_GROUP
  19. #配置dateId
  20. data-id: lc-gateway
  21. #获取配置超时时间
  22. timeout: 5000
  23. gateway:
  24. #设置超时时间默认
  25. httpclient:
  26. connect-timeout: 1000
  27. response-timeout: 5s
复制代码

ps:这里集成了nacos设置 中央 想相识 详情请移步spring cloud集成nacos设置 中央

三、动态路由实现

  1. package com.lc.api.gateway.config;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.nacos.api.NacosFactory;
  4. import com.alibaba.nacos.api.config.ConfigService;
  5. import com.alibaba.nacos.api.config.listener.Listener;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.beans.factory.annotation.Value;
  10. import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
  11. import org.springframework.cloud.gateway.route.RouteDefinition;
  12. import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
  13. import org.springframework.context.ApplicationEventPublisher;
  14. import org.springframework.context.ApplicationEventPublisherAware;
  15. import org.springframework.stereotype.Service;
  16. import reactor.core.publisher.Mono;
  17. import javax.annotation.PostConstruct;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Properties;
  21. import java.util.concurrent.Executor;
  22. /**
  23. * 动态路由,可以通过获取Bean才做该类,提供增删改查已经发布功能
  24. *
  25. * @Author: lc
  26. * @Date: 2020/7/8 15:49
  27. */
  28. @Service
  29. public class DynamicRouteConfig implements ApplicationEventPublisherAware {
  30. private static final Logger logger = LoggerFactory.getLogger(DynamicRouteConfig.class);
  31. @Autowired
  32. private RouteDefinitionWriter routedefinitionWriter;
  33. private ApplicationEventPublisher publisher;
  34. @Value("${spring.cloud.nacos.config.data-id}")
  35. private String dataId;
  36. @Value("${spring.cloud.nacos.config.group}")
  37. private String group;
  38. @Value("${spring.cloud.nacos.config.server-addr}")
  39. private String serverAddr;
  40. @Value("${spring.cloud.nacos.config.namespace}")
  41. private String namespace;
  42. @Value("${spring.cloud.nacos.config.timeout}")
  43. private long timeout;
  44. private static final List<String> ROUTE_LIST = new ArrayList<>();
  45. @PostConstruct
  46. public void dynamicRouteByNacosListener() {
  47. try {
  48. Properties prop = new Properties();
  49. prop.put("serverAddr", serverAddr);
  50. prop.put("namespace", namespace);
  51. ConfigService config = NacosFactory.createConfigService(prop);
  52. String content = config.getConfig(dataId, group, timeout);
  53. publisher(content);
  54. config.addListener(dataId, group, new Listener() {
  55. @Override
  56. public void receiveConfigInfo(String config) {
  57. publisher(config);
  58. }
  59. @Override
  60. public Executor getExecutor() {
  61. return null;
  62. }
  63. });
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. /**
  69. * 增加路由
  70. *
  71. * @param def
  72. * @return
  73. */
  74. public Boolean addRoute(RouteDefinition def) {
  75. try {
  76. routedefinitionWriter.save(Mono.just(def)).subscribe();
  77. ROUTE_LIST.add(def.getId());
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. }
  81. return true;
  82. }
  83. /**
  84. * 删除路由
  85. *
  86. * @return
  87. */
  88. public Boolean clearRoute() {
  89. for (String id : ROUTE_LIST) {
  90. routedefinitionWriter.delete(Mono.just(id)).subscribe();
  91. }
  92. ROUTE_LIST.clear();
  93. return Boolean.FALSE;
  94. }
  95. /**
  96. * 发布路由
  97. */
  98. private void publisher(String config) {
  99. clearRoute();
  100. try {
  101. logger.info("Start updating dynamic routing ....");
  102. List<RouteDefinition> routeDefinitionList = JSONObject.parseArray(config, RouteDefinition.class);
  103. for (RouteDefinition route : routeDefinitionList) {
  104. logger.info(route.toString());
  105. addRoute(route);
  106. }
  107. publisher.publishEvent(new RefreshRoutesEvent(this.routedefinitionWriter));
  108. logger.info("update completed ");
  109. } catch (Exception e) {
  110. logger.error("Failed to update routing information", e);
  111. e.printStackTrace();
  112. }
  113. }
  114. @Override
  115. public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
  116. publisher = applicationEventPublisher;
  117. }
  118. }
复制代码

四、nacos设置 中央 设置

1.阐明

nacos gateway动态路由实战

2.新建一个网关设置

nacos gateway动态路由实战

3. 添加设置 格式如下

nacos gateway动态路由实战

这里我就不解释 了大家应该都能看懂

  1. [
  2. {
  3. "filters": [
  4. {
  5. "args": {
  6. "parts": "1"
  7. },
  8. "name": "StripPrefix"
  9. }
  10. ],
  11. "id": "authent1",
  12. "order": -1,
  13. "predicates": [
  14. {
  15. "args": {
  16. "pattern": "/authent/**"
  17. },
  18. "name": "Path"
  19. }
  20. ],
  21. "uri": "lb://lc-authenticate"
  22. }
  23. ]
复制代码

五、测试

nacos gateway动态路由实战

gateway网关干系 设置

创建,利用 initilizer,

  • Group:com.atguigu.gulimall
  • Artifact: gulimall-gateway
  • package:com.atguigu.gulimall.gateway

搜刮 gateway选中。

pom.xml里加上common依赖 , 修改jdk版本

在启动类中添加注解@EeableDiscoveryClient

在这里插入图片形貌

设置 nacos注册中央 地址

  1. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  2. spring.application.name=gulimall-gateway
  3. server.port=88
复制代码

bootstrap.properties 填写设置 中央 地址

  1. spring.application.name=gulimall-gateway
  2. spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  3. spring.cloud.nacos.config.namespace=ab66aff2-0bd5-4f80-8a68-760d6ff7d96d
复制代码

nacos里创建定名 空间gateway

然后在定名 空间里创建文件guilmall-gateway.yml

  1. spring:
  2. application:
  3. name: gulimall-gateway
复制代码

在主类中屏蔽数据源

在这里插入图片形貌

在项目里创建application.yml

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: after_route
  6. uri: https://www.xiaomi.com
  7. predicates:
  8. - Query=url,xiaomi
  9. # 若参数等于断言 则跳转到指定的uri
复制代码

运行效果

在这里插入图片形貌

以上为个人履历 ,盼望 能给大家一个参考,也盼望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 123457092 | 2021-9-22 11:37:20 | 显示全部楼层
宇宙第一贴诞生了!
回复

使用道具 举报

avatar 永远丶并不远 | 2021-9-27 09:25:15 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 123457865 | 2021-9-28 00:45:28 | 显示全部楼层
admin楼主很有艺术范!
回复

使用道具 举报

avatar 南辕北辙395 | 2021-10-1 22:13:30 | 显示全部楼层
admin楼主说的我也略懂!
回复

使用道具 举报

avatar 小仙女要起飞 | 2021-10-8 05:17:14 | 显示全部楼层
admin楼主,替我问候您主治大夫!
回复

使用道具 举报

avatar 潘金麟 | 2021-10-15 20:29:25 | 显示全部楼层
学习雷锋,好好回帖!
回复

使用道具 举报

看帖、回帖、拿分、走人
回复

使用道具 举报

楼上的说的很好!
回复

使用道具 举报

一口气看完了,我要下去回味回味了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则