目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

微服务核心概念梳理

软件架构的进化

 软件架构是在软件的内部,经过综合各种因素的考量、权衡,选择特定的技术,将系统划分成不同的部分并使这些部分相互分工,彼此写作,为用户提高需要的价值。

因素考量

  • 业务需求
  • 技术栈
  • 成本
  • 可扩展性
  • 组织架构(分工)
  • 可维护性

架构进化史
  一层架构 -> MVC -> Dubbo

单体架构
 功能、业务集中在一个发布包里,部署运行在同一个进程中。

  • 易于开发
  • 易于测试
  • 易于部署
  • 易于水平伸缩(新建服务器、配置好环境、复制软件包)

 致命的硬伤:

  • 代码膨胀、难以维护。(分析、定位、修复、成本高)
  • 构建、部署成本大
  • 新人上手困难
  • 创新困难
  • 可扩展性差

微服务间如何通讯

通讯模式角度考虑

xxx一对一一对多
同步请求响应模式,最常见——
异步通知/请求异步响应发布订阅/发布异步响应

从通讯协议角度考虑

  • REST API
  • RPC(dubbo、dubbox、motan、grpc、thrift)
  • MQ (发布订阅模式)

如何选择RPC框架

  • I/O、线程调度模型(NIO、BIO、长连接、短连接、单线程、多线程、线程调度算法的性能如何)
  • 序列化与反序列化方式(可读XML、JSON;二进制序列化)
  • 多语言支持
  • 服务治理(服务发现、服务监控等…)

流行的RPC框架

  • Dubbo/Dubbox
  • Motan
  • Thrift
  • Grpc

主流RPC框架对比

服务发现

传统服务的服务发现
传统服务的服务发现过程

微服务
客户端发现
客户端发现

服务端发现
服务端发现

服务编排(微服务的部署、更新、扩缩容)

流行的服务编排工具

  • Mesos
  • Docker Swarm
  • Kubernetes

SpringBoot与微服务关键

 化繁为简,Springboot是Java开发微服务的润滑剂。使用SpringBoot开发微服务恰巧应对了微服务本身所具体的特征。

  • 独立运行:java - jar xxx.jar
  • 内嵌web服务器
  • 简化配置
  • 准生产的应用监控

SpringCloud与微服务

 简化Java的分布式系统的开发。
 一系列框架的集合。
 Springboot封装,屏蔽复杂性和实现原理。

SpringCloud & SpringBoot

 SpringBoot意在简化,是一种开发、配置风格。
 SpringCloud意在简化分布式,是功能和集合,风格的统一。微服务架构的一站式解决方案,以SpringBoot的风格去简化。

SpringCloud与微服务

 SpringCloud是Java的一套微服务解决方案。但并不完整,因为它侧重于功能开发,并没有提供资源管理、自动化部署等等…… 它只是Dev,而没有Ops。
 SpringCloud做微服务,最终的产出是Image镜像而已。如何合理的分配机器资源,运行镜像,这些功能SpringCloud并没有提供。需要服务编排框架:K8S等…

微服务定义

 基于有界上下⽂的(每个团队可以维护自己的数据源,而非集中式的数据源),松散耦合的⾯向服务的架构。

  • 一组小的服务:对于“小”的定义是没有明确规范的,基本一个服务可以让开发人员在大脑中容易理解,就可以称为微服务。
  • 独立的进程:微服务可以部署在容器中,容器可以部署在物理机上,以进程方式运行,以进程的方式去横向扩展微服务。
  • 轻量级通信:No SOAP,比如:HTTP JSON。
  • 基于业务能力:用户服务、登录服务、商品服务。
  • 独立部署:微服务的拆分使得每个团队维护自己的服务,演化、迭代、开发自己的微服务,团队之间不需要太多的协调,可以独立部署自己的微服务,大幅度的提高了对业务需求的迭代速度。
  • 无集中式管理:每个团队可以根据业务的特点,选最适合该业务的技术栈,每个团队均可采用不同的存储机制。

参考Martin Fowler文章。

微服务的利与弊

优势

  • 强模块化边界(类 => 类库 => 微服务)
  • 可独立部署(不需要多个团队之间协同)
  • 技术多样性(每个团队可以根据业务的特点,选最适合该业务的技术栈)

