微服务架构简介

微服务理论基础-康威法则

康威法则:“设计系统的架构受制于产生这些设计组织的沟通结构。”**即系统设计本质上反映了企业的组织机构。系统各个模块间的接口也反映了企业各个部门之间的信息流动和合作方式。

康威法则提出的各定律:

  • 第一定律 组织沟通方式会通过系统设计表达出来

    即组织的沟通方式决定了系统的设计方式
    
  • 第二定律 时间再多一件事情也不可能做的完美,但总有时间做完一件事情

    罗马不是一日建成的,学习解决首要问题。产品、软件、模块功能应该首先达到最小可用程度(Minimun Viable Product)

  • 第三定律 线性系统和线型组织架构间有潜在的异质同态特性

    这一定律是第一定律的具体应用,具体来说想要什么的系统就搭建什么样的团队,有什么样的团队就搭建什么样的系统。你需要搭建微服务架构的系统,那就需要微服务型的组织架构。每个团队负责自己的部分,对外提供相应的接口,团队间互不干扰,实现完全的**自治**。如此就能降低系统的依赖性,减少通信成本。
    
  • 第四定律 大的系统组织总是比小系统更倾向分解

    系统越复杂,越需要增加人手,人手越多,沟通成本也呈指数增长。分而治之便是大多数公司选择的解决方案。分不同的层级,分不同的小团队,让团队内部完成自治理,然后统一对外沟通。微服务架构更多是关于组织和团队,而不是技术

微服务架构定义

微服务架构是一种架构风格,没有单一的定义,随着时间的推移,业界达成已经形成共识,微服务架构的特征包括:

微服务定义

  • 一组小的服务:怎么定义这个小,专注于做好一件事情。在一个单体系统中,避免随着新功能的增加代码库日益庞大,模块之间的界限很难维护,相似的代码随处可见,通常会创建一些抽象层或者模块来保证代码的内聚性。在使用微服务架构时一个微服务同样要具有内聚性这一概念,Robert C.Martin有一个单一职责原则:把因相同原因变化的东西聚合在一起,而把不同原因而变化的东西分开。微服务中独立服务的划分程度,同样有内聚性、单一职责原则,根据业务的边界来确定某个功能代码应该放在那个微服务之中,确定该微服务专注的业务边界之内

  • 独立的进程:每个服务运行在独立的进程中,能够以进程的方式进行横向扩展。

  • 轻量级通信:服务之间均通过网络调用(HTTP REST/RPC)进行通信,从而加强服务之间的隔离性,避免紧耦合。

  • 基于业务能力:基于业务能力来划分服务的边界。确定对于一个服务来说,我们应该暴露什么,应该隐藏什么。一个服务的变动,应该尽量避免该服务消费者的变动。

  • 独立部署:每个服务模块的开发人员可以进行完全的自治,独自开发、测试、部署。团队之间减少沟通的成本。

  • 无集中式管理:每个团队可以根据各自的业务需要,可以采用不同的技术栈,不同的存储机制,能够高效的完成业务目标即可。

    总结来说:微服务架构风格就是小而自治的服务,可以采用不同技术栈,拥有独立进程,进程之间采用网络调用通信,不同团队在业务边界之内开发、测试、部署。

服务架构演进

微服务优点

  1. 技术异构性:不同的服务可以采用最适合该服务的技术。

  2. 弹性:系统一个服务故障,不会引起级联故障,系统的其他组件还能使用。

  3. 扩展:庞大的单块服务只能作为一个整体进行扩展。即使系统中只有一小部分存在性能问题,也需要对整个服务进行扩展。如果使用较小的多个服务,则可以只对需要扩展的服务进行扩展,这样就可以把那些不需要扩展的服务运行在更小的、性能稍差的硬件上。

  4. 简化部署

  5. 更小粒度的服务粒度,带来的易于重用已有的功能

  6. 服务更改维护代价更小

