架构图
功能介绍
更新内容
特性/增强
- 增加服务版本号隔离
- 优化授权中心redis-token内存占用
- 适配mybatis-plus拦截器新配置方式
- 升级spring-boot到2.5.13
- 升级spring-cloud到2020.0.5
- 升级spring-boot-admin到2.5.6
- 升级mybatis-plus到3.5.1
内容说明
一、服务版本号隔离
1.1. 适用场景
这个是用于「解决」微服务「服务冲突乱窜」的问题;
指的是在开发环境过程中,开发人员可能只会在本地启动自己开发的服务进行调试,而其他服务则使用服务器上的;这样就可能会在注册中心中出现同一个服务同时存在多个不同版本的实例(如下图所示的业务服务B
)
这样如果 开发A
本来想要调试自己本地服务的时候,网关调用业务服务B时的请求则有可能会跳转到其他人的实例上,如服务器上的或者开发B的实例。
1.2. 隔离逻辑
本次更新主要是基于 Spring Cloud 的负载均衡组件 LoadBalancer
,通过 版本号
来实现 自定义负载均衡
规则,解决这个服务乱窜问题;以上图为例,主要实例选择逻辑如下:
- 「普通用户」访问服务器上的页面时,请求的所有路由只调用
服务器实例
- 「开发A」访问时,请求的所有路由优先调用
开发A本机实例
如果没有则调用服务器实例
- 「开发B」访问时同上,请求的所有路由优先调用
开发B本机实例
如果没有则调用服务器实例
1.3. 使用说明
1.3.1. 开关配置
通过以下配置来设置是否开启 版本隔离
功能,默认为 false
zlt:
loadbalance:
isolation:
enabled: true
1.3.2. 服务版本配置
使用注册中心的元数据(metadata)来区分版本。
主流的注册中心都带有元数据管理,以Nacos为例,可以在 Spring Cloud 的配置中通过以下两种方式添加服务的版本号:
代码语言:javascript复制spring:
cloud:
nacos:
discovery:
metadata:
version: zlt
或者
代码语言:javascript复制zlt:
loadbalance:
version: zlt
启动服务后元数据就会注册上去,如下图所示:
1.3.3. 版本入参
开发人员可以通过 postman
工具调用接口的时候在 header参数
中添加自己的 版本号
:
二、优化授权中心redis-token内存占用
使用 redis-token 时,每授权一个 token 之后 security 会在 redis 中生成 client_id_to_access
和 uname_to_access
两个队列,分别用于存放某个 client_id 下的所有 access_token 以及某个 username 下的所有 access_token。
由于集合无法单独对元素进行过期时间设置,所以理论上如果一直有用户授权,会一直刷新集合的过期时间,导致内容无限扩大,存在 内存溢出
的风险。
本版本的解决方式:增加一个 redis 的销毁监听器,专门负责清除这两个集合下的过期数据。
三、适配 mybatis-plus 拦截器新配置方式
mybatis-plus 3.4 版本后分页拦截器 PaginationInterceptor
被弃用,替换成 MybatisPlusInterceptor
贡献列表
非常感谢以下同学对本版本的贡献:
- @jarivs
- @lpphan
项目地址
Gitee地址:https://gitee.com/zlt2000/microservices-platform
Github地址:https://github.com/zlt2000/microservices-platform
项目文档
https://www.kancloud.cn/zlt2000/microservices-platform/919417
项目更新日志
https://www.kancloud.cn/zlt2000/microservices-platform/936235