一.前言

Nacos是阿里巴巴开源的致力于服务发现与管理、动态配置管理,以及动态DNS服务的中间件,目前已发布至0.5.0版本,除了与Spring Cloud更加紧密结合以外,还丧心病狂地支持JDK11。如果您目前的项目碍于Eureka的性能,而又缺乏成本引进Consul,那么Nacos是您最好的选择。好了,回到正题,在上周许进搞了一个使用Nacos实现Spring Cloud Gateway的动态路由,让我们直观地感受到了Nacos的无缝接入如丝般顺滑,作为Spring Cloud中网关的始祖Zuul,自然也需要这一贴心赋能。

二.Spring Cloud Zuul动态路由实现思路

在社区书籍《重新定义Spring Cloud实战》中第8章4小节,详细剖析了Zuul的路由配置表加载以及刷新原理,其大致思想就是重写SimpleRouteLocator类的locateRoutes()方法,同时实现RefreshableRouteLocator接口,方法体引用父类的doRefresh()方法。在书中使用DB作为配置存放的仓库,如今有更为强大的Nacos,只需要将之前读取DB的逻辑换成读取Nacos即可。美中不足的是,由于Nacos还需进一步完善,目前对Spring Cloud中的事件支持还不是很完美,动态刷新只能依靠Zuul的内部逻辑。

三.具体实现

1.在zuul-server中添加Nacos的配置
 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>0.4.0</version></dependency>
2.读取Nacos配置信息核心代码
@Component
public class PropertiesAssemble{public Map<String, ZuulRoute> getProperties() {Map<String, ZuulRoute> routes = new LinkedHashMap<>();List<ZuulRouteEntity> results = listenerNacos("zuul-server","zuul_route");for (ZuulRouteEntity result : results) {if (StringUtils.isBlank(result.getPath())/*|| org.apache.commons.lang3.StringUtils.isBlank(result.getUrl())*/) {continue;}ZuulRoute zuulRoute = new ZuulRoute();try {BeanUtils.copyProperties(result, zuulRoute);} catch (Exception e) {}routes.put(zuulRoute.getPath(), zuulRoute);}return routes;}private List<ZuulRouteEntity> listenerNacos (String dataId, String group) {try {Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR, "localhost:8848");ConfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataId, group, 5000);System.out.println("从Nacos返回的配置:" + content);//注册Nacos配置更新监听器,用于监听触发
//            configService.addListener(dataId, group, new Listener()  {
//                @Override
//                public void receiveConfigInfo(String configInfo) {
//                    System.out.println("Nacos更新了!");
//
//                }
//                @Override
//                public Executor getExecutor() {
//                    return null;
//                }
//            });return JSONObject.parseArray(content, ZuulRouteEntity.class);} catch (NacosException e) {e.printStackTrace();}return new ArrayList<>();}
}

目前的demo写得比较简单,直接将Nacos的默认地址与端口写了进来,Nacos对于配置的管理有两个坐标,一是dataId,二是group,本demo中笔者将其分别命名为"zuul-server",“zuul_route”。

3.Zuul动态刷新路由实现

这部分可以查看demo地址:https://github.com/SpringCloud/spring-cloud-zuul-nacos,具体就不赘述。

四.演示

1.从Nacos github地址pull源码,配置环境


这里需要在IDEA中添加启动参数-Dnacos.standalone=true

2.启动Nacos,配置Zuul路由信息

启动Nacos后,在浏览器输入http://localhost:8848/nacos/index.html便会跳转到如下页面:

点击配置列表,单击右侧的+号图标,便可以新增一项配置,由于这里已经添加好了,就直接看信息:

3.启动zuul-server,从Nacos加载路由信息测试

启动Zuul后,console中出现如下信息:

在浏览器输入http://localhost:5555/baidu,出现如下效果,直接跳转到目标地址:

我们现在将Nacos中的配置修改一下,将http://github.com/Lovnx换成http://www.baidu.com,修改后直接发布:

我们会在console看到:

在浏览器输入http://localhost:5555/baidu,出现如下效果:

------------------->>>DEMO源码

