使用Nacos实现Spring Cloud Zuul的动态路由
一.前言
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的动态路由相关推荐
- 基于Nacos实现Spring Cloud Gateway实现动态路由
简介 该文档主要介绍以Nacos为配置中心,实现Spring Cloud GateWay 实现动态路由的功能.Spring Cloud Gateway启动时候,就将路由配置和规则加载到内存里,无法做到 ...
- 基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理
前面我们了解过了Sentinel 网关流量控制之Spring Cloud Gateway实战,今天带给大家是基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理. 1.为什 ...
- spring cloud gateway 之动态路由
前面分别对 Spring Cloud Zuul 与 Spring Cloud Gateway 进行了简单的说明,它门是API网关,API网关负责服务请求路由.组合及协议转换,客户端的所有请求都首先经过 ...
- spring cloud gateway 之 动态路由改造
目录 gateway本地文件常规路由配置 本地文件配置对业务造成的痛点 动态路由改造 1 gateway本地文件常规路由配置 我们先大致看下gateway中的常规概念 Route(路由):路由是网关的 ...
- angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...
一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...
- Spring Cloud Zuul API 网关服务
API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实 ...
- API 网关服务:Spring Cloud Zuul(二):路由详解、Cookie 与头信息
实践出于<Spring Cloud 微服务实战> - 瞿永超 著 路由详解 传统路由配置 传统路由配置就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实 ...
- 02.Apollo配置中心整合spring cloud zuul
一.前言 携程 Apollo 配置中心 学习笔记, Windows 系统搭建基于携程Apollo配置中心分布式模式, 在此基础上,介绍如何使用阿波罗整合zuul实现动态路由. 二.项目搭建 参考htt ...
- Spring Cloud -Zuul
服务网关和zuul 一个角色来充当request的请求入口,处理非业务功能的场所(防刷,协议监控) 要素: 稳定性,高可用 性能.并发性 安全性 扩展性 常用的网关方案 Nginx+Lua(性能极高, ...
最新文章
- Jenkins+Git+Maven持续集成经典教程
- puppet 手册之puppet rsync 模块应用完整版
- POJ - 2230 Watchcow(欧拉图)
- php重载,PHP 重载
- 容器编排技术 -- 使用kubectl实现应用伸缩
- Bean的拷贝之BeanUtils
- Java求两个数的最大公约数
- linux需要的GLIBCXX版本,Linux下GLIBCXX和GLIBC版本低造成的编译错误的解决方案
- python下视频的包_这套Python视频超详细,包你一小时就可开始入门,100天在编程界驰骋~...
- [Java]批量生成二维码
- Matlab多种群遗传算法
- 笔记本如何不按Fn键就能实现F键的功能
- PS 前端技能一 白色背景图片变为透明的图片
- 三层交换机和vrrp协议
- 未充分说明劳务采购价格公允性、供应商合作合理性,电旗股份IPO被否.
- 触摸板把计算机从休眠状态唤醒,win10笔记本盒盖唤醒后触摸板失灵的处理方法...
- 浪潮集团执行总裁王洪添一行莅临柏睿数据公司商讨战略合作
- Spring 增强处理Advice
- 齐次坐标表示向量与坐标理解
- leetcode 5. 最长回文子串 【马拉车】
热门文章
- oracle循环数据字典,Oracle DUL工作原理和技术实现
- 【文智背后的奥秘】系列篇——自动文本分类
- 狂神 Linux 学习笔记
- 台式电脑网络连接配置异常_专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机...
- 最火10款经典游戏项目合集 让你轻松拿下
- 使用CUPS打印服务
- 苹果手机投影_投影仪连手机的两种方式介绍
- fatal: unable to access ‘‘: Failed to connect to 27.0.0.1 port 7890 after 2097 ms:Connection
- 【AndroidManifest.xml详解】Manifest属性之versionCode,versionName
- 全息投影的三种热门展示方式