Spiga

微服务落地方案

2018-05-10 10:54:43

#本方案定义公司实施微服务的开发标准,规定了源码的分层结构、各层次的编码规范;单个微服务采用CQRS架构;微服务间使用gRCP通信;并提供了微服务需要的基础设施,如ELK,下面具体说明:

分层

  1. 领域层
  2. 基础设施层
  3. 应用层
  4. 共享层

注意:

  • 领域模型专注业务的设计,不依赖仓储等基础设施层
  • 基础设施的仓储层仅负责领域模型的取出和存储
  • 使用CQRS 模式设计应用层
  • Web API 是面向前端的交互的接口,避免依赖领域模型

定义Entity,区分内在逻辑和外部行为

  • 将领域模型字段的修改设置为私有
  • 使用构造函数表示对象的创建
  • 使用具有业务含义的动作来操作模型字段
  • 领域模型负责对自己数据的处理
  • 领域服务或命令处理者负责调用领域模型业务动作

工作单元模式(UnitOfWork)

  • 使用同一上下文
  • 跟踪实体的状态
  • 保障事务一致性
  • 使用EF实现仓储

领域事件来实现模块解耦

  • 由领域模型内部创建事件
  • 由专有的领域事件处理类处理领域事件
  • 根据实际情况来决定是否在同一事务中处理(如一致性、性能等因素)

集成事件解决跨服务最终一致性

  • 集成事件是跨服务的领域事件
  • 集成事件一般由领域事件驱动触发
  • 不通过事务来处理集成事件(实现最终一致性)
  • 仅在必要的情况下定义和使用集成事件
  • 用RabbitQM来实现EventBus

MediatR实现CQRS

  • IMediator
  • IRequest、IRequest​
  • IRequestHandler<in TRequest, TResponse>
  • INotification
  • INotificationHandler​

gRPC实现内部服务间通信

  1. gRPC的特点:
  • 提供几乎所有主流语言的实现,打破语言隔阂
  • 基于HTTP/2 ,开放协议,受到广泛的支持,易于实现和集成
  • 默认使用Protocol Buffers 序列化,性能相较于RESTful Json 好很多
  • 工具链成熟,代码生成便捷,开箱即用
  • 支持双向流式的请求和响应,对批量处理、低延时场景友好
  1. NET 生态对gRPC 的支持情况
  • 提供基于HttpClient 的原生框架实现
  • 提供原生的ASP.NET Core 集成库
  • 提供完整的代码生成工具
  • Visual Studio 和Visual Stuido Code 提供proto 文件的智能提示

网关区分场景与职责



Polly组件包

  • 失败重试
  • 服务熔断
  • 超时处理
  • 舱壁隔离
  • 缓存策略
  • 失败降级
  • 组合策略
  1. Polly 使用步骤
    • 定义要处理的异常类型或返回值
    • 定义要处理动作(重试、熔断、降级响应等)
    • 使用定义的策略来执行代码
  2. 适合失败重试的场景
    • 服务“失败”是短暂的,可自愈的
    • 服务是幂等的,重复调用不会有副作用

注册与发现

  1. 注册的封装
  2. 发现的封装
  3. 负载均衡的封装
  4. 封装HttpClient(含consul和polly)

使用JWT来实现认证

Microsoft.AspNetCore.Authentication.JwtBearer

  1. Ocelot 网关配置身份认证
  2. 微服务配置认证与授权

部署图

日志三件套

  • Elasticsearch(存储)
  • Logstash(收集器)
  • Kibana (数据看板)

分布式日志

Exceptionless

  • 友好的界面
  • 内置日志分类看板
  • 按团队和项目管理应用
  • 支持Web hook 发送异常通知
  • 基于.NET Core 开源

链路追踪

集成SkyWalking.NET 实现追踪

监控与警告

  1. App.Metrics 与 Influxdb

  2. Prometheus 与 AlertManager

  3. 用Granfana 实现监控看板

Granfana 核心特性

  • 支持各种主流数据源
  • 丰富的图形组件
  • 灵活的看板组织方式
  • 灵活的权限支持
  • 支持OAuth 账户支持

扩展:使用prometheus-net实现自定义监控指标

https://github.com/prometheus-net/prometheus-net