Sentinel工作原理

Sentinel

英 [ˈsentɪnl]

官方文档

基本概念

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。
在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。
大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

Sentinel 功能和设计理念

流量控制

什么是流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。
然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。
任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

流量控制设计理念

资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
运行指标,例如 QPS、线程池、系统负载等;
控制的效果,例如直接限流、冷启动、排队等。

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

熔断降级

什么是熔断降级

除了流量控制以外,及时对调用链路中的不稳定因素进行熔断也是 Sentinel 的使命之一。
由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会导致请求发生堆积,进而导致级联错误。

Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,
例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,
让请求快速失败,避免影响到其它的资源而导致级联故障。

熔断降级设计理念

在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。

Hystrix

Hystrix 通过 ==线程池隔离== 的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。
这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),
还需要预先给各个资源做线程池大小的分配,并且对于一些使用了 ThreadLocal 的场景来说会有问题(如 Spring 事务)。

Sentinel

通过==并发线程数==进行限制

和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。
这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,
对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。
堆积的线程完成任务后才开始继续接收请求。

针对==慢调用和异常==对资源进行降级

除了对并发线程数进行控制以外,Sentinel 还可以根据响应时间和异常等不稳定因素来快速对不稳定的调用进行熔断。
当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新渐进式地恢复。

系统自适应保护

Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。
当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。
在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。
如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

Sentinel 工作机制

Sentinel 的主要工作机制如下:

对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。

根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。

Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

nacos 部署方式

nacos 部署方式

nacos you should know

Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

单机模式下运行Nacos

Standalone means it is non-cluster Mode. *

  1. Linux/Unix/Mac

    1
    sh startup.sh -m standalone
  2. Windows

    1
    cmd startup.cmd -m standalone

单机模式支持mysql
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  1. 安装数据库,版本要求:5.6.5+
  2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
  3. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
1
2
3
4
5
6
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_config
db.password=youdontknow

windows 搭建consul

windows 搭建consul

windows 搭建consul

1
2
3
4
5
6
7
8
9
10
11
12

cmd 命令窗口执行:consul agent -dev

consul 自带 UI 界面,打开网址:http://localhost:8500 ,可以看到当前注册的服务界面



创建服务
sc create consul binPath= "C:\consul1.9.0\consul_1.9.0_windows_amd64\consul.exe agent -server -ui -bootstrap -client 0.0.0.0 -data-dir="C:\consul1.9.0\data-dir" -bind 172.16.129.139"


consul.exe agent -server -ui -bootstrap -client 0.0.0.0 -data-dir="C:\consul1.9.0\data-dir" -bind 172.16.xx.139

什么是 Nacos

什么是 Nacos

官方

使用手册

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

Nacos 的关键特性包括:

  1. 服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的 Agent TODO 注册Service后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  1. 动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI帮助您管理所有的服务和应用的配置。Nacos还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  1. 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

  1. 服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

1
2
3
4
5
Kubernetes Service

gRPC & Dubbo RPC Service

Spring Cloud RESTful Service

nacos单机模式支持mysql

单机模式支持mysql

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  1. 安装数据库,版本要求:5.6.5+
  2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
  3. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
1
2
3
4
5
6
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

SpringCloud总览

总览

Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、leader选举、分布式session、集群状态)。
分布式系统的协调导致了样板模式, 使用 Spring Cloud 开发人员可以快速地支持实现这些模式的服务和应用程序。它们可以在任何分布式环境中很好地工作,包括开发人员自己的笔记本电脑,裸机数据中心,
以及Cloud Foundry等托管平台。

Spring Cloud专注于为典型用例提供良好的开箱即用体验,并为其他用户提供可扩展性机制。

功能

功能(english) 功能
Distributed/versioned configuration 分布式/版本化配置
Service registration and discovery 服务注册和发现
Routing 智能路由
Service-to-service calls service-to-service调用
Load balancing 负载均衡
Circuit Breakers 断路器
Global locks 全局锁
Leadership election and cluster state leader选举和集群状态管理
Distributed messaging 分布式消息

主要项目

