微服务架构设计

84 阅读6分钟

什么是微服务

  • 是一种架构风格与设计模式
  • 提倡将大的应用分割成一系列小的服务
  • 每个服务专注于各自单一的业务功能
  • 每个服务运行于独立的进程中,有清晰的服务边界
  • 采用轻量级的通信机制HTTP/REST来实现互通协作

微服务最大的特点就是“小而专”:

小:就是将原有的大应用拆分成一系列的小服务。
专:指单一职责,也就是高内聚

微服务的去中心化

去中心化的技术治理,去中心化的数据管理

  • 去中心化的技术治理,就是指每个微服务都是一个独立的软件项目,都有各自的基础设施与技术架构,因此他们可以设计得各不相同。
  • 去中心化的数据管理,即每个微服务除了有自己的基础设施,通过数据库拆分,还可以有自己的数据库。

微服务的关键技术

微服务有几个核心组件:服务网关,注册中心,微服务与发布中心。用户需要通过服务网关访问系统,而服务网关则通过注册中心访问各微服务。不仅是服务网关,所有微服务都可以通过注册中心实现相互调用。最后发布中心负责将各微服务发布到云端平台中。

  • 注册中心
  1. 有五个技术选型:Dubbo,Consul,Zookeeper, etcd, Eureka
  2. Consul是唯一一个可以支持多数据中心的框架
  3. 高可用,注册中心必须采用多节点的集群部署
  • 服务网关

服务网关职责:限流,鉴权,动态路由,服务迁移等,过滤器等 过滤器的设计实践:就是在用户访问服务网关的不同环节时,先进行拦截,执行某些校验等操作,再继续执行用户的访问流程。 五种不同类型过滤器 image.png

  1. pre过滤器就是用户访问服务网关,但服务网关还没有路由到各微服务之前进行的过滤,所有限流措施,安全检查,用户鉴权等操作都是由该过滤器来完成的。
  2. post过滤器是系统处理完用户请求,即将通过服务网关返回用户前进行的过滤。如添加一些tag到html的head中,或者对返回的json进行格式化等。
  3. routing过滤器时服务网关在进行动态路由时进行拦截,完成某些复杂的判断。如在请求html中添加tag,走压测服务或正常服务器。也可以做灰度发布。
  4. error过滤器是在系统报错的时候过滤
  5. custom过滤器则是由用户自定义过滤时间。 以上是zuul的5种过滤器,但是Spring Cloud Gateway只支持pre和post两种过滤器。
  • 熔断机制
  1. 断路器机制:断路器通常由3种状态,closed,open,half open。默认情况下,断路器处于closed状态,网络联通。当某次访问失败时,依然保持closed状态。当失败次数达到某个阈值时,触发熔断,断路器由closed状态变为open状态,此时网络故障,不再访问生产者。当断路器处于open状态时,每隔一段时间就会进入half open状态,在half open状态中,断路器会尝试去访问生产者。如果访问成功,则进入closed状态,网络恢复。如果失败则继续处于open状态。
  2. Hystrix实现熔断机制:远程调用一般有两种结果:一种时下游执行失败,返回错误信息,另一种时等待了timeout时间依然没有得到下游的响应。这两种情况下Hystrix都将调用一个fallback方法。断路器进行熔断前,需要采集之前一段时间的调用是否成功的信息。因此Hystrix还有一个采集器。
  3. Hystrix远程调用失败时,也可以通过重试机制进行故障转移,需要添加retry包。
  4. 在Ribbon中使用Hystrix
<dependency>
   <groupId>org.springframework.retry</groupId>
   <artifactId>spring-retry</artifactId>
 </dependency>
ribbon:
  # 该节点失败以后调用该节点的重试次数
  MaxAutoRetries: 1 
  # 该节点失败后调用其他节点的重试次数
  MaxAutoRetriesNextServer: 2
  # 无论网络超时还是服务无响应都进行重试
  OkToRetryOnAllOperations: true

Hystrix的属性列表

参数作用说明
groupKey表示所属的组,一个组共用线程池默认值:getClass().getSimpleName();
commandKey默认值:当前执行方法名
execution.isolation.strategy隔离策略,有THREAD和SEMAPHORE默认是Thread模式,以下几种情况可以使用SEMAPHORE模式:1) 只想控制并发度 2) 外部的方法已经做了线程隔离 3) 调用的是本地方法或者可靠度非常高,耗时特别小的方法
execution.isolation.thread.timeoutInMilliseconds超时时间默认1000,在Thread模式下,达到超时时间,可以中断。在Semaphore模式下,会登台执行完成后,再判断是否超时
execution.timeout.enabled是否打开超时
execution.isolation.thread.interruptOnTimeout是否打开超时线程中断Thread模式有效
execution.isolation.semaphore.maxConcurrentRequests信号量最大并发度默认10
fallback.isolation.semaphore.maxConcurrentRequestsfallback最大并发度默认10
circuitBreaker.requestVolumeThreshold每10秒内熔断触发的最小个数默认20
circuitBreaker.sleepWindowInMilliseconds熔断多少秒后尝试请求默认5000
circuitBreaker.errorThresholdPercentage失败率达到多少百分比后熔断默认50
circuitBreaker.forceClosed是否强行关闭熔断如果是强依赖应该设置为true
coreSize线程池coreSize默认10
maxQueueSize请求等待队列默认-1,如果使用正数,队列将从SynchronizeQueue改为LinkedBlockQueue

微服务系统设计

在微服务设计中,有6种设计模式,分别是:聚合模式,代理模式,链路模式,分支模式,异步模式,数据共享模式。

  • 聚合模式:由前端的一个聚合服务与其后面的一堆原子服务组成。基于聚合模式的微服务架构,整个系统分为网关层,聚合层,原子服务层与数据层

image.png

  • 代理模式:代理模式与聚合模式一模一样,只是将聚合服务改为代理服务。实际上代理服务与切换器类似,用于判断在什么情况下调用服务A,什么情况下调用服务B。
  • 链路模式:是将比较复杂的业务流程,拆分成多个微服务,串联起来执行。链路模式执行过程中,一个接一个的调用,然后一个接一个的返回,最终返回到第一个微服务。过程中调用者都处于等待阻塞状态,性能较差。较少使用
  • 分支模式:他是聚合模式与代理模式的组合。
  • 异步模式:
  • 数据共享模式:就是每个微服务都有自己的数据库,都只读写访问自己的数据库,而对其他数据的读写则通过接口调用交给其他微服务去执行。这是一种理想的组织形式。在微服务初期通常比较平稳的做法是先拆分应用,但暂时不拆分数据库,即采用数据共享模式。

微服务实践

待续...