微服务

1.微服务基础

  • 微服务架构特点
  1. 服务组件化,每个服务运行在其独立的进程中,服务与服务之间采用轻量级通信机制相互沟通;
  2. 按业务能力组织服务
  3. 去中心化,对具体一个服务而言,可以根据特点选择合适的语言和工具进行构件;
  4. 基础设施自动化
  • 微服务架构的优势
    技术优势
  1. 它提供的是一种高内聚、低耦合的组件化方案,组件能带来的独立性和健壮性微服务都可以具备,但微服务的的组件化更多表现在对业务的提炼和对边界的思考;
  2. 通过对服务的拆分,单个服务在保持通信方式不变的情况下,可以对内部进行相关升级改造而不影响外部依赖它的服务;
  3. 可以用来改造遗留系统,即遗留系统提供相关接口微服务架构就可以与之进行通信完成功能整合;
  4. 使得持续交付通过简单可重复的流程来确保软件发布过程的可靠性;

业务和组织优势

  1. 微服务架构的技术特征决定了开发各自微服务的团队之间只需要进行较少的协调工作,这可以降低软件研发过程浪费;
  2. 通过并行的开发模式,可以缩短产品开发周期;

2.服务建模

  • 服务模型提供服务的概念模型,并给出服务的统一表现形式:
  • 服务标准包括以下:
  • 服务无状态;
  • 服务可重用;
  • 服务可发现;
  • 服务自治;
  • 服务松耦合;
  • 服务级别可以从具体事故发生时服务对用户体验的影响、造成的损失等角度进行分级;
  • 服务的数据 :在针对规范化数据模型存在的数据中心化问题中,微服务架构中数据管理的基本思路是数据去中心化,包括跨表查询、跨库查询以及技术解耦等,其中主流采用的流程如下:
  1. 代码分离;
  2. 重复数据库模式;
  3. 迁移数据读写操作;
  4. 抽取服务化接口;

3.服务拆分与集成

  • 服务拆分:在微服务架构中,服务是业务能力的代表,需要围绕业务进行组织,服务拆分的关键在于正确理解业务,识别单体内部的业务领域及其边界,并按边界进行拆分。
    拆分存在两大维度:业务数据
    服务拆分通常有两种模式:
  • 绞杀者模式:在现有系统外围将新功能用新的方式构件为新的服务的,通过将新功能做成微服务方式而不是直接修改原有系统,逐步的实现对老系统的替换,适用于规模很大且安逸对现有架构进行修改的遗留系统;
  • 修缮者模式:通过将老旧待修缮的部分进行隔离,并用新的方式对其进行单独修复,修复的同时保证可以与其他部分能协同工作,它表现的更多的是一种重构技术
  • 服务集成:服务之间的集成关系远比简单的API调用要复杂,正常的思路是采用标准化的数据结构并降低系统集成的耦合度,一般服务的集成模式可以分为以下几类:
  • 接口集成:是服务之间集成的常见手段,通常是基于业务逻辑的需要进行集成。RPCREST消息传递服务总线都可以归为这种集成方式;
  • 数据集成:一般有共享数据库数据复制等方式;
  • 客户端集成:可以选用直接集成,使用 FrontEnd 服务器 和使用 API网关等。

4. 微服务架构的基础组件和关键要素

基础组件

  • 事件驱动架构:可传输与松散耦合的组件和服务之间,提供了系统扩展性上的优势;
  • 集群:将几台服务器集中在一起,实现同一业务;
  • 负载均衡:将请求分摊到集群中的多个服务器上进行执行,有 服务器端负载均衡和客户端负载均衡;
  • 服务路由:包括直接路由,间接路由和路由规则;
  • API网关:是一种外观模式的具体体现,是一种服务器端应用程序,是系统访问的唯一入口,它使得所有客户端和消费端都通过同一的网关接入微服务,在网关层处理通用的非业务功能;
  • 配置中心:采用集中式配置管理的设计思想,需要确保集群中同一类服务的所有服务器保存同一份配置文件并且能够同步更新;

关键元素

  • 服务注册中心:在微服务架构中,服务治理是最关键的一个要素,各个服务都需要通过服务治理实现自动化的注册和发现,服务治理的需求来源于服务的数量。注册中心应该具备发布-订阅功能,且在数据变更时可以主动推送变更到该服务的消费者从而实现间接路由。(注:因为服务提供者和消费者同时依赖注册中心,因此需要保持数据的一致性,即在任何时候提供者和消费者都应该看到同一份数据);
  • 服务可靠性方案:各个服务都是独立部署且服务与服务之间相互依存。但有错误产生式应该降低错误的影响范围,保证其他服务仍旧可正常运行。
    对于服务的提供者,自身服务发生错误,应该快速返回合理的处理结果,对于消费者应该关注但有错误的结果接收时正确应对使得自身不被其影响。对于服务的失败,比较常见的应对策略就是超时机制重试机制,在使用时也应该主动限制合理的超时时长和重试次数。
    服务隔离:对系统或资源进行分割,当产生问题时限定传播范围和影响范围,常见的错误包括:线程隔离、进程隔离、集群隔离、机房隔离和读写隔离等。
    服务熔断:设定某个异常条件,当条件触发时直接熔断整个服务,在之后进行服务降级(准备一个本地的回退方法,告诉消费者当前服务不可用)。