# 服务接入 Sentinel 规范 为了正常使用 DCE 5.0 微服务引擎提供的 [Sentinel 流量治理](../trad-ms/hosted/plugins/sentinel.md)和查看 [Sentinel 数据监控](../trad-ms/hosted/monitor/components.md),需要将应用接入 Sentinel 控制台,并且传递应用参数时需要满足一定规范。 ## JAVA(无框架) !!! note - 下述操作使用于任何版本的 Sentinel SDK 版本。 - 使用下述方式接入服务时,使用界面创建规则并不会生效,因为客户端并无连接 Nacos 等存储获取规则,而是直接基于内存设置规则。 - 下述方式主要适用于 Sentinel 快速接入验证或者没有使用 Spring Cloud 框架的场景。 1. 在 `pom.xml` 文件中添加依赖项。 ```xml com.alibaba.csp sentinel-core 1.8.6 com.alibaba.csp sentinel-transport-simple-http 1.8.6 ``` 2. 使用 Sentinel API 设置规则。 ```java private static void initFlowRules(){ List rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("HelloWorld"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // Set limit QPS to 20. rule.setCount(20); rules.add(rule); FlowRuleManager.loadRules(rules); } ``` 3. 使用 Sentinel API 定义资源。 ```java public static void main( String[] args ) { // 配置规则 initFlowRules(); while (true) { // 1.5.0 版本开始可以直接利用 try-with-resources 特性 try (Entry entry = SphU.entry("HelloWorld")) { // 被保护的逻辑 System.out.println("hello world"); } catch (BlockException ex) { // 处理被流控的逻辑 System.out.println("blocked!"); } } } ``` 4. 添加 jvm 参数连接 Sentinel 控制台,并启动应用。 ```shell # ip:port 为 Sentinel 控制台地址 -Dcsp.sentinel.dashboard.server=10.6.176.50:32196 ``` 5. 打开 Sentinel 控制台,找到相应应用验证流控效果。 ![screenshot](../images/sentinel01.png) ## JAVA(SpringCloud)框架 接入 SpringCloud 框架的微服务时,需要符合以下要求。 ### project.name 名称规范 应用接入 Sentinel 控制台的参数 `project.name` 必须使用如下格式: ```java {{nacos_namespace_id}}@@{{nacos_group}}@@{{appName}} ``` !!! note - 符合此规范时,Sentinel 的治理规则会被推送到对应命名空间下,对应配置分组中的配置中心。 - 第一部分 `{{nacos_namespace_id}}` 指的是 Nacos 命名空间的 **ID**,而非命名空间的名称。 - Nacos 的 `public` 命名空间对应的 ID 是空字符 “”。如果想把应用接入 `public` 命名空间,必须使用空字符串,例如 `@@A@@appA`。 - 必须符合此规范,否则会引起未知错误。 ### Sentinel 写入 Nacos 配置中心 dataId 的命名规范 - 流控规则:{{appName}}-flow-rules - 熔断规则:{{appName}}-degrade-rules - 系统规则:{{appName}}-system-rules - 授权规则:{{appName}}-authority-rules - 热点规则:{{appName}}-param-rules appName 为 project.name 三段式的最后一段。 ### Sentinel 与 Nacos 约定的内置通讯用户 ```yaml username: skoala password: 98985ba0-da90-41f6-b6dc-96f2ec49d973 ``` ### 推荐的接入方式 满足上述三项条件之后,推荐使用下述接入方式将 SpringCloud 框架的微服务接入 Sentinel。 !!! note - 满足上述三项条件后,DCE 5.0 微服务引擎并不强制要求使用某种特定的接入方式。 - DCE 5.0 微服务引擎完全兼容相关开源框架使用,开发者可以根据需求灵活使用合适的接入方式。 1. 在 `pom.xml` 文件中添加依赖项, 版本对应关系参考:[版本说明](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/版本说明)。 ```xml com.alibaba.cloud spring-cloud-starter-alibaba-sentinel com.alibaba.csp sentinel-datasource-nacos org.springframework.boot spring-boot-starter-web ``` 1. 在项目中添加 `application.yaml` 配置文件。 ```yaml title="application.yaml" nacos: # Nacos 地址 address: 10.6.176.50:30760 # Nacos 配置中心命名空间 namespace: # Nacos 配置中心分组 group: DEFAULT_GROUP # 接入 sentinel 控制台的应用名 project: name: ${nacos.namespace}@@${nacos.group}@@${spring.application.name} spring: application: name: daocloud-springcloud cloud: sentinel: # Sentinel Nacos 数据源 datasource: flow: nacos: server-addr: ${nacos.address} dataId: ${spring.application.name}-flow-rules groupId: ${nacos.group} namespace: ${nacos.namespace} # 微服务引擎规定:Nacos 和 Sentinel 约定的用户及密码 username: skoala password: 98985ba0-da90-41f6-b6dc-96f2ec49d973 ruleType: flow degrade: nacos: server-addr: ${nacos.address} # 微服务引擎规定:Sentinel 写入 Nacos 的名称约定 dataId: ${spring.application.name}-degrade-rules groupId: ${nacos.group} namespace: ${nacos.namespace} # 微服务引擎规定:Nacos 和 Sentinel 约定的用户及密码 username: skoala password: 98985ba0-da90-41f6-b6dc-96f2ec49d973 rule-type: degrade system: nacos: server-addr: ${nacos.address} # 微服务引擎规定:Sentinel 写入 Nacos 的名称约定 dataId: ${spring.application.name}-system-rules groupId: ${nacos.group} namespace: ${nacos.namespace} # 微服务引擎规定:Nacos 和 Sentinel 约定的用户及密码 username: skoala password: 98985ba0-da90-41f6-b6dc-96f2ec49d973 rule-type: system authority: nacos: server-addr: ${nacos.address} # 微服务引擎规定:sentinel 写入 nacos 的名称约定 dataId: ${spring.application.name}-authority-rules groupId: ${nacos.group} namespace: ${nacos.namespace} # 微服务引擎规定:nacos 和 sentinel 约定的用户及密码 username: skoala password: 98985ba0-da90-41f6-b6dc-96f2ec49d973 rule-type: authority param-flow: nacos: server-addr: ${nacos.address} # 微服务引擎规定:sentinel 写入 nacos 的名称约定 dataId: ${spring.application.name}-param-rules groupId: ${nacos.group} namespace: ${nacos.namespace} # 微服务引擎规定:nacos 和 sentinel 约定的用户及密码 username: skoala password: 98985ba0-da90-41f6-b6dc-96f2ec49d973 rule-type: param-flow ``` 1. 编写相关的 Web API。 ```java @SpringBootApplication @RestController @RequestMapping public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } @GetMapping("/hello") public String hello(){ return "hello world"; } } ``` 1. 在 Sentinel 控制台创建流控规则。 ![screenshot](../images/sentinel02.png) 1. 启动应用并添加连接 Sentinel 控制台的 jvm 参数 ```java -Dcsp.sentinel.dashboard.server=10.6.176.50:32196 ``` 1. 使用脚本访问设置了流控规则的 Web API。例如: ```java while true; do curl http://localhost:8080/hello; done ``` 1. Sentinel 控制台验证规则是否生效。 ![screenshot](../images/sentinel03.png)