项目名称 项目职能
Spring Cloud Config Spring Cloud提供的分布式配置中心,为外部配置提供了客户端和服务端的支持。
Spring Cloud Netflix 与各种NetflixOSS组件集成(Eureka,Hystrix,Zuul,Archaius等)。
Spring Cloud Bus 用于将服务和服务实例与分布式消息传递连接在一起的事件总线。用于跨群集传播状态更改(例如,配置更改事件)。
Spring Cloud Cloudfoundry 提供应用程序与 Pivotal Cloud Foundry 集成。提供服务发现实现,还可以轻松实现受SSO和OAuth2保护的资源。
Spring Cloud Open Service Broker 为构建实现 Open service broker API 的服务代理提供了一个起点。
Spring Cloud Cluster 提供Leadership选举,如:Zookeeper, Redis, Hazelcast, Consul等常见状态模式的抽象和实现。
Spring Cloud Consul 封装了Consul操作,consul 是一个服务发现与配置工具,与Docker容器可以无缝集成。
Spring Cloud Security 基于Spring security的安全工具包,为你的应用程序添加安全控制。在Zuul代理中为负载平衡的OAuth2 rest客户端和身份验证头中继提供支持。
Spring Cloud Sleuth Spring Cloud 提供的分布式链路跟踪组件,兼容zipkin、HTracer和基于日志的跟踪(ELK)
Spring Cloud Data Flow 大数据操作工具,作为Spring XD的替代产品,它是一个混合计算模型,结合了流数据与批量数据的处理方式。
Spring Cloud Stream 数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。
Spring Cloud CLI 基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。
Spring Cloud OpenFeign 一个http client客户端,致力于减少http client客户端构建的复杂性。
Spring Cloud Gateway Spring Cloud 提供的网关服务组件
Spring Cloud Stream App Starters Spring Cloud Stream App Starters是基于Spring Boot的Spring 集成应用程序,可提供与外部系统的集成。
Spring Cloud Task 提供云端计划任务管理、任务调度。
Spring Cloud Task App Starters SpringCloud任务应用程序启动器是SpringBoot应用程序,它可以是任何进程,包括不会永远运行的Spring批处理作业,并且在有限的数据处理周期后结束/停止。
Spring Cloud Zookeeper 操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理。
Spring Cloud AWS 提供与托管的AWS集成
Spring Cloud Connectors 便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。
Spring Cloud Starters Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。
Spring Cloud Contract Spring Cloud Contract是一个总体项目,其中包含帮助用户成功实施消费者驱动合同方法的解决方案。
Spring Cloud Pipelines Spring Cloud Pipelines提供了一个固定意见的部署管道,其中包含确保您的应用程序可以零停机方式部署并轻松回滚出错的步骤。
Spring Cloud Function Spring Cloud Function通过函数促进业务逻辑的实现。 它支持Serverless 提供商之间的统一编程模型,以及独立运行(本地或PaaS)的能力。

SpringCloud 与 SpringBoot 版本兼容关系

Release Train Boot Version
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x

SpringCloud 与子工程版本关系

Component Edgware.SR5 Finchley.SR2 Finchley.BUILD-SNAPSHOT
spring-cloud-aws 1.2.3.RELEASE 2.0.1.RELEASE 2.0.1.BUILD-SNAPSHOT
spring-cloud-bus 1.3.3.RELEASE 2.0.0.RELEASE 2.0.1.BUILD-SNAPSHOT
spring-cloud-cli 1.4.1.RELEASE 2.0.0.RELEASE 2.0.1.BUILD-SNAPSHOT
spring-cloud-commons 1.3.5.RELEASE 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-contract 1.2.6.RELEASE 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-config 1.4.5.RELEASE 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-netflix 1.4.6.RELEASE 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-security 1.2.3.RELEASE 2.0.1.RELEASE 2.0.1.BUILD-SNAPSHOT
spring-cloud-cloudfoundry 1.1.2.RELEASE 2.0.1.RELEASE 2.0.1.BUILD-SNAPSHOT
spring-cloud-consul 1.3.5.RELEASE 2.0.1.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-sleuth 1.3.5.RELEASE 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-stream Ditmars.SR4 Elmhurst.SR1 Elmhurst.BUILD-SNAPSHOT
spring-cloud-zookeeper 1.2.2.RELEASE 2.0.0.RELEASE 2.0.1.BUILD-SNAPSHOT
spring-boot 1.5.16.RELEASE 2.0.6.RELEASE 2.0.7.BUILD-SNAPSHOT
spring-cloud-task 1.2.3.RELEASE 2.0.0.RELEASE 2.0.1.BUILD-SNAPSHOT
spring-cloud-vault 1.1.2.RELEASE 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-gateway 1.0.2.RELEASE 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-openfeign 2.0.2.RELEASE 2.0.2.BUILD-SNAPSHOT
spring-cloud-function 1.0.1.RELEASE 1.0.0.RELEASE 1.0.1.BUILD-SNAPSHOT