弊端

  • 分布式复杂性(多个微服务之间协作,每个团队很难清晰地理解整个系统是如何工作的)
  • 最终一致性(每个团队都有数据拷贝)
  • 运维复杂性
  • 测试复杂性

康威法则

设计系统的组织,其产⽣的架构设计等价于组织间的沟通结构。
康威法则

  • 单块应用架构与多团队之间不匹配:应用无法反应组织架构,随之带来的问题就是沟通成本很高、交付效率很低、有时甚至会产生摩擦。

微服务架构的适用性

微服务架构的适用性

单块优先原则

直接使用微服务体系的会存在以下问题:

  • 前期的基础设施投入较高、复杂性较高。
  • 初期对业务(问题领域)并没有清晰的理解,很难把控如何拆分服务、如何划分服务的边界。

单块优先原则的优势:

  • 随着业务发展,对业务领域越来越清晰,进而拆分服务,逐渐拆分、逐步细化,最后形成微服务架构,安全性相对较高。

单块优先原则

微服务组织架构

微服务组织架构

  • 微服务组织架构可以更快的响应业务员需求。

微服务中台战略

 大中台、小前台
微服务中台战略

服务分层

服务分层

微服务技术架构体系

微服务架构体系

微服务的服务发现机制

独⽴LB模式
独立LB
 传统模式,有独立LB(Nginx、F5),当Provider上线以后向运维申请DNS域名,运维人员会将此域名配置到LB中,Provider一般会部署多份,以便LB实现负载均衡功能。
 缺点:服务配置、域名配置、LB配置需要运维介入,集中的LB可能会成为单点故障,Consumer去调用后台服务的时候必须穿透LB,这势必会增加性能开销。

进程内LB模式
进程内LB
 将LB的功能集成在Consumer内,Provider将自己信息注册在Registry,并维持心跳宣告自己的存活,Consumer定期去Registry拉取最新的注册信息列表。
 优势:不需要经过中间层,直接访问Provider,避免了不必要的性能开销,也不存在LB单点故障的问题。
 缺点:在多语言环境中必须为每一个消费者开发一个consumer,升级成本和多语言支持成本较高。

主机独⽴进程LB模式
主机独⽴进程LB
 在每台主机上部署一个独立的LB进程,既没有独立LB的单点故障和性能问题,也可以支持多语言,对于consumer来说更加友好,比较灵活的介入,不需要为每种语言开发客户端。
 缺点:运维成本较高,每台主机上需要部署一个LB进程。

微服务API网关

API网关

  • 屏蔽内部服务细节,对外提供统一的接口。
  • 反向路由:将外部请求匹配到内部的具体服务的调用。
  • 安全认证:鉴权。
  • 限流熔断
  • 日志监控

微服务路由发现体系

微服务路由发现体系

微服务配置中心

配置中心

  • pull拉:有点是一定可以拉取的到。
  • push推:实时性更强。

携程开源Apollo设计简图
Apollo

微服务通信方式 RPC VS REST

RPC VS REST

微服务框架的治理

微服务框架的治理

微服务的监控分层和监控架构

监控分层和监控架构

微服务调用链监控选型

Trace调⽤链监控原理
Trace调⽤链监控原理
调用链监控选型
调用链监控选型

微服务的限流熔断是如何工作的

  • 熔断:切断故障服务,阻止因服务之间级联依赖引起的雪崩效应。
  • 隔离:将硬件资源按一定比例分配给指定服务,防止某一服务占用过高的硬件资源,早期其他服务处于饥饿状态,从而引发出由一个服务导致其他服务不可用。
  • 限流:单位时间内只允许处理一定数量的请求。
  • 降级:系统后台已经无法提供足够的支撑能力,需要有一种降级能力让服务的负载不会再进一步的恶化,或是以一种简化的方式处理请求。

Netflix Hystrix 断路器原理
Hystrix 断路器原理
 当使用Hystrix熔断组件之后,服务间的通信调用封装在Hystrix Command之内,封装之后的调用就具有:熔断、限流、隔离、降级的功能。

容器部署技术、持续交付流水线、常见的发布模式

容器部署技术、持续交付流水线

  • 容器镜像解决了环境一致性的问题。
  • 容器镜像解决了不同服务部署的差异。

容器集群调度平台Mesos、基于容器的发布体系

容器集群调度平台Mesos
Mesos
基于容器的发布体系
基于容器的发布体系


作者:Soulboy