SpringCloud下的跨微服务收集和执行

跨微服务的资源收集和执行

需求

当服务为微服务部署模式的时候,一些底层的扩展可能会在不同的微服务上进行扩展,那么我们需要把他们收集到一个服务上,让用户能在任意的微服务上看到全部的扩展资源,如果用户执行了相关资源,应该还能够在对应的微服务上进行执行

思路

基于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并不是一成不变的,会随着其他微服务的启动和下线,动态的变化