• 第09篇_SpringCloud_Alibaba

    第00章_前言

    SpringCloud Alibaba为微服务开发提供了一站式解决方案,只需非常少量的配置,即可使用服务管理、配置管理、流控与降级、分布式事务、事件驱动等功能。

    注意:请谨慎搭配SpringBoot、SpringCloud与SingCloud Alibaba之间的版本,可参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

    第01章_Nacos

    第一节 Nacos

    1. Nacos简介

    Nacos是一个易于使用的动态服务发现配置和服务管理平台,用于构建云原生应用程序。

     

     

    2. 单机版部署(Windows)

    1) 下载和解压

    Github下载Nacos的最新稳定版本(Windows平台为zip格式),解压到合适的目录即可完成安装。

     

    2) 运行和登录

    进入bin目录,执行startup.cmd -m standalone命令启动Nacos单机版,启动完成后如下:

    image-20220622184036417

    浏览器访问http://localhost:8848/nacos,通过nacos/nacos用户进行登录,进入Nacos控制面板:

    img

    更多资料可参考:https://nacos.io/zh-cn/docs/quick-start.html

     

     

    3. 集群版部署(Linux)

    1) 下载和解压

    Github下载Nacos的最新稳定版本(Linux平台为tar.gz格式),上传到Linux服务器(推荐/usr/local/nacos目录)后进行解压,并将解压后的nacos目录命名为nacos8848。

    img

     

    2) 配置端口和数据库信息

    编辑conf/application.properties文件,修改server.port属性及数据库相关配置。

    img

    注意: 请在配置数据库nacos_config中执行conf/nacos-mysql.sql下的初始化脚本。

     

    3) 配置集群信息

    复制conf/cluster.conf.example为conf/cluster.conf并进行编辑,修改为自己的Nacos集群所分配的IP地址和端口。

    img

     

    4) 复制多份实例

    复制两份nacos8848目录,分别为nacos8858、nacos8868,再修改conf/application.properties文件中的server.port属性为对应的端口。

     

    5) 配置nginx代理

    修改conf/nginx.conf,配置如下代理:

    img

     

    6) 启动集群和Nginx进行测试

    使用bin/starup.sh依次启动nacos8848、nacos8858、nacos8868,使用sbin/nginx -c /usr/local/nginx/conf/nginx.conf启动Nginx,然后访问Nginx入口http://192.168.213.128/nacos/#/login进行登录,登录后界面如下所示:

    img

     

    7) 注意事项

     

     

    第二节 Nacos Discovery

    1. Nacos Discovery简介

    Nacos Discovery可自动将服务实例及相关的元数据(如主机、端口、运行状况检查URL、主页等)注册到Nacos服务器,并集成了RestTemplate、OpenFeign和Ribbon,可以方便的进行服务间调用和负载均衡。

     

    2. 服务提供者注册到Nacos

    1) 创建SpringCloud-nacos-provider工程

     

    2) 引入Nacos Discovery及相关依赖

    注意:必须先在dependencyManagement标签中进行spring-cloud-alibaba-dependencies的依赖管理,请参考本文档前言部分。

     

    3) 配置application.yml

     

    4) 编写主启动类

     

    5) 编写业务类

     

    6) 测试

    先通过startup.cmd -m standalone启动Nacos单机版,再启动cloud-provider-payment服务,然后通过复制配置和--server.port=8132外部参数的方式启动第2个cloud-provider-payment服务组成集群。

     

     

     

    3. 服务消费者注册到Nacos

    1) 创建SpringCloud-nacos-consumer工程

     

    2) 引入Nacos Discovery及相关依赖

     

    3) 配置application.yml

     

    4) 编写主启动类

     

    5) 编写配置类

     

    6) 编写业务类

     

    7) 测试

    依次启动Nacos、cloud-provider-payment集群、cloud-consumer-order服务进行测试:

     

     

    4. Nacos Discovery Endpoint

    Nacos Discovery会给微服务添加一个nacos-discovery端点,可通过http://localhost:8131/actuator/nacos-discovery进行访问,包含了如下一些信息:

     

     

    5. 其它配置

    下面显示了Nacos Discovery的启动器的其他配置:

    配置钥匙默认值描述
    服务器地址spring.cloud.nacos.discovery.server-addr Nacos 服务器侦听器的 IP 和端口
    服务名称spring.cloud.nacos.discovery.service${spring.application.name}为当前服务命名
    重量spring.cloud.nacos.discovery.weight1取值范围:1~100。值越大,重量越大
    网卡名称spring.cloud.nacos.discovery.network-interface 如果未指定 IP 地址,则注册的 IP 地址为网卡的 IP 地址。如果未指定,则默认情况下将使用第一个网卡的 IP 地址。
    注册的 IP 地址spring.cloud.nacos.discovery.ip 最高优先级
    已注册的端口spring.cloud.nacos.discovery.port-1默认情况下将自动检测。不需要配置。
    Namespacespring.cloud.nacos.discovery.namespace 一个典型的场景是隔离不同环境的服务注册,如资源(配置、服务等)在测试和生产环境之间隔离
    访问密钥spring.cloud.nacos.discovery.access-key 阿里云账号访问密钥
    密钥spring.cloud.nacos.discovery.secret-key 阿里云账号密钥
    元数据spring.cloud.nacos.discovery.metadata 您可以以 Map 格式为服务定义一些元数据
    日志文件名spring.cloud.nacos.discovery.log-name  
    群集名称spring.cloud.nacos.discovery.cluster-nameDEFAULTNacos 的集群名称
    端点spring.cloud.nacos.discovery.endpoint 特定区域中特定服务的域名。您可以使用此域名动态检索服务器地址
    是否集成功能区ribbon.nacos.enabledtrue在大多数情况下设置为 true
    启用 Nacos 手表spring.cloud.nacos.discovery.watch.enabledtrue设置为 false 以关闭监视

     

    6. Nacos对比其它注册中心

    image-20220624100644249

    Nacos默认为AP模式(高可用),可通过如下请求切换为CP模式(一致性):

     

     

     

    第三节 Nacos Config

    1. Nacos Config简介

    Nacos Config用于集中管理微服务的外部化配置文件,支持NamespaceGroupdataId三级分类,并且当服务端配置修改后,会自动同步到客户端以及实时刷新配置信息。

     

     

    2. 支付服务使用Nacos配置中心

    1) 引入Nacos Config及相关依赖

     

    2) 配置bootstrap.yml

    如上配置会自动从Nacos服务端拉取 e786f42a-bf7c-4bf2-9917-5023f80588b8/DEMO_GROUP/cloud-provider-payment-dev.yaml 文件。

    拉取文件的公式为:${server-addr}/${namespace}/${group}/${spring.application.name}-${spring.profiles.active}.${file-extension}

     

    3) 业务类配置自动刷新

     

    4) 测试拉取配置并实时刷新

    先进入Nacos服务端,新增e786f42a-bf7c-4bf2-9917-5023f80588b8名称空间(该ID自动生成,与配置中一致即可):

    image-20220624105202528

    进入新增的namespace,新增DEMO_GROUP/cloud-provider-payment-dev.yaml文件,编辑配置如下:

    再启动支付微服务,访问http://localhost:8131/payment/info可以看到拉取的配置信息,并且当Nacos服务端配置修改时,支付服务会实时刷新配置。

    image-20220624105726315

     

    5) 通过extensionConfigs配置拉取文件

    上面的${group}/${spring.application.name}-${spring.profiles.active}.${file-extension}部分配置也可通过extensionConfigs属性来配置:

    注意:

    1. extensionConfigs中可同时配置多个dataId组成列表,列表索引越大的配置优先级越高。

    2. 使用自定义dataId的配置允许在多个应用程序之间共享配置,并且还支持一个应用程序的多个配置。

     

     

    3. Nacos Config Endpoint

    Nacos Config会给微服务添加一个nacos-config端点,可通过http://localhost:8131/actuator/nacos-config进行访问,包含了如下一些信息:

     

     

    4. 其它配置

    下面显示了Nacos Config的启动器的其他配置:

    配置属性默认值描述
    spring.cloud.nacos.config.server-addr Nacos服务器侦听器的IP(域名)和端口
    spring.cloud.nacos.config.name 配置文件名,默认为spring.application.name
    spring.cloud.nacos.config.prefix 配置文件前缀
    spring.cloud.nacos.config.encode 配置文件的编码格式
    spring.cloud.nacos.config.groupDEFAULT_GROUP所属组名
    spring.cloud.nacos.config.fileExtensionproperties配置文件后缀名,支持properties或yaml(yml)
    spring.cloud.nacos.config.timeout3000从nacos获取配置的超时时间
    spring.cloud.nacos.config.endpoint 端点
    spring.cloud.nacos.config.namespace 名称空间
    spring.cloud.nacos.config.accessKey 阿里云账号访问密钥
    spring.cloud.nacos.config.secretKey 阿里云账号密钥
    spring.cloud.nacos.config.contextPath Nacos服务器的上下文路径
    spring.cloud.nacos.config.clusterName 群集名称
    spring.cloud.nacos.config.sharedDataids 共享配置的Dataid,按","拆分
    spring.cloud.nacos.config.refreshableDataids 共享配置的动态刷新数据标识,按","拆分
    spring.cloud.nacos.config.extConfig 这是一个Config列表,有dataId、group、refresh 几个属性
    spring.cloud.nacos.config.enabledtrue是否开启Nacos自动配置
    spring.cloud.nacos.config.refresh.enabledtrue是否自动刷新Nacos配置修改

    提示:Nacos2.0.4版本以上支持配置加密,可参考https://nacos.io/zh-cn/docs/config-encryption.html

     

    第02章_Sentinel

    第一节 Sentinel

    1. Sentinel简介

    Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

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

     

    2. 单机版控制台部署

    Sentinel 的使用可以分为两个部分:

    从Github(https://github.com/alibaba/Sentinel/tags)下载Sentinel的最新稳定版本,使用java -jar sentinel-dashboard-1.8.4.jar命令运行,启动成功后如下:

    img

    注意:

    1. Sentinel要求安装JDK8+环境,并且使用了8080端口,端口可通过-Dserver.port=8080启动参数修改。

    2. 若在单台机器上运行相同服务的多个实例,则需要通过-Dcsp.sentinel.log.use.pid=true来保证不同实例日志的独立性。

     

    访问http://localhost:8080,通过sentinel/sentinel登录,进入Dashboard 界面:

    img

     

    下面是一些控制台的启动参数,包括用户名、密码、会话过期时间等。

    配置项类型默认值最小值描述
    auth.enabledbooleantrue-是否开启登录鉴权,仅用于日常测试,生产上不建议关闭
    sentinel.dashboard.auth.usernameStringsentinel-登录控制台的用户名,默认为 sentinel
    sentinel.dashboard.auth.passwordStringsentinel-登录控制台的密码,默认为 sentinel
    sentinel.dashboard.app.hideAppNoMachineMillisInteger060000是否隐藏无健康节点的应用,距离最近一次主机心跳时间的毫秒数,默认关闭
    sentinel.dashboard.removeAppNoMachineMillisInteger0120000是否自动删除无健康节点的应用,距离最近一次其下节点的心跳时间毫秒数,默认关闭
    sentinel.dashboard.unhealthyMachineMillisInteger6000030000主机失联判定,不可关闭
    sentinel.dashboard.autoRemoveMachineMillisInteger0300000距离最近心跳时间超过指定时间是否自动删除失联节点,默认关闭
    sentinel.dashboard.unhealthyMachineMillisInteger6000030000主机失联判定,不可关闭
    server.servlet.session.cookie.nameStringsentinel_dashboard_cookie-控制台应用的 cookie 名称,可单独设置避免同一域名下 cookie 名冲突

    提示:通过环境变量进行配置时,因为不支持.所以需要将其更换为_

     

     

    3. 使用Sentinel监控支付服务

    1) 引入Sentinel及相关依赖

     

    2) 配置application.yml

     

    3) 编写业务类

     

    4) 测试

    依次启动Nacos、Sentinel和支付服务,先调用http://localhost:8131/sentinel/testAhttp://localhost:8131/sentinel/testB测试业务接口,再登录Sentinel(http://localhost:8080/)查看监控情况。

    img

     

     

     

    第二节 定义资源

    1. 什么是资源?

    资源是Sentinel所保护的对象,可以是某个服务、请求URL、方法,甚至是一段代码等。默认情况下,Sentinel对一些主流框架(Web Servlet、Dubbo、Spring Cloud、gRPC、Spring WebFlux、Reactor等)进行了适配,如自动将请求路径作为资源名等。

     

    2. 通过注解定义资源

    我们也可以通过@SentinelResource注解方式来定义资源,其常用的属性如下:

    注意:

    1. 注解方式埋点不支持 private 方法。

    2. 1.6.0之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。

     

    3. 其它方式定义资源

    Sentinel也可以通过代码方式来定义资源和支持异步调用,但与业务代码耦合度高,不推荐使用,相关资料请参考官方文档

     

     

    第三节 配置规则

    1. 什么是规则?

    规则是针对特定资源如何进行处理的描述,Sentinel的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。

    Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则。

     

    2.流量控制规则(FlowRule)

    Sentinel会根据实时统计信息,在访问资源前判断是否符合所有的流量控制规则,如果超过设置的阈值,则抛出FlowException异常。

    下面是流量控制的一些配置选项:

     

    1) 直接流控模式

    直接流控模式直接对目标资源进行流控。如下设置/sentinel/testA资源的QPS阈值为1:

    image-20220628172212003

    当每秒请求数超过1次时则进行流控,默认效果为直接失败,返回 Blocked by Sentinel (flow limiting):

    image-20220628172338493

     

    2) 关联流控模式

    关联流控模式是在关联的资源访问超过阈值时,才对目标资源进行流控。如下设置/sentinel/testA资源的QPS阈值为1,关联资源为/sentinel/testB:

    image-20220628172604843

    当/sentinel/testB每秒请求数超过1次时,对/sentinel/testA进行流控。

     

    3) 链路流控模式

    链路流控模式只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。

    使用@SentinelResource注解定义doService资源如下:

    通过两条不同的链路访问该资源:

    如下设置表示只有从/sentinel/testC2访问doService资源才会被限流。

    image-20220628180440225

     

    注意:

    1. 调用doService资源时必须被SpringAOP拦截,否则链路流控规则失效。

    2. 从1.6.3版本开始,Sentinel Web Filter默认收敛所有URL的入口context,导致链路限流不生效。

      解决方案:从1.7.0版本开始,官方在CommonFilter引入了WEB_CONTEXT_UNIFY参数,用于控制是否收敛context,将其配置为false即可根据不同的URL进行链路限流。首先引入依赖如下:

      然后添加如下配置:

     

     

    4) 流控效果

    流控效果除了默认的直接失败外,还可以选择Warm Up(预热)排队等待方式。

     

     

    2. 熔断规则(DegradeRule)

    除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。

    下面是熔断的一些配置选项:

     

    1) 慢调用比例策略

    该熔断策略下,当满足下面两个条件时,则接下来一段时间内(熔断时长)该资源被熔断:

    经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若下一个请求的响应时间小于阈值则结束熔断,否则再次被熔断。

    image-20220628184620893

     

    2) 异常比例策略

    该熔断策略下,当满足下面两个条件时,则接下来一段时间内(熔断时长)该资源被熔断:

    经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若下一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

    image-20220628190241748

     

    3) 异常数策略

    该熔断策略下,当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若下一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

    image-20220628190450757

     

     

    3. 系统保护规则(SystemRule)

    从整体维度对应用入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

    系统规则支持以下的阈值类型:

    image-20220628193025765

    注意:入口流量指的是EntryType.IN类型流量,比如Web服务或Dubbo服务端接收的请求,都属于入口流量。

     

     

    4. 访问控制规则(AuthorityRule)

    访问控制规则通俗来说就是针对调用方(Origin)的黑白名单功能。主要有以下配置项:

    如下代码在访问doService资源前设置Origin为app1:

    如果对doService资源设置访问控制,则仅当白名单包含app1或黑名单不包含app1时可访问该资源,设置如下:

    img

     

    注意:调用doService资源时必须被SpringAOP拦截,否则访问控制规则失效。

     

     

    5. 热点参数规则(ParamFlowRule)

    热点参数流控是Sentinel利用LRU策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流量控制。下面是其配置说明:

    使用@SentinelResource注解定义testD资源如下:

    然后配置其默认的限流阈值为1,当值为username参数为zhangsan时,阈值为5,为lisi时,阈值为10:

    img

    注意:

    1. 热点参数规则配置时的资源名必须是@SentinelResource注解注册的资源名,而不是自动注册的URL资源。

    2. 热点参数流控仅在资源调用时包含了热点参数时才生效,否则不进行流控。

     

    6. 集群流量控制

    集群流控可以解决由于单机流量不均而造成总体限流效果不佳的问题。集群流控中有两种身份:

     

    1) 部署Token Server

    Sentinel集群限流服务端有两种启动方式:

    下面我们采用嵌入模式来演示,首先在服务集群引入Token server和Token client的相关依赖:

    然后重启集群,并调用集群中任意接口初始化Sentinel。再打开Sentinel控制台的集群流控菜单,点击新增Token server。选择一个应用内的机器作为Server,其它都作为Client。

     

    2) 测试集群流控(普通版)

    新增一条流控规则,勾选"是否集群",选择集群的阈值模式为单机均摊(根据均摊阈值*机器数量动态计算集群阈值)或总体阈值(固定的集群阈值)。

    img

    使用Postman压测集群中的一个服务节点,达到集群阈值后,发现其它服务节点也进入了限流。

    img

    提示

    1. 一般勾选"失败退化"选项,在Token Server不可用时,退化到单机限流。

    2. 热点参数流控也支持集群模式,与普通流控类似,不再赘述。

     

     

    7. 网关流量控制(Gateway)

    从1.6.0版本开始,Sentinel提供了Spring Cloud Gateway的适配模块,可以提供两种资源维度的限流:

     

    在配置网关限流规则时,一些可用的属性配置如下:

    注意

    1. Sentinel网关流控默认的粒度是route维度以及自定义API分组维度,默认不支持 URL 粒度。

    2. 网关模块在启动时添加-Dcsp.sentinel.app.type=1参数,Sentinel控制台才有API管理等菜单。

    3. 默认的降级逻辑由DefaultBlockRequestHandler处理,可通过GatewayCallbackManager.setBlockHandler()进行覆盖。

    4. Sentinel也支持Zuul1.x和Zuul2.x的流控控制,请参考官方文档!

     

    1) 网关引入Sentinel及相关依赖

     

    2) 网关配置Sentinel地址

    提示

    1. 网关配置的Routes会自动被注册为Sentinel资源,资源ID为routeId。

    2. 但有的时候Spring Cloud Gateway会自己在route名称前面拼一个前缀,如ReactiveCompositeDiscoveryClient_xxx 这种,请观察簇点链路页面实际的资源名。

     

    3) 网关配置Sentinel过滤器

     

    4) 支付服务业务代码

     

    5) 测试Route流控

    依次启动Eureka注册中心、Config配置中心(非必须)、Gateway网关(带-Dcsp.sentinel.app.type=1启动参数)、支付服务8101/8102(注册到Eureka),先测试支付服务单独访问OK,通过网关访问OK。

    img

    打开Sentinel控制台,配置Route流控如下:

    img

    然后再通过网关连续多次调用支付服务,发现出现了限流,且降级逻辑为我们自定义的降级逻辑。

    img

     

    6) 测试Route流控(限定请求属性)

    删除上述流控规则,重新添加Route流控规则如下,当URL属性userName的值为zhangsan时,限制QPS为2,其它情形不做限流:

    img

     

    7) 测试Route熔断

    删除上述流控规则,添加熔断规则如下,当1s的时间窗口内请求次数超过5次,并且慢调用的比例(响应时间大于1000ms的请求)达到了50%,则熔断1s。

    img

    异常比例策略和异常数策略和普通服务流控类似,不再赘述。

     

    8) 测试API组流控

    首先通过API管理菜单添加一个API分组,支持精确匹配、前缀匹配和正则匹配三种模式。

    img

    然后在流控规则菜单新增网关流控规则,选择API分组类型和API名称,其它配置和Route类型一致。

    img

     

    9) 网关流控配置持久化

    请参考下一章节!注意:若使用Spring Cloud Alibaba Sentinel数据源模块,需要注意网关流控规则数据源类型是gw-flow,若将网关流控规则数据源指定为flow则不生效。

     

     

    8. 规则持久化

    Sentinel默认将规则保存在内存中,如果应用重启,则所有规则需要重新配置。如需通过外部数据源进行持久化,常见实现方式有两种:

    下面介绍如何使用Nacos配置中心进行规则持久化。

     

    1) 引入sentinel-datasource-nacos依赖
    2) 配置Nacos数据源

    在application.yml中配置Nacos的地址和dataId相关信息:

    3)添加规则信息

    在Nacos配置中心对应的名称空间和组下添加对应的dataId,并选择json格式,添加一条规则。

    img

     

    4) 测试

    刷新Sentinel就可以看到添加的规则了,并且重启后也存在。

    img

     

     

    第四节 客户端调用限流

    1. 通过RestTemplate调用

    1) 准备服务端调用接口

    准备支付服务集群,注册到Nacos,提供http://localhost:8131/payment/nacoshttp://localhost:8132/payment/nacos两个服务接口,测试正常访问OK,且服务端未做流控。

     

    2) 客户端引入Sentinel及相关依赖

     

    3) 配置application.yml

    4) 编写启动类

     

    5) 全局异常处理类

    注意:该方法的参数跟返回值跟org.springframework.http.client.ClientHttpRequestInterceptor#interceptor 方法一致,其中参数多出了一个 BlockException 参数用于获取 Sentinel 捕获的异常。

     

    6) 配置RestTemplate

     

    7) 业务类

     

    8) 客户端配置限流规则

    对RestTemplate调用进行限流时,支持的资源格式为:方法类型:协议://主机:端口/路径。其中主机和端口可用服务名替代,路径可省略表示对整个服务限流。

    img

     

    9) 测试

    访问http://localhost:8230/consumer/payment/nacos,多次点击后出现限流。

    image-20220701181341058

     

     

    2. 通过openFeign调用

    1) 准备服务端调用接口

    准备支付服务集群,注册到Nacos,提供http://localhost:8131/payment/nacoshttp://localhost:8132/payment/nacos两个服务接口,测试正常访问OK,且服务端未做流控。

     

    2) 引入sentinel和openFeign相关依赖

     

    3) 配置application.yml

     

    4) 编写启动类

     

    5) 编写FeignClient

     

    6) 编写FallbackFactory类

     

    7) 业务类

     

    8) 客户端配置限流规则

    对RestTemplate调用进行限流时,支持的资源格式为:方法类型:协议://主机:端口/路径。其中主机和端口可用服务名替代,路径可省略表示对整个服务限流。

    img

     

    9) 测试

    访问http://localhost:8230/consumer/feign/payment/nacos,多次点击后出现限流。

    img

     

    10) 注意事项

    由于版本差异,Feign的parseAndValidatateMetadata方法可能不兼容,在工程下创建com.alibaba.cloud.sentinel.feign包,粘贴如下代码:

     

     

     

    第五节 其它补充

    1. Sentinel端点

    Sentinel为应用程序提供了一个端点sentinel,可通过http://localhost:8131/actuator/sentinel进行访问,包含如下一些属性:

     

    2. 拦截日志

    拦截日志记录了Sentinel在进行资源拦截时的一些日志信息,包括拦截详情日志秒级监控日志业务日志集群限流日志等。日志目录可通过csp.sentinel.log.dir启动参数进行配置,详情请参考通用配置项文档。

     

     

    3. 其它配置

    SpringCloud Alibaba Sentinel还支持如下一些配置选项:

    配置描述默认值
    spring.application.name(或project.name)Sentinel项目名称 
    spring.cloud.sentinel.enabledSentinel自动配置是否生效true
    spring.cloud.sentinel.eager是否提前触发Sentinel初始化false
    spring.cloud.sentinel.transport.port应用程序与Sentinel控制台交互的端口8719(向下探测)
    spring.cloud.sentinel.transport.dashboardSentinel控制台地址 
    spring.cloud.sentinel.transport.heartbeatIntervalMs应用程序和Sentinel控制台之间的心跳间隔 
    spring.cloud.sentinel.transport.client-ip此配置的客户端IP将注册到Sentinel服务器端 
    spring.cloud.sentinel.filter.orderServlet Filter的加载顺序Integer.MIN_VALUE
    spring.cloud.sentinel.filter.url-patternsData type is array. Refers to the collection of Servlet Filter ULR patterns/*
    spring.cloud.sentinel.filter.enabledEnable to instance CommonFiltertrue
    spring.cloud.sentinel.metric.charsetmetric文件字符集UTF-8
    spring.cloud.sentinel.metric.fileSingleSizemetric单个文件大小 
    spring.cloud.sentinel.metric.fileTotalCountmetric总文件数 
    spring.cloud.sentinel.log.dirSentinel日志文件目录 
    spring.cloud.sentinel.log.switch-pidIf PID is required for Sentinel log file namesfalse
    spring.cloud.sentinel.servlet.blockPageCustomized redirection URL. When rate limited, the request will be redirected to the pre-defined URL 
    spring.cloud.sentinel.flow.coldFactor冷因子3
    spring.cloud.sentinel.zuul.order.preSentinelZuulPreFilter的Order值10000
    spring.cloud.sentinel.zuul.order.postSentinelZuulPostFilter的Order值1000
    spring.cloud.sentinel.zuul.order.errorSentinelZuulErrorFilter的Order值-1
    spring.cloud.sentinel.scg.fallback.modeResponse mode after Spring Cloud Gateway circuit break (select or redirect response) 
    spring.cloud.sentinel.scg.fallback.redirectSpring Cloud Gateway response mode is the redirect URL corresponding to 'redirect' mode 
    spring.cloud.sentinel.scg.fallback.response-bodySpring Cloud Gateway response mode is response content corresponding to 'response' mode 
    spring.cloud.sentinel.scg.fallback.response-statusSpring Cloud Gateway response mode is the response code corresponding to 'response' mode429
    spring.cloud.sentinel.scg.fallback.content-typeThe Spring Cloud Gateway response mode is the content-type corresponding to the 'response' mode.application/json

    除此之外,也可以通过向Sentinel注册一些Bean来控制Sentinel的行为:

    Bean类型注册语句效果
    UrlCleanerWebCallbackManager.setUrlCleaner(urlCleaner)URL修改。例如将/foo/1修改为/foo/*
    UrlBlockHandlerWebCallbackManager.setUrlBlockHandler(urlBlockHandler)自定义限流逻辑
    RequestOriginParserWebCallbackManager.setRequestOriginParser(requestOriginParser)设置origin