兼容

  • Finchley 构建并使用Spring Boot 2.0.x,与 Spring Boot 1.5.x 不兼容。

  • Dalston 和 Edgware 基于 Spring Boot 1.5.x 构建,不兼容 SpringBoot 2.0.x

  • Camden 版本迭代正式结束,Dalston 将于2018年12月结束使用,Edgware 将遵循 Spring Boot 1.5.x 的生命周期结束。

  • Camden 基于SpringBoot 1.4.x 构建,但是也会支持 1.5.x 版本

  • Brixton 和 Angel 迭代结束时间是2017年7月,Brixton 基于SpringBoot 1.3.x ,同时也支持 1.4.x 版本

  • Angel 基于 SpringBoot 1.2.x ,在某些方式不兼容 SpringBoot 1.3.x 。

  • Brixton 构建在SpringBoot 1.3.x ,不兼容 SpringBoot 1.2.x 。一些基于Angel的库和大多数应用程序可以在Brixton上正常运行,但如果OAuth2具备spring-cloud-security 1.0的特性,则需要在任何地方进行更改。x被使用(它们大多在1.3.0中被移到Spring Boot中)。

集群Nacos

集群Nacos

工作模式:

因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面

http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。

http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。

http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式

工作模式

环境说明:

  1. 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
  2. 64 bit JDK 1.8+;下载.配置。
  3. Maven 3.2.x+;下载.配置。
  4. 3个或3个以上Nacos节点才能构成集群。

下载

使用源码编译:

1
2
3
4
unzip nacos-source.zip
cd nacos/
mvn -Prelease-nacos clean install -U
cd nacos/distribution/target/nacos-server-1.3.0/nacos/bin

直接使用压缩包:

1
2
3
4
5
unzip nacos-server-1.3.0.zip
or
tar -xvf nacos-server-1.3.0.tar.gz

cd nacos/bin

配置集群配置文件

在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)

1
2
3
ip1:8848
ip2:8848
ip3:8848

确定数据源

使用内置数据源

无需进行任何配置

使用外置数据源

生产使用建议至少主备模式,或者采用高可用数据库。

初始化 MySQL 数据库

在nacos的解压目录nacos/的conf目录下,存在sql文件 nacos-mysql.sql

修改application.properties 配置

application.properties配置文件

启动服务器

Linux/Unix/Mac
Stand-alone mode

1
sh startup.sh -m standalone

集群模式 + 使用内置数据源

1
sh startup.sh -p embedded

集群模式 + 使用外置数据源

1
sh startup.sh

服务注册发现 和 配置管理

服务注册

1
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

服务发现

1
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=nacos.naming.serviceName'

发布配置

1
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"

获取配置

1
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

关闭服务器

Linux/Unix/Mac

1
sh shutdown.sh

SpringCloud 服务调用

SpringCloud 服务调用

目前,在Spring cloud 中服务之间通过restful方式调用有两种方式

  • restTemplate + Ribbon
  • feign

Ribbon

Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器,它可以在客户端配置 ribbonServerList(服务端列表),然后轮询请求以实现均衡负载
它在联合 Eureka 使用时ribbonServerList 会被 DiscoveryEnabledNIWSServerList 重写,扩展成从 Eureka 注册中心获取服务端列表,同时它也会用 NIWSDiscoveryPing 来取代 IPing,
它将职责委托给 Eureka 来确定服务端是否已经启动。

Feign

Spring Cloud Netflix 的微服务都是以 HTTP 接口的形式暴露的,所以可以用 Apache 的 HttpClient 或 Spring 的 RestTemplate 去調用, 而 Feign 是一個使用起來更加方便的 HTTP 客戶端,它用起來就好像調用本地方法一樣,完全感覺不到是調用的遠程方法

总结起来就是

发布到注册中心的服务方接口,是 HTTP 的,也可以不用 Ribbon 或者 Feign,直接浏览器一样能够访问
只不过 Ribbon 或者 Feign 调用起来要方便一些,最重要的是:它俩都支持软负载均衡

注意:spring-cloud-starter-feign 里面已经包含了 spring-cloud-starter-ribbon(Feign 中也使用了 Ribbon)

从实践上看,采用feign的方式更优雅(feign内部也使用了ribbon做负载均衡)。

如何理解客户端Ribbon

zuul也有负载均衡的功能,它是针对外部请求做负载,那客户端ribbon的负载均衡又是怎么一回事?

客户端ribbon的负载均衡,解决的是服务发起方(在Eureka注册的服务)对被调用的服务的负载,比如我们查询商品服务要调用显示库存和商品明细服务,通过商品服务的接口将两个服务组合,可以减少外部应用的请求,比如手机App发起一次请求即可,可以节省网络带宽,也更省电。

ribbon是对服务之间调用做负载,是服务之间的负载均衡,zuul是可以对外部请求做负载均衡。