跨微服务的资源收集和执行
需求
当服务为微服务部署模式的时候,一些底层的扩展可能会在不同的微服务上进行扩展,那么我们需要把他们收集到一个服务上,让用户能在任意的微服务上看到全部的扩展资源,如果用户执行了相关资源,应该还能够在对应的微服务上进行执行
思路
基于SpringCloud Feign等技术,在微服务启动时,通过SpringCloud获取其他微服务情况,并进一步获取资源,生成代理类,注入到当前微服务,在调用时,走Feign调用到其他微服务上执行,当前微服务获取返回结果
- 基于上述方案,我司已经实现了,多语言,计划任务,参数导入导出,多语言等,多种资源的跨微服务收集和执行
核心
开发者
- 微服务资源收集和执行框架的开发者 (A类开发者)
- 系统选项框架的的定义者(B类开发者)
- 系统选项的扩展开发者(C类开发者)
A类开发者
- 定义微服务收集框架,定义微服务收集和执行的顶级接口A1,实现A1接口的这类资源,会参与微服务收集和执行
- 其他微服务资源的自动注入,定义@A2注解,被@A2注解标记的列表会自动注入相关的其他微服务资源
- 当前微服务启动的时候,需要主动去找注册中心询问当前存活的微服务,然后主动收集其资源到本地,并广播出,自己服务已经启动,让其他微服务来收集自己的资源
- … 还有一些细节
B类开发者
- 定义系统选项的顶级接口,以及前/后端页面的开发
- 定义了系统选项扩展的顶级接口B1
根据A类开发者的接口,进行实现
1
2
3
4
5
6
7
8
9
10
11
12//定义该接口,需要支持远端收集特性
@Component
public class ****** implements A1 {
public String getClassName() {
return B1.class.getName();
}
public String getTitle() {
return "系统选项接口";
}
}获取系统选项列表的地方要多写上注解@A2
1
2
3@Autowired //收集本服务内的实例
@A2 //收集其他微服务的实例
private List<B1> services;
C类开发者
- 基于B类开发的文档进行系统选项开发
优缺点
- 微服务可以随意打包,在任意一个微服务上,都可以看到完整的系统选项列表
- 缺点是依赖注册中心,在收集和执行的阶段,使用feign调用,需要注册中心提供具体的微服务实例
相关注意事项
- A类开发者,要定义全局的feign请求头,来解决跨微服务的情况下,认证的问题,用户信息需要传递下去
- A类开发者,要处理好,微服务的启动和下线,去处理好当前Spring环境中注入的Feign代理类
- B类开发者定义的顶级类必须是接口,java的动态代理,只能代理接口
- B类开发者,定义的顶级接口,上不要有链式调用,每个方法的参数和返回结果都要可序列化
- B类开发者,要注意,你收集到的List并不是一成不变的,会随着其他微服务的启动和下线,动态的变化