微服务下解决子服务本地开发服务调用问题
一. 问题及需求
问题:
微服务场景下,随着子服务越来越多,日常开发,开发人员需要本地启动多个必要的一整套服务,来支撑业务子服务的开发调试
以及与前端的联调. 这对开发人员电脑的配置要求高,并且服务各种原因本地的各种重启很耗费时间,非常不便利.
需求:
本地只需要启动自己的业务模块的子服务,其他自己不关心的服务可以使用公共的服务,若涉及多个子服务的本地开发,希望调
用的时候能精确调用到本地的服务而不是随机服务.
二. 设计思路
既然需要找到对应的服务,那就需要请求要带上标识,而网关则需要针对标识解析转发到对应的服务上如下图所示

-
前端带上标识这个好解决, 不管什么请求都有请求头,那标识就丢请求头就好了,系统有登陆态,对应的标识可以跟用户绑定,
这样可以给用户打标签,然后前端在用户信息里面取标签,然后默认带请求头上 -
那服务怎打上标签呢? 网关又如何识别呢?
目前注册中心使用的是nacos,微服务体系中有什么服务都是在注册中心拉取信息的,如下图所示

在官网查询对应文档中 附上地址: NACOS官网
看到服务注册的时候有个可以自定义的元数据metadata,这个就是我们想要的,可以给服务打上标签,效果如下


-
剩下就是要处理网关上的过滤器了
网关需要根据用户的登陆绑定的标签,扫描转发的目标服务实例的元数据是否包含对应的标签,如果是则转发过去对应的服务,否则将
转发到没有打标签的服务实例上
实现全局过滤器GlobalFilter 逻辑写在过滤器里面
这样就初步实现了前端根据标签调用到本地的路了
-
微服务难免有服务调用,那怎么实现服务间的灰度呢
既然每个服务都需要,那就抽一个公共sdk包出来,单独为服务间转发的规则加上灰度规则. 既然是服务间调用用的又是阿里巴巴全家桶,
那用的就是openFeign, 加在哪里合适呢? 了解过openFeign原理的就知道,经过各种转换之后最终还是会转成ip调用,拿到ip说明拿
到了对应的路由.
我们从全局路由负载改造是最好的方式,找源码看实现发现可以在RoundRobinLoadBalancer下手,继承RoundRobinLoadBalancer在选择
路由前加上我们的规则这样就完成了 -
需要考虑多线程的时候需要对数据持久化保证线程子线程或者多线程的时候都能读到对应的标签
源码有需要后续开源
demo源码
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !