SpringCloud

微服务概述

微服务化就是将传统的一站式应用,根据业务进行拆分成一个一个服务,彻底地去耦合,每个微服务提供单个业务服务,一个服务做一件事。

微服务:强调的时候服务的大小,关注的是某一个点,是具体解决某一个问题/提供对应服务的一个服务应用

微服务架构:一种架构模式,提供将单一应用程序划分成一组小的服务,服务之间相互协调、相互配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务之间采用轻量级的通信机制相互协作(通常是基于Http协议的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境中。另外,应当尽量避免统一的、集中式的服务管理机制,对具体的服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。

微服务优缺点

优点:足够内聚,易于维护;开发简单开发效率高,一个服务可能就是专一的只干一件事情。

缺点:需要分布式系统的复杂性;多服务运维难度;服务之间的通信成本;数据一致性;性能监控

微服务技术栈

多种技术的集合体

服务开发:Springboot 、Spring 、 SpringMVC

服务注册与发现:Eureka、Consul、Zookeeper、Nacos

服务熔断器:Hystrix、Envoy

负载均衡:Ribbon、Nginx

服务接口调用:Feign,Dubbo

消息队列:Kafka、RabbitMQ、RocketMQ

服务配置中心管理:SpringCloudConfig、Nacos

SpringCloud第一代组件

基于SpringBoot提供了一套微服务解决方案,是各个微服务架构技术落地实现的集合体,包含服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件。

SpringBoot与SpringCloud

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud关注于微服务的协调与治理,也就是对springboot开发的项目进行整合与管理。

Dubbo与SpringCloud

Dubbo的定位是一款RPC框架

SpringCloud提供的是微服务架构下的一站式解决方案

Eureka

CAP理论:Consistency数据一致性,Availability服务可用性,Partition tolerance分区容错性。

Eureka与Zookeeper区别:

  • Zookeeper注重服务的一致性,主机挂了,集群整体不对外提供服务,需要120s重选主节点才能对外提供服务;

  • Eureka注重服务的可用性,只要有一台主机活着,就能对外提供服务。

与其他注册中心组件的对比:

组件 语言 CAP 接口协议
Eureka Java AP Http
Zookeeper Java CP 客户端
Consul Go CP Http/DNS
Nacos Java AP/CP Http

服务注册:当项目(eureka客户端)启动时,就会向eureka-serever发送自己的元数据(运行的ip,端口port,健康状态的监控等),Eureka会保存这些元数据,通过RestFul api提供调用

服务续约(心跳):项目启动成功后,除了向eureka-server注册自己,还会每隔30s向eureka-server汇报自己,表示自己还活着。

服务剔除:当项目没有在90s汇报自己的情况,eureka-server会认为此节点死掉了,会将其剔除。

服务下线:当项目关闭时,会给eureka-server报告,说明自己要下机了。

Eureka Client会缓存Eureka Server的信息,即使Eureka Server全部宕掉,也可以通过缓存获取服务的信息。

多个Eureka Server会通过复制来同步服务注册列表。

Ribbon

  • 服务端负载均衡:Nginx/F5
    • 在服务器端完成请求的分发。将客户端发起的请求根据负载算法分发到不同的服务器上。
  • 客户端负载均衡:Ribbon
    • 在客户端实现负载算法。消费者客户端从注册中心拿到服务列表,通过负载算法请求具体的某一台服务器实现调用。

Eureka-client已经引入了Ribbon相关的包,通过@LoadBalanced注解即可完成负载。

Hystrix

服务雪崩 :上游服务调用下游微服务,下游服务器请求响应时间变慢,导致大量请求堆积,造成线程大量阻塞,将服务器压垮,导致整个调用链路崩溃。

hystrix熔断器可以在下游服务器超时时,阻断对下游服务的调用,防止调用链路雪崩。

hystix也可以通过设置fallback函数对服务进行降级处理。

1
2
3
4
5
6
@HystrixCommand(
threadPoolKey = "findResumeOpenStatus",
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")},
fallbackMethod = "hystrixFallback"
)

Hystrix舱壁模式(线程池隔离)
不设置线程池时,所有熔断器默认共用一个线程池中的10个线程。

1
2
3
4
5
6
7
8
@HystrixCommand(
threadPoolKey = "findResumeOpenStatus",
commandProperties = {
@HystrixProperty(name="coreSize",value = "1"),
@HystrixProperty(name = "maxQueueSize",value = "20"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")},
fallbackMethod = "hystrixFallback"
)

自定义跳闸参数,活动窗口时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 8秒钟内,请求次数达到2个,并且失败率在50%以上,就跳闸
* 跳闸后活动窗⼝设置为3s 每3s发一次请求,成功就重置熔断器
*/
@HystrixCommand(
threadPoolKey = "testHystrix",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "2"),
@HystrixProperty(name = "maxQueueSize", value = "20")
},
commandProperties = {
@HystrixProperty(name =
"execution.isolation.thread.timeoutInMilliseconds", value = "2000"),
@HystrixProperty(name =
"metrics.rollingStats.timeInMilliseconds", value = "8000"),
@HystrixProperty(name =
"circuitBreaker.requestVolumeThreshold", value = "2"),
@HystrixProperty(name =
"circuitBreaker.errorThresholdPercentage", value = "50"),
@HystrixProperty(name =
"circuitBreaker.sleepWindowInMilliseconds", value = "3000"),
},
fallbackMethod = "hystrixFallback"
)

Feign

轻量级RESTful风格的HTTP客户端,以Java注解方式发起HTTP请求,实现调用远程服务,类似于Dubbo的服务调用

与dubbo的区别:

  • Feign通过REST API实现远程调用,是基于HTTP的,服务提供者需要对外暴露HTTP接口供消费者调用。通过短连接进行通信,不适合高并发的访问。服务粒度是http接口级的。
  • Dubbo更加灵活,通过RPC调用实现远程调用,支持多种传输协议(Dubbo、http、rmi、redis等等)。默认使用Dubbo协议,采用长连接进行通信,适合高并发场景。服务粒度是方法级的。

GateWay

Spring Cloud GateWay不仅提供统⼀的路由方式(反向代理)并且基于 Filter 链的方式提供了网关基本的功能,例如:鉴权、流量控制、熔断、路径重写、日志监控等。
3

Config

Spring Cloud Config 分布式配置中心

配置文件的刷新方案:

  • 手动向Client客户端发起POST请求,http://localhost:8081/actuator/refresh , 刷新配置信息

  • 通过消息总线更新,Spring Cloud Bus(基于MQ的,支持RabbitMq/Kafka),MQ消息代理构建⼀个共用的Topic,通过这个Topic连接各个微服务实例,MQ广播的消息会被所有在注册中心的微服务实例监听和消费。

​ 手动向config server发起POST请求,http://localhost:9003/bus-refresh ,mq就会刷新所有Client配置信息

微服务统一认证授权

SpringCloud OAuth对多个微服务进行统一的认证授权。

OAuth2授权流程:

SpringCloud第二代组件(SCA)

SpringCloud Alibaba

Nacos

服务注册中心 + 配置中心

nacos领域模型:

namespace:对不同的环境进行隔离。例如开发环境,测试环境和生产环境等。

group:将若干服务和配置归为一组,通常表示某个项目。

service:某一个微服务。

dataId:一个具体的配置文件。

Nacos服务分级模型:

Sentinel

一个面向云原生微服务的流量控制,熔断降级组件。

以一种非侵入式的方式实现了服务的熔断、限流、降级,通过提供的dashboard来管理服务。

流量控制规则:

  • 快速失败:到达指定的qps货线程数后,直接拒绝请求。
  • 请求预热:将设置的qps在指定时间内,从指定值的1/3逐渐增长到指定值。场景:预防请求量的突然增长
  • 排队等待:将超出qps的请求放入队列中排队,处理后按序放行,超过指定时间还没放行的请求会直接拒绝。场景:削峰填谷

降级规则:

  • RT:超时拒绝服务,活动窗口时间过了就会恢复服务
  • 异常比例
  • 异常数

Dubbo

使用Dubbo RPC + Dubbo LB 代替 Feign + Ribbon

SpringCloud代码笔记 (github.com)