整合Sentinel客户端编码实践
Sentinel
控制台已经搭建完成,过程并不复杂。接下来笔者将结合源码讲解如何集成 Sentinel
客户端,并通过 Sentinel
控制台来配置限流规则及进行最终的限流效果演示。本节代码是在第 8 章 spring-cloud-alibaba-openfeign-demo
项目代码的基础上修改的,具体步骤如下。
-
修改项目名称。
修改项目名称为
spring-cloud-alibaba-sentinel-flow-control-demo
,之后把各个模块中pom.xml
文件的artifactId
修改为spring-cloud-alibaba-sentinel-flow-control-demo
。 -
引入
Sentinel
依赖。依次打开
order-service-demo
、goods-service-demo
、shopcart-service-demo
项目中的pom.xml
文件,在dependencies
标签下引入Sentinel
的依赖文件,新增代码如下:<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
新增
Sentinel
配置项。依次打开
order-service-demo
、goods-service-demo
、shopcart-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
-
新增测试代码。
为了后续的效果演示,在
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 Server
和 Sentinel
控制台已经正常运行)。
启动后,登录 Sentinel
控制台。不过,页面的导航栏依然是一片空白,无法看到这些服务实例。这时需要对服务发起几次调用,触发服务信息等数据的上报,客户端收集数据并传输给 Sentinel
控制台后,才会看到数据。
打开浏览器并在地址栏中输入如下地址:
http://localhost:8187/order/saveOrder?cartId=2022&goodsId=2035
这会向 order-service
发起请求,在代码逻辑中也会分别向 goods-service
和 shopcart-service
发起 Feign
请求,所以三个服务实例的数据都会被 Sentinel
客户端上报。发起请求后,等待几秒就可以在 Sentinel
控制台页面中看到这三个微服务了,如图 11-8 所示。
左侧导航栏中已经有三个微服务实例的选项,单击后可以查看实时监控,在访问对应的微服务实例时,所有的数据都会被收集并实时显示到 Sentinel
控制台。
服务容错并不是一个很简单的技术点,需要考虑的内容和实现的功能是非常复杂的。但是由于 Hystrix
、Sentinel
等开源组件的存在,使得服务容错组件变得 “开箱即用”,开发人员不必花太多精力在服务容错的组件开发上,只要做一次技术栈的选择并整合到项目中即可,非常简单。由于这些 “开源技术” 的存在,广大的开发人员能够更加关注业务和编码,对于架构中的一些技术组件 “拿来即用” 就行。
