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

首先对项目拆分, 根据业务服务内容拆分项目, 最终结果是一堆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 @   陈惊蛰  阅读(1039)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2014-07-17 mono的远程调试
点击右上角即可分享
微信分享提示
CONTENTS

"赠我一听冰阔落"