微服务缺点

  1. 服务间的通信成本。

  2. 分布式系统的复杂性。

  3. 服务的运维管理。

  4. 分布部署服务出错,问题的定位追踪。

微服务支撑组件

微服务只是一种架构手段,当我们将一个单体系统拆分成微服务架构风格时,微服务架构的带来问题该如何解决呢?比如服务进程之间的通信、服务之间错中复杂的依赖关系导致的线上问题如何排查、分布式系统带来的一致性问题等问题。因此微服务产生了一些系列的支撑组件:
  1. 服务治理
  2. 服务负载均衡
  3. 服务网关
  4. 熔断、限流、降级
  5. 服务分布式链路跟踪
  6. 统一配置管理

微服务组件选型

注册中心选型

NacosEurekaConsul
一致性协议CP+APAPCP
健康检查TCP/HTTP/MYSQL/Client BeatClient BeatHTTP/gRPC/TCP
负载均衡策略权重RibbonFabio
雪崩保护
自动注销实例支持支持不支持
集群支持支持支持
SpringCloud集成支持支持支持
Dubbo集成支持不支持不支持
K8s集成支持不支持支持
备注阿里开源产品,JAVA语言开发,持续维护SpringCloud Netffix组件,java语言开发Eureka2.0不在维护国外HashiCorp公司,GO语言开发,持续维护

负载均衡组件选型

RibbonSpringcloud load balancerNginx
负载方式客户端负载客户端负载服务端负载
原理每个客户端维护访问的服务清单每个客户端维护访问的服务清单服务端维护一个可用服务清单
使用方式客户端配置负载均衡策略:权重、随机、轮询、自定义规则客户端配置负载均衡策略:权重、随机、轮询、自定义规则服务端配置规则
备注Netffix开源产品,进入维护状态SpringCloud2020.0.x版本后开发的新负载均衡器传统的服务的负载均衡组件

服务网关选型

ZuulSpringCloud GatewayKong
开发语言JAVAJAVALua
使用方式自己开发Filter自己开发Filter插件
界面管理不支持不支持支持
协议HTTP/HTTPSHTTP/HTTPS/WEBSOCKETHTTP/HTTPS/WEBSOCKET
功能限流、动态路由、灰度发布、日志等功能自己开发限流、动态路由、灰度发布、日志等功能自己开发插件+自定义规则开发
备注Nettfix组件,Zuul1.0基于Serlvet,Zuul2.0支持异步SpringCloud组件,Webflux异步OpenRestry+Lua二次开发

配置中心选型

SpringCloud ConfigApolloNacos
开发语言JAVAJAVAJAVA
存储方式GIT仓库\MYSQLMYSQLMYSQL
版本管理GIT自动管理自动管理
推送机制SpringCloud BUSHTTP长轮询HTTP长轮询
权限管理支持支持不支持
备注SpringCloud全家桶组件携程开源,功能非常丰富权限管理、命名空间、多语言。集群部署可整合现有Eureka阿里开源,功能较简单,但是本身带注册中心功能。

熔断组件选型

SpringCloud Alibaba SentinelHystrixSpringCloud Resilience4j
隔离策略信号量隔离(并发控制)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于慢调用比例、异常比例、异常数基于异常比例基于异常比例、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
动态规则配置支持多种数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
流量整形支持预热模式与匀速排队控制效果不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
多语言支持Java/Go/C++JavaJava
Service Mesh 支持支持 Envoy/Istio不支持不支持
控制台提供开箱即用的控制台,可配置规则、实时监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统

服务调用链路追踪组件选型

ZipkinCATSkywalking
OpenTracing 兼容支持不支持支持
开发语言JAVAJAVAJAVA
侵入性
WebUI丰富度
监控报警不支持支持支持
备注SpringCloud全家桶组件美团开源Apache

微服务架构图

图片来源互联网:https://www.owensun.com/microservice-refercence-architecture/

img

参考文章

文章作者: 热心网民詹Sir
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 编程之家
springcloud springcloud
喜欢就支持一下吧