微服务落地方案
2018-05-10 10:54:43#本方案定义公司实施微服务的开发标准,规定了源码的分层结构、各层次的编码规范;单个微服务采用CQRS架构;微服务间使用gRCP通信;并提供了微服务需要的基础设施,如ELK,下面具体说明:
分层
- 领域层
- 基础设施层
- 应用层
- 共享层
注意:
- 领域模型专注业务的设计,不依赖仓储等基础设施层
- 基础设施的仓储层仅负责领域模型的取出和存储
- 使用CQRS 模式设计应用层
- Web API 是面向前端的交互的接口,避免依赖领域模型
定义Entity,区分内在逻辑和外部行为
- 将领域模型字段的修改设置为私有
- 使用构造函数表示对象的创建
- 使用具有业务含义的动作来操作模型字段
- 领域模型负责对自己数据的处理
- 领域服务或命令处理者负责调用领域模型业务动作
工作单元模式(UnitOfWork)
- 使用同一上下文
- 跟踪实体的状态
- 保障事务一致性
- 使用EF实现仓储
领域事件来实现模块解耦
- 由领域模型内部创建事件
- 由专有的领域事件处理类处理领域事件
- 根据实际情况来决定是否在同一事务中处理(如一致性、性能等因素)
集成事件解决跨服务最终一致性
- 集成事件是跨服务的领域事件
- 集成事件一般由领域事件驱动触发
- 不通过事务来处理集成事件(实现最终一致性)
- 仅在必要的情况下定义和使用集成事件
- 用RabbitQM来实现EventBus
MediatR实现CQRS
- IMediator
- IRequest、IRequest
- IRequestHandler<in TRequest, TResponse>
- INotification
- INotificationHandler
gRPC实现内部服务间通信
- gRPC的特点:
- 提供几乎所有主流语言的实现,打破语言隔阂
- 基于HTTP/2 ,开放协议,受到广泛的支持,易于实现和集成
- 默认使用Protocol Buffers 序列化,性能相较于RESTful Json 好很多
- 工具链成熟,代码生成便捷,开箱即用
- 支持双向流式的请求和响应,对批量处理、低延时场景友好
- NET 生态对gRPC 的支持情况
- 提供基于HttpClient 的原生框架实现
- 提供原生的ASP.NET Core 集成库
- 提供完整的代码生成工具
- Visual Studio 和Visual Stuido Code 提供proto 文件的智能提示
网关区分场景与职责
Polly组件包
- 失败重试
- 服务熔断
- 超时处理
- 舱壁隔离
- 缓存策略
- 失败降级
- 组合策略
- Polly 使用步骤
- 定义要处理的异常类型或返回值
- 定义要处理动作(重试、熔断、降级响应等)
- 使用定义的策略来执行代码
- 适合失败重试的场景
- 服务“失败”是短暂的,可自愈的
- 服务是幂等的,重复调用不会有副作用
注册与发现
- 注册的封装
- 发现的封装
- 负载均衡的封装
- 封装HttpClient(含consul和polly)
使用JWT来实现认证
Microsoft.AspNetCore.Authentication.JwtBearer
- Ocelot 网关配置身份认证
- 微服务配置认证与授权
部署图
日志三件套
- Elasticsearch(存储)
- Logstash(收集器)
- Kibana (数据看板)
分布式日志
Exceptionless
- 友好的界面
- 内置日志分类看板
- 按团队和项目管理应用
- 支持Web hook 发送异常通知
- 基于.NET Core 开源
链路追踪
集成SkyWalking.NET 实现追踪
监控与警告
-
App.Metrics 与 Influxdb
-
Prometheus 与 AlertManager
-
用Granfana 实现监控看板
Granfana 核心特性
- 支持各种主流数据源
- 丰富的图形组件
- 灵活的看板组织方式
- 灵活的权限支持
- 支持OAuth 账户支持
扩展:使用prometheus-net实现自定义监控指标