SA实战 ·《SpringCloud Alibaba实战》第10章(一)

Pike_Chen
发布于 2022-5-31 16:37
浏览
0收藏

 

大家好,我是冰河~~
在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。同时,我们详细介绍了服务雪崩和服务容错的一些方案。

文章总览
 SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

章节概述
今天,我们就使用Sentinel实现接口的限流,并使用Feign整合Sentinel实现服务容错的功能,让小伙伴们体验下微服务使用了服务容错功能的效果。因为我们整个专栏的内容仅仅围绕着SpringCloud Alibaba技术栈展开,所以,这里我们使用的服务容错组件是阿里开源的Sentinel。

当然,能够实现服务容错功能的组件不仅仅有Sentinel,比如:Hystrix和Resilience4J也能够实现服务容错的目的,关于Hystrix和Resilience4J不是本专栏的重点,冰河就不再赘述了,小伙伴们可以自行了解。

关于Sentinel
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel的特征

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring  Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入  Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
  • 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
    Sentinel的主要特性
     SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

Sentinel的开源生态
 SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器
    注意:上述内容来自Sentinel官方文档,链接地址为:

https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

项目整合Sentinel
在微服务项目中整合Sentinel是非常简单的,只需要在项目的pom.xml文件中引入Sentinel的依赖即可,不过在使用Sentinel时,需要安装Sentinel的控制台。

安装Sentinel控制台
Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。

(1)到链接 

https://github.com/alibaba/Sentinel/releases 

下载Sentinel控制台,如下所示,我这里下载的Sentinel控制台是1.8.4版本。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

(2)Sentinel控制台下载完成后,在本地启动Sentinel控制台,如下所示。

java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.4.jar

小伙伴们如果想在CentOS服务器上以后台进程方式启动Sentinel控制台,可以使用如下命令

nohup java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.4.jar >> /dev/null &

启动后在浏览器中输入 http://localhost:8888 访问Sentinel控制台,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

输入默认的用户名sentinel和密码sentinel,登录Sentinel控制台,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

至此,Sentinel控制台下载并启动成功。

项目集成Sentinel
(1)在订单微服务的shop-order的pom.xml文件中添加Sentinel的相关依赖,如下所示。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

(2)在订单微服务的shop-order的application.yml文中加入Sentinel相关的配置,如下所示。

spring:
  cloud:
    sentinel:
      transport:
        port: 9999   #指定和Sentinel控制台交互的端口,任意指定一个未使用的端口即可
        dashboard: 127.0.0.1:8888  #Sentinel控制台服务地址

(3)为了让大家直观的感受到Sentinel的功能,这里我们先在订单微服务的io.binghe.shop.order.controller.OrderController类中新增一个测试接口,如下所示。

@GetMapping(value = "/test_sentinel")
public String testSentinel(){
    log.info("测试Sentinel");
    return "sentinel";
}

(4)启动订单微服务,在浏览器中输入http://localhost:8080/order/test_sentinel访问在订单微服务中新增的接口,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

(5)刷新Sentinel页面,会发现已经显示了订单微服务的菜单,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

注意:直接启动订单微服务和Sentinel,会发现Sentinel中没有订单微服务的数据,因为Sentinel是懒加载机制,所以需要访问一下接口,再去访问Sentinel 就有数据了。

至此,订单微服务成功集成了Sentinel。

集成Sentinel限流功能
这里,我们使用Sentinel为http://localhost:8080/order/test_sentinel接口限流,步骤如下所示。

(1)在Sentinel控制台找到server-order下的簇点链路菜单,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

(2)在簇点链路列表中找到/test_sentinel,在右侧的操作中选择流控,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

点击流控按钮会显示 新增流控规则 的弹出框,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

这里,我们在单机阈值后直接填写1,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

配置好之后点击新增按钮。上述配置表示http://localhost:8080/order/test_sentinel接口的QPS为1,每秒访问1次。如果每秒访问的次数超过1次,则会被Sentinel限流。

(3)在浏览器上不断刷新http://localhost:8080/order/test_sentinel接口,当每秒中访问的次数超过1次时,会被Sentinel限流,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

对提交订单的接口限流
在提交订单的接口 http://localhost:8080/order/submit_order上实现限流,步骤如下。

(1)首先访问下提交订单的接口 http://localhost:8080/order/submit_order,使得Sentinel中能够捕获到提交订单的接口,并点击操作中的流控按钮,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

这里的注意点还是:直接启动订单微服务和Sentinel,会发现Sentinel中没有订单微服务的数据,因为Sentinel是懒加载机制,所以需要访问一下接口,再去访问Sentinel 就有数据了。

(2)在新增流控规则显示框中的QPS单机阈值设置为1,点击新增按钮,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

(3)在浏览器中不断刷新 http://localhost:8080/order/submit_order?userId=1001&productId=1001&count=1 使得每秒访问的频率超过1次,会被Sentinel限流,如下所示。

SA实战 ·《SpringCloud Alibaba实战》第10章(一)-鸿蒙开发者社区

 

至此,项目中集成了Sentinel并使用Sentinel实现了接口的限流。

Feign整合Sentinel实现容错
我们之前在项目中集成了Sentinel,并使用Sentinel实现了限流,如果订单微服务的下游服务,比如用户微服务和商品微服务出现故障,无法访问时,那订单微服务该如何实现服务容错呢?使用Sentinel就可以轻松实现。

添加依赖并开启支持
(1)在订单微服务的shop-order的pom.xml文件中添加Sentinel的相关依赖,如下所示。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

注意:这一步是为了整个案例的完整性加上的,如果小伙伴们按照文章实现了项目整合Sentinel,并在订单微服务的shop-order的pom.xml文件中添加了上述配置,则可忽略此步骤。

(2)在订单微服务的application.yml文件中添加如下配置开启Feign对Sentinel的支持。

feign:
  sentinel:
    enabled: true

 

文章转自公众号:冰河技术

分类
已于2022-5-31 16:37:48修改
收藏
回复
举报
回复
    相关推荐