使用Nacos实现Spring Cloud Zuul的动态路由相关推荐

  1. 基于Nacos实现Spring Cloud Gateway实现动态路由

    简介 该文档主要介绍以Nacos为配置中心,实现Spring Cloud GateWay 实现动态路由的功能.Spring Cloud Gateway启动时候,就将路由配置和规则加载到内存里,无法做到 ...

  2. 基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理

    前面我们了解过了Sentinel 网关流量控制之Spring Cloud Gateway实战,今天带给大家是基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理. 1.为什 ...

  3. spring cloud gateway 之动态路由

    前面分别对 Spring Cloud Zuul 与 Spring Cloud Gateway 进行了简单的说明,它门是API网关,API网关负责服务请求路由.组合及协议转换,客户端的所有请求都首先经过 ...

  4. spring cloud gateway 之 动态路由改造

    目录 gateway本地文件常规路由配置 本地文件配置对业务造成的痛点 动态路由改造 1 gateway本地文件常规路由配置 我们先大致看下gateway中的常规概念 Route(路由):路由是网关的 ...

  5. angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...

    一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...

  6. Spring Cloud Zuul API 网关服务

    API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实 ...

  7. API 网关服务:Spring Cloud Zuul(二):路由详解、Cookie 与头信息

    实践出于<Spring Cloud 微服务实战> - 瞿永超 著 路由详解 传统路由配置   传统路由配置就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实 ...

  8. 02.Apollo配置中心整合spring cloud zuul

    一.前言 携程 Apollo 配置中心 学习笔记, Windows 系统搭建基于携程Apollo配置中心分布式模式, 在此基础上,介绍如何使用阿波罗整合zuul实现动态路由. 二.项目搭建 参考htt ...

  9. Spring Cloud -Zuul

    服务网关和zuul 一个角色来充当request的请求入口,处理非业务功能的场所(防刷,协议监控) 要素: 稳定性,高可用 性能.并发性 安全性 扩展性 常用的网关方案 Nginx+Lua(性能极高, ...

最新文章

  1. Jenkins+Git+Maven持续集成经典教程
  2. puppet 手册之puppet rsync 模块应用完整版
  3. POJ - 2230 Watchcow(欧拉图)
  4. php重载,PHP 重载
  5. 容器编排技术 -- 使用kubectl实现应用伸缩
  6. Bean的拷贝之BeanUtils
  7. Java求两个数的最大公约数
  8. linux需要的GLIBCXX版本,Linux下GLIBCXX和GLIBC版本低造成的编译错误的解决方案
  9. python下视频的包_这套Python视频超详细,包你一小时就可开始入门,100天在编程界驰骋~...
  10. [Java]批量生成二维码
  11. Matlab多种群遗传算法
  12. 笔记本如何不按Fn键就能实现F键的功能
  13. PS 前端技能一 白色背景图片变为透明的图片
  14. 三层交换机和vrrp协议
  15. 未充分说明劳务采购价格公允性、供应商合作合理性,电旗股份IPO被否.
  16. 触摸板把计算机从休眠状态唤醒,win10笔记本盒盖唤醒后触摸板失灵的处理方法...
  17. 浪潮集团执行总裁王洪添一行莅临柏睿数据公司商讨战略合作
  18. Spring 增强处理Advice
  19. 齐次坐标表示向量与坐标理解
  20. leetcode 5. 最长回文子串 【马拉车】

热门文章

  1. oracle循环数据字典,Oracle DUL工作原理和技术实现
  2. 【文智背后的奥秘】系列篇——自动文本分类
  3. 狂神 Linux 学习笔记
  4. 台式电脑网络连接配置异常_专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机...
  5. 最火10款经典游戏项目合集 让你轻松拿下
  6. 使用CUPS打印服务
  7. 苹果手机投影_投影仪连手机的两种方式介绍
  8. fatal: unable to access ‘‘: Failed to connect to 27.0.0.1 port 7890 after 2097 ms:Connection
  9. 【AndroidManifest.xml详解】Manifest属性之versionCode,versionName
  10. 全息投影的三种热门展示方式