微服务模块化需要的几个基础功能

首先对项目拆分, 根据业务服务内容拆分项目, 最终结果是一堆dll. 相关的dll组合起来服务一项业务功能, 称为模块. 如果单独部署, 则为一个微服务模块. 

这样先拆分模块之后根据具体项目配给的人力物力进行最终的部署: 哪些模块作为独立服务部署, 哪些模块组合成一个服务部署. 

这里的模块所指的都是业务模块. 结构如图:

 

 于是模块化的微服务需要的几个基础功能就显现出来了:

一 模块的生命周期

  一个模块接入服务中需要监听几个生命周期事件, 初始化\配置\启动\停止...也可以作为一个基类由继承模块重写. 这样一个模块的基础定义完成. 

二 模块间的接口调用

  模块内部有各种ApplicationService, 各个service之间通过接口IApplicationService进行调用. 

  于是, 对于host中有接口实现的则调用具体实现, 约等于直接调用. 对于分为两个host部署的模块, 自己host中不含接口具体实现的, 通过接口代理走服务发现\负载均衡\远程请求进行调用. 

  这里的关键是需要实现一个代理所有IApplicationService的接口调用代理类型. 目前我调查和使用过的是Autofac和AspectCore, 都可以. Autofac是基于Castle.DynamicProxy, AspectCore则是它的AspectCore.DynamicProxy组件, 可以单独使用组件. 个人喜欢单独使用Castle.DynamicProxy, 不需要更换asp.netcore的自带容器. 

三 事件

  与接口调用类似, 事件也需要分为模块内事件和分布式事件两种. 

  内部事件派发很简单, 跟普通事件类似, 走内存. 分布式事件可以依赖RabbitMQ等, 类库有CAP\Masstransit.

四 其他分布式需要的功能

  如服务注册/发现/分布式事务等, 这是属于微服务(分布式)带来的问题, 无论模块化与否都存在. 

 

posted @ 2020-07-17 14:32  陈惊蛰  阅读(1024)  评论(0编辑  收藏  举报