整合Sentinel客户端编码实践

Sentinel 控制台已经搭建完成,过程并不复杂。接下来笔者将结合源码讲解如何集成 Sentinel 客户端,并通过 Sentinel 控制台来配置限流规则及进行最终的限流效果演示。本节代码是在第 8 章 spring-cloud-alibaba-openfeign-demo 项目代码的基础上修改的,具体步骤如下。

  1. 修改项目名称。

    修改项目名称为 spring-cloud-alibaba-sentinel-flow-control-demo,之后把各个模块中 pom.xml 文件的 artifactId 修改为 spring-cloud-alibaba-sentinel-flow-control-demo

  2. 引入 Sentinel 依赖。

    依次打开 order-service-demogoods-service-demoshopcart-service-demo 项目中的 pom.xml 文件,在 dependencies 标签下引入 Sentinel 的依赖文件,新增代码如下:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
  3. 新增 Sentinel 配置项。

    依次打开 order-service-demogoods-service-demoshopcart-service-demo 项目中的 application.properties 配置文件,新增如下配置项:

    # 默认为 `8719`,作用是启动一个 `HTTP` 客户端服务,该服务将在 `Sentinel` 控制台进行数据交互。
    # 如果该端口被占用,则从 `8719` 依次加 `1` 扫描
    spring.cloud.sentinel.transport.port=8719
    
    # 指定 Sentinel 控制台地址
    spring.cloud.sentinel.transport.dashboard=127.0.0.1:9113
  4. 新增测试代码。

    为了后续的效果演示,在 order-service-demo 项目中 NewBeeCloudOrderAPI 类原有代码的基础上新增 4 个测试方法,新增代码如下:

    @GetMapping("/order/testChainApi1")
    public String testChainApi1 () {
        String result = orderService.getNumber(2022);
        if ("BLOCKED".equals(result)){
            return "testChainApi1 error! "+result;
        }
        return "testChainApi1 success! "+result;
    }
    
    @GetMapping("/order/testChainApi2")
    public String testChainApi2 () {
        String result = orderService.getNumber(2025);
        if ("BLOCKED".equals(result)){
            return "testChainApi2 error! "+result;
        }
        return "testChainApi2 success! "+result;
    }
    
    @GetMapping("/order/testRelateApi1")
    public String testRelateApi1() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            return "testRelateApi1 error!";
        }
        return "testRelateApi1 success!";
    }
    
    @GetMapping("/order/testRelateApi2")
    public String testRelateApi2() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            return "testRelateApi2 error!";
        }
        return "testRelateApi2 success!";
    }

到这里就完成了 Sentinel 客户端初步的整合和配置,非常简单。接下来,依次启动这三个项目(需保证 Nacos ServerSentinel 控制台已经正常运行)。

启动后,登录 Sentinel 控制台。不过,页面的导航栏依然是一片空白,无法看到这些服务实例。这时需要对服务发起几次调用,触发服务信息等数据的上报,客户端收集数据并传输给 Sentinel 控制台后,才会看到数据。

打开浏览器并在地址栏中输入如下地址:

http://localhost:8187/order/saveOrder?cartId=2022&goodsId=2035

这会向 order-service 发起请求,在代码逻辑中也会分别向 goods-serviceshopcart-service 发起 Feign 请求,所以三个服务实例的数据都会被 Sentinel 客户端上报。发起请求后,等待几秒就可以在 Sentinel 控制台页面中看到这三个微服务了,如图 11-8 所示。

左侧导航栏中已经有三个微服务实例的选项,单击后可以查看实时监控,在访问对应的微服务实例时,所有的数据都会被收集并实时显示到 Sentinel 控制台。

服务容错并不是一个很简单的技术点,需要考虑的内容和实现的功能是非常复杂的。但是由于 HystrixSentinel 等开源组件的存在,使得服务容错组件变得 “开箱即用”,开发人员不必花太多精力在服务容错的组件开发上,只要做一次技术栈的选择并整合到项目中即可,非常简单。由于这些 “开源技术” 的存在,广大的开发人员能够更加关注业务和编码,对于架构中的一些技术组件 “拿来即用” 就行。

image 2025 04 18 12 28 04 829
Figure 1. 图11-8 order-service 正常连接至 Sentinel 后的呈现效果