# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(2)

从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(2)

一、sentinel:通用资源保护

1、Rest 实现熔断

Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,
在构造 RestTemplate bean 的时候需要加上 @sentinelRestTemplate 注解。

2、修改 order_service_rest 子工程(子模块)的 Controller 方法,添加降级方法:

/***   spring_cloud_sentinel_demo\order_service_rest\src\main\java\djh\it\order\controller\OrderController.java**  2024-5-5 订单的 controller 类 OrderController.java*/
package djh.it.order.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import djh.it.order.domain.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("/order")
public class OrderController {@Autowired  //注入 restTemplate 对象private RestTemplate restTemplate;@SentinelResource(blockHandler = "orderBlockHandler", fallback = "orderFallback")@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){if(id != 1){throw new RuntimeException("错误");}Product product = null;product = restTemplate.getForObject("http://service-product/product/1", Product.class);return product;}/***  定义降级逻辑:sentinel 不同于 hystrix*      需要分别定义 熔断执行的降级方法和抛出异常执行的降级方法。*/public Product orderBlockHandler(Long id){Product product = new Product();product.setProductName("触发熔断--的降级方法");return product;}public Product orderFallback(Long id){Product product = new Product();product.setProductName("抛出异常执行--的降级方法");return product;}
}

3、重新运行 order_service_rest 子工程(子模块)的启动类,进行测试:

浏览器地址栏输入:localhost:8086 登录 Sevtinel 控制台,进行设置

注意:需要 浏览器地址栏输入:localhost:9003/order/buy/1 访问请求, Sevtinel 控制台才会有服务名
(因为 Sentinel 默认是懒加载)

1)点击右侧 【service-order-rest】 服务名,再点击【簇点链路】,

会显示出 请求的方法名,

2)点击方法名(如:djh.it.order.controller.OrderController:findById(java.lang.Long))后面的【降级】

新增【降级】规则

降级策略:如:勾选【异常数】

异常数:如:(1) 时间窗口:如:(5)

点击【新增】。

3)浏览器地址栏输入正确请求:localhost:9003/order/buy/1
错误请求:localhost:9003/order/buy/2 多刷新几次,测试熔断方法执行情况。

在这里插入图片描述
在这里插入图片描述
4)等待 5 秒,输入正确请求访问又正常了 localhost:9003/order/buy/1
在这里插入图片描述

二、sentinel:加载本地配置

1、@SentinelResource 注解,可以用 value 属性,指定资源名称。

2、修改 order_service_rest 子工程(子模块)的 Controller 方法,添加 @SentinelResource 注解的 value 属性,指定资源名称。

/***   spring_cloud_sentinel_demo\order_service_rest\src\main\java\djh\it\order\controller\OrderController.java**  2024-5-5 订单的 controller 类 OrderController.java*/
package djh.it.order.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import djh.it.order.domain.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("/order")
public class OrderController {@Autowired  //注入 restTemplate 对象private RestTemplate restTemplate;/*** @SentinelResource 注解属性*      blockHandler : 声明熔断时调用的降级方法。*      fallback : 抛出异常执行的降级方法。*      value : 自定义的资源名称,如果不设置,默认为当前全类名.方法名。*/@SentinelResource(value = "orderFindByid", blockHandler = "orderBlockHandler", fallback = "orderFallback")@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){if(id != 1){throw new RuntimeException("错误");}Product product = null;product = restTemplate.getForObject("http://service-product/product/1", Product.class);return product;}/***  定义降级逻辑:sentinel 不同于 hystrix*      需要分别定义 熔断执行的降级方法和抛出异常执行的降级方法。*/public Product orderBlockHandler(Long id){Product product = new Product();product.setProductName("触发熔断--的降级方法");return product;}public Product orderFallback(Long id){Product product = new Product();product.setProductName("抛出异常执行--的降级方法");return product;}
}

在这里插入图片描述

3、一条限流规则主要由下面几个因素组成:

resource: 资源名,即限流规则的作用对象
count: 限流阈值
grade: 限流阈值类型( QPs或并发线程数 )
limitapp: 流控针对的调用来源,若为 default 则不区分调用来源。
strategy: 调用关系限流策略
controlBehavior: 流量控制效果( 直接拒绝、warm up、匀速排队 )。

4、可以在项目的 application.yml 配置文件中,添加如下配置,来读取本地配置资源文件。

#通过文件读取限流规则
spring.cloud.sentinel.datasource.dsl.file.file=classpath:flowrule.json
spring.cloud.sentinel.datasource.dsl.file.data-type=json
spring.cloud.sentinel.datasource.dsl.file.rule-type=flow

5、修改 order_service_rest 子工程(子模块)的 application.yml 配置,添加读取本地资源配置文件的配置。

##  spring_cloud_sentinel_demo\order_service_rest\src\main\resources\application.ymlserver:port: 9003  # 启动端口 命令行注入。
#  port: ${port:9003}  # 启动端口设置为动态传参,如果未传参数,默认端口为 9003spring:application:name: service-order_rest  #spring应用名, # 注意 FeignClient 不支持名字带下划线
#  main:
#    allow-bean-definition-overriding: true # SpringBoot2.1 需要设定。datasource:driver-class-name: com.mysql.jdbc.Driver  # mysql 驱动url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai# MySQL8.0 可以写成  root, 012311 或  'root', '012311'   # MySQL5.7 只能写成 'root', '012311'  # 注意用户名和密码后一定不能有空格。username: 'root'password: '12311'jpa:database: MySQLshow-sql: trueopen-in-view: truecloud:   # 配置 sentinel 服务熔断sentinel:transport:dashboard: localhost:8086  # sentienl 控制台的请求地址。datasource:ds1:file:file: classpath:flowrule.jsondata-type: jsonrule-type: floweureka:  # 配置 Eurekaclient:service-url:defaultZone: http://localhost:9000/eureka/  # 多个 eurekaserver 用 , 隔开。instance:prefer-ip-address: true  # 使用 ip 地址注册instance-id: ${spring.cloud.client.ip-address}:${server.port}

在这里插入图片描述

6、在 order_service_rest 子工程(子模块)的 Resource 资源根目录下,创建 加载本地 Sentinel 设置的文件 flowrule.json 。

[{"resource": "orderFindById","controlBehavior": 0,"count": 1,"grade": 1,"limitApp": "default","strategy": 0}
]

在这里插入图片描述

7、重新运行 order_service_rest 子工程(子模块)的启动类,进行测试:

1)浏览器地址栏输入:localhost:8086 登录 Sevtinel 控制台

2)览器地址栏输入:localhost:9003/order/buy/1 访问请求, Sevtinel 控制台

3)localhost:8086 登录 Sevtinel 控制台

点击右侧 【service-order-rest】 服务名,再点击【簇点链路】,会发现已经加载到配置的资源名称了。

在这里插入图片描述

三、sentinel:对 resttemplate 的支持

1、修改 order_service_rest 子工程(子模块)的 Controller 方法,注销掉服务降级的方法。

/***   spring_cloud_sentinel_demo\order_service_rest\src\main\java\djh\it\order\controller\OrderController.java**  2024-5-5 订单的 controller 类 OrderController.java*/
package djh.it.order.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import djh.it.order.domain.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
@RequestMapping("/order")
public class OrderController {@Autowired  //注入 restTemplate 对象private RestTemplate restTemplate;/***  @SentinelResource 注解属性*      blockHandler : 声明熔断时调用的降级方法。*      fallback : 抛出异常执行的降级方法。*      value : 自定义的资源名称,如果不设置,默认为当前全类名.方法名。**   启动类,添加 @SentinelRestTemplate 注解时(sentinel:对 resttemplate 的支持):*      就不需要添加 @SentinelResource 注解和降级方法了。*/
//    @SentinelResource(value = "orderFindByid", blockHandler = "orderBlockHandler", fallback = "orderFallback")@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){if(id != 1){throw new RuntimeException("错误");}Product product = null;product = restTemplate.getForObject("http://service-product/product/1", Product.class);return product;}//    /**
//     *  定义降级逻辑:sentinel 不同于 hystrix
//     *      需要分别定义 熔断执行的降级方法和抛出异常执行的降级方法。
//     */
//    public Product orderBlockHandler(Long id){
//        Product product = new Product();
//        product.setProductName("触发熔断--的降级方法");
//        return product;
//    }
//    public Product orderFallback(Long id){
//        Product product = new Product();
//        product.setProductName("抛出异常执行--的降级方法");
//        return product;
//    }
}

在这里插入图片描述

2、修改 order_service_rest 子工程(子模块)的 启动类,添加 @SentinelRestTemplate 注解。

/***    spring_cloud_sentinel_demo\order_service_rest\src\main\java\djh\it\order\OrderApplication.java**   2024-5-5  启动类 OrderApplication.java*/
package djh.it.order;import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate;
//import org.apache.tomcat.util.ExceptionUtils;
import djh.it.order.exception.ExceptionUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
//import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EntityScan("djh.it.order.domain")
@EnableEurekaClient  //激活 EurekaClient,同 @EnableDiscoveryClient 注解相同。
//@EnableFeignClients  //激活 Feign
@EnableCircuitBreaker  // 2)激活 hystrix,  Hystrix 组件 对 RestTemplate 的支持4步:
@EnableHystrixDashboard  // 激活 Hystrix 基于图形化的 DashBoard(仪表板)监控平台
public class OrderApplication {/***  启动类,添加 @SentinelRestTemplate 注解时(sentinel:对 resttemplate 的支持):*      Controller 类 就不需要添加 @SentinelResource 注解和降级方法了。**   资源名:*      httpmethod:schema://host:port/path : 协议、主机、端口和路径。*      httpmethod:schema://host:port : 协议、主机和端口。**   @SentinelRestTemplate 注解:*      异常降级:*          fallback      : 降级方法*          fallbackClass : 降级配置类。*      限流熔断:*          blockHandler*          blockHandlerClass*/@LoadBalanced@Bean@SentinelRestTemplate(fallbackClass = ExceptionUtils.class, fallback = "handlerFallback",blockHandler = "handleBlock", blockHandlerClass = ExceptionUtils.class)public RestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

在这里插入图片描述

3、在 order_service_rest 子工程(子模块)创建 定义一个类和静态方法 ExceptionUtils.java

/***  spring_cloud_sentinel_demo\order_service_rest\src\main\java\djh\it\order\exception\ExceptionUtils.java**   定义一个类和静态方法 ExceptionUtils.java*/package djh.it.order.exception;import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.fastjson.JSON;
import djh.it.order.domain.Product;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;public class ExceptionUtils {/***  静态方法*      返回值: SentinelClientHttpResponse*      参数: request,byte[],clientRquestExcetion,blockException*///限流熔断业务逻辑public static SentinelClientHttpResponse handleBlock ( HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex){
//        System.err.println("0ops: " + ex.getClass().getCanonicalName());
//        return new SentinelClientHttpResponse( "限流熔断降级");Product product = new Product();product.setProductName("block");return new SentinelClientHttpResponse(JSON.toJSONString(product));}//异常降级业务逻辑public static SentinelClientHttpResponse handlerFallback(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex){
//        System.err.println("fallback: " + ex.getClass().getCanonicalName());
//        return new SentinelClientHttpResponse( "异常熔断降级");Product product = new Product();product.setProductName("Fallback");return new SentinelClientHttpResponse(JSON.toJSONString(product));}}

4、修改 order_service_rest 子工程(子模块)的 application.yml 文件,添加 sentinel 立即加载。

##  spring_cloud_sentinel_demo\order_service_rest\src\main\resources\application.ymlserver:port: 9003  # 启动端口 命令行注入。
#  port: ${port:9003}  # 启动端口设置为动态传参,如果未传参数,默认端口为 9003spring:application:name: service-order_rest  #spring应用名, # 注意 FeignClient 不支持名字带下划线
#  main:
#    allow-bean-definition-overriding: true # SpringBoot2.1 需要设定。datasource:driver-class-name: com.mysql.jdbc.Driver  # mysql 驱动url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai# MySQL8.0 可以写成  root, 012311 或  'root', '012311'   # MySQL5.7 只能写成 'root', '012311'  # 注意用户名和密码后一定不能有空格。username: 'root'password: '12311'jpa:database: MySQLshow-sql: trueopen-in-view: truecloud:   # 配置 sentinel 服务熔断sentinel:transport:dashboard: localhost:8086  # sentienl 控制台的请求地址。datasource:ds1:file:file: classpath:flowrule.jsondata-type: jsonrule-type: floweager: true  # 立即加载eureka:  # 配置 Eurekaclient:service-url:defaultZone: http://localhost:9000/eureka/  # 多个 eurekaserver 用 , 隔开。instance:prefer-ip-address: true  # 使用 ip 地址注册instance-id: ${spring.cloud.client.ip-address}:${server.port}# 配置 feign 日志的输出。
# 日志配置:NONE:GI 不输出日志,BASIC:适用于生产环境追踪问题,HEADERS:在BASIC基础上,记录请求和响应头信息,FULL:记录所有。
logging:level:djh.it.order.feign.ProductFeignClient: debug#feign:
#  client:
#    config:
#      default:
#        connectTimeout: 5000   #服务之间建立连接所用的时间  #不设置 connectTimeout 会导致 readTimeout 设置不生效
#        readTimeout: 5000   #建立连接后从服务端读取到数据用的时间
#      service-product:  # 需要调用的服务名称
#        loggerLevel: FULL
#  hystrix:  # 开启对 hystrix 的支持。
#    enabled: true#hystrix:  # 配置 hystrix 熔断(Hystrix:基于 RestTemplate 的统一降级配置)
#  command:
#    default:
#      execution:
#        isolation:
#          thread:
#            timeoutInMilliseconds: 5000  # 默认的熔断超时时间为1 秒,若1秒没有返回数据,会自动触发降级逻辑。
#      circuitBreaker:
#        requestVolumeThreshold: 5  # 触发熔断的最小请求次数,默认 20 次/秒。
#        sleepWindbwInMilliseconds: 10000  # 熔断多少秒后去尝试请求。默认打开状态的时间是 5秒
#        errorThresholdPercentage: 50  # 触发熔断的失败请求最小占比,默认 50%
#management:   # 配置 Actuator 获取 hystrix 的监控数据 暴躁端点。
#  endpoints:
#    web:
#      exposure:
#        include: '*'   # 暴露所有端点。

在这里插入图片描述

5、重新运行 order_service_rest 子工程(子模块)的启动类,进行测试:

1)浏览器地址栏输入:localhost:8086 登录 Sevtinel 控制台

2)览器地址栏输入:localhost:9003/order/buy/1 访问请求, Sevtinel 控制台

3)localhost:8086 登录 Sevtinel 控制台

点击右侧 【service-order-rest】 服务名,再点击【簇点链路】,会发现已经加载到配置的资源名称了。

4)设置【流量控制】

如:点击一个资源名称( GET:http://service-product/product/1 )

点击后面的【+流控】

阀值类型:勾选 (QPS)

单机阀值:(1)

点击 【新增】。

在这里插入图片描述

5)配置好【流量控制】后,再次刷新请求页面 localhost:9003/order/buy/1

发现点击刷新页面慢时,正常显示,点击快时,就会触发熔断保护方法。

在这里插入图片描述

在这里插入图片描述

四、sentinel:对 feign 的支持

1、修改 order_service_feign 子工程(子模块)的 pom.xml 文件,添加 sentinel 依赖坐标。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring_cloud_sentinel_demo</artifactId><groupId>djh.it</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>order_service_feign</artifactId><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!--            <version>5.1.32</version>--><version>8.0.26</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- 导入 eureka 注册中心 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- springcloud 整合 openFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- Hystrix 组件 对 RestTemplate 的支持4步:1)引入 Hystrix 依赖坐标 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!-- 引入 hystrix 的监控信息 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency><!-- 引入 sentinel 熔断 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<!--            <version>2.0.0.RELEASES</version>--></dependency></dependencies>
</project>
<!--  idea2019\spring_cloud_sentinel_demo\order_service_feign\pom.xml -->

在这里插入图片描述

2、修改 order_service_feign 子工程(子模块)的 application.yml 文件,添加 开启 sentinel 支持。

##  spring_cloud_sentinel_demo\order_service_feign\src\main\resources\application.ymlserver:port: 9002  # 启动端口 命令行注入。
#  port: ${port:9002}  # 启动端口设置为动态传参,如果未传参数,默认端口为 9002spring:application:name: service-order_feign  #spring应用名, # 注意 FeignClient 不支持名字带下划线
#  main:
#    allow-bean-definition-overriding: true # SpringBoot2.1 需要设定。datasource:driver-class-name: com.mysql.jdbc.Driver  # mysql 驱动url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai# MySQL8.0 可以写成  root, 012311 或  'root', '012311'   # MySQL5.7 只能写成 'root', '012311'  # 注意用户名和密码后一定不能有空格。username: 'root'password: '12311'jpa:database: MySQLshow-sql: trueopen-in-view: truecloud:   # 配置 sentinel 服务熔断sentinel:transport:dashboard: localhost:8086  # sentienl 控制台的请求地址。feign:   # 激活 sentinel 的支持sentinel:enabled: trueeureka:  # 配置 Eurekaclient:service-url:defaultZone: http://localhost:9000/eureka/  # 多个 eurekaserver 用 , 隔开。instance:prefer-ip-address: true  # 使用 ip 地址注册instance-id: ${spring.cloud.client.ip-address}:${server.port}

在这里插入图片描述

3、修改 order_service_feign 子工程(子模块)的 接口类,配置 FeignClient。

/***   spring_cloud_sentinel_demo\order_service_feign\src\main\java\djh\it\order\feign\ProductFeignClient.java**   2024-5-5  创建 调用 feign 组件的接口类 ProductFeignClient.java*   声明需要调用的微服务名称 @FeignClient, name: 服务提供者的名称, fallback:配置熔断发生的降级方法。*/package djh.it.order.feign;import djh.it.order.domain.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@FeignClient(name="service-product", fallback = ProductFeignClientCallBack.class)  //调用 FeignClient 并添加降级方法的支持
public interface ProductFeignClient {//配置需要调用的微服务接口@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)public Product findById(@PathVariable("id") Long id);
}

4、在 order_service_feign 子工程(子模块)创建 接口的 实现类,配置熔断方法。

/***   spring_cloud_sentinel_demo\order_service_feign\src\main\java\djh\it\order\feign\ProductFeignClientCallBack.java**   2024-5-5  创建 feign 组件的接口类 ProductFeignClient 的实现类 ProductFeignClientCallBack.java*   配置熔断触发的降级逻辑。*/package djh.it.order.feign;import djh.it.order.domain.Product;
import org.springframework.stereotype.Component;@Component
public class ProductFeignClientCallBack implements ProductFeignClient{// 熔断降级的方法public Product findById(Long id) {Product product = new Product();product.setProductName("hystrix:基于 feign 调用的熔断配置 -- feign 调用触发熔断降级的方法。");return product;}
}

5、order_service_feign 子工程(子模块)的 商品 类。

/***   spring_cloud_sentinel_demo\order_service_feign\src\main\java\djh\it\order\domain\Product.java**  2024-5-5  商品实体类 Product.java*/
package djh.it.order.domain;import lombok.Data;
import java.math.BigDecimal;@Data
public class Product {private Long id;private String productName;private Integer status;private BigDecimal price;private String productDesc;private String caption;private Integer inventory;
}

6、order_service_feign 子工程(子模块)的 Controller 类。

/***   spring_cloud_sentinel_demo\order_service_feign\src\main\java\djh\it\order\controller\OrderFeignController.java**  2024-5-5 订单的 controller 类 OrderFeignController.java*/
package djh.it.order.controller;import djh.it.order.domain.Product;
import djh.it.order.feign.ProductFeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;@RestController
@RequestMapping("/order")
public class OrderFeignController {@Resource    //按类型名称注入 调用 feign 组件的接口类 ProductFeignClient//@Autowired   //自动注入 调用 feign 组件的接口类 ProductFeignClient //有时变量名报红,可替换为 @Resource 注解private ProductFeignClient productFeignClient;@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product findById(@PathVariable Long id){Product product = null;//调用 feign 组件的接口类 的方法product = productFeignClient.findById(id);return product;}
}

7、order_service_feign 子工程(子模块)的 启动 类。

/***    spring_cloud_sentinel_demo\order_service_feign\src\main\java\djh\it\order\OrderFeignApplication.java**   2024-5-5  启动类 OrderFeignApplication.java*/
package djh.it.order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EntityScan("djh.it.order.domain")
@EnableEurekaClient  //激活 EurekaClient,同 @EnableDiscoveryClient 注解相同。
@EnableFeignClients  //激活 Feign
public class OrderFeignApplication {public static void main(String[] args) {SpringApplication.run(OrderFeignApplication.class, args);}
}

8、重新运行 order_service_feign 子工程(子模块)的启动类,进行测试:

1)浏览器地址栏输入:localhost:8086 登录 Sevtinel 控制台

2)览器地址栏输入:localhost:9002/order/buy/1 访问请求, Sevtinel 控制台

3)localhost:8086 登录 Sevtinel 控制台

点击右侧 【service-order-feign】 服务名,再点击【簇点链路】,会发现已经加载到配置的资源名称了。

4)设置【流量控制】

如:点击一个资源名称( GET:http://service-product/product/1 )

点击后面的【+流控】

阀值类型:勾选 (QPS)

单机阀值:(1)

点击 【新增】。

5)配置好【流量控制】后,再次刷新请求页面 localhost:9002/order/buy/1

发现点击刷新页面慢时,正常显示,点击快时,就会触发熔断保护方法。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上一节链接请点击 :

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[华为OD]C卷 BFS 亲子游戏 200

题目&#xff1a; 宝宝和妈妈参加亲子游戏&#xff0c;在一个二维矩阵&#xff08;N*N&#xff09;的格子地图上&#xff0c;宝宝和妈妈抽签决定各自 的位置&#xff0c;地图上每个格子有不同的Q糖果数量&#xff0c;部分格子有障碍物。 游戏规则Q是妈妈必须在最短的时间&a…

预兼容性EMC测试基础

介绍――预兼容性EMC测试的重要意义 在产品开发过程中&#xff0c;您最想做的是对器件进行测试&#xff0c;验证其是否正常工作。所有电子器件都必须在经过认证的内部测试中心内成功通过电磁兼容性EMI测试。通过 EMI测试即表明您的器件的 EMI 发射性能达到允许水平&#xff0c;…

Hive UDTF之explode函数、Lateral View侧视图

Hive UDTF之explode函数 Hive 中的 explode() 函数是一种用于处理数组类型数据的 User-Defined Table-Generating Function (UDTF)。它将数组拆分成多行&#xff0c;每个数组元素对应生成的一行数据。这在处理嵌套数据结构时非常有用&#xff0c;例如处理 JSON 格式的数据。 …

详细介绍一下PointPillars算法的网络结构

PointPillars是一种用于3D目标检测的算法&#xff0c;它主要使用了点云数据和深度学习模型。 PointPillars算法的网络结构主要可以分为三个主要阶段&#xff1a; Pillar Feature Net&#xff08;点云特征处理网络&#xff09;&#xff1a;此阶段的主要任务是将输入的点云数据转…

怎样单独提取PDF文件中的一个或几个文件?分割PDF文件的方法

在现代数字化时代&#xff0c;PDF文件已成为我们日常生活和工作中不可或缺的一部分。 一&#xff0c;首先了解什么是PDF&#xff1f; PDF&#xff0c;即“Portable Document Format”&#xff0c;意为“便携式文档格式”&#xff0c;由Adobe Systems开发。由于其跨平台、不易…

探秘Appium:Capability 进阶技巧揭秘!

简介 Appium 的除了基础的 Capability 设置&#xff0c;还提供了许多辅助配置项&#xff0c;用于优化自动化测试。这些配置项旨在执行基础配置之外的附加操作。例如&#xff1a;指定设备别名、设备 ID 或是设置超时时间等&#xff0c;虽然这些不是必需的选项&#xff0c;但是为…

【Linux系统编程】第十五弹---调试器gdb使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、背景 2、安装gdb 3、gdb的使用 总结 1、背景 前面我们学习了文件编辑器&#xff0c;项目自动化构建工具&#xff0c;以及g…

目标检测算法YOLOv6简介

YOLOv6由Chuyi Li等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2209.02976 &#xff0c;项目网页&#xff1a;https://github.c…

Python程序设计 函数(三)

练习十一 函数 第1关&#xff1a; 一元二次方程的根 定义一个函数qg&#xff0c;输入一元二次方程的系数a,b,c 当判别式大于0&#xff0c;返回1和两个根 当判别式等于0&#xff0c;返回0和两个根 当判别式小于0&#xff0c;访问-1和两个根 在主程序中&#xff0c;根据函数返回…

大模型微调之 在亚马逊AWS上实战LlaMA案例(三)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;三&#xff09; 使用 QLoRA 增强语言模型&#xff1a;Amazon SageMaker 上 LLaMA 2 的高效微调 语言模型在自然语言处理任务中发挥着关键作用&#xff0c;但训练和微调大型模型可能会占用大量内存且耗时。在本文中&…

STM32 各外设GPIO配置

高级定时器TIM1/TIM8 通用定时器TIM2/3/4/5 USART SPI I2S I2C接口 BxCAN SDIO ADC/DAC 其它I/O功能

【数据库原理及应用】期末复习汇总高校期末真题试卷08

试卷 一、选择题(每题 2 分&#xff0c;共 30 分)    1. ___ ____是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 2. 数据库类型是按照 来划分…

照片格式怎么转换jpg?利用在线图片处理工具完成操作

图片有许多不同的格式类型&#xff0c;其中我们最常见的是jpg和png等。通常在平台上上传图片时&#xff0c;大多数要求使用jpg格式较多&#xff0c;但你知道吗&#xff1f;不同的设备和软件可能有不同的默认保存格式。如果你发现你的照片不是jpg格式&#xff0c;该如何转换呢&a…

基于springboot+mybatis+vue的项目实战之前端

步骤&#xff1a; 1、项目准备&#xff1a;新建项目&#xff0c;并删除自带demo程序&#xff0c;修改application.properties. 2、使用Apifox准备好json数据的mock地址 3、编写基于vue的静态页面 4、运行 整个的目录结构如下&#xff1a; 0、项目准备 新建项目&#xff0…

MindSponge分子动力学模拟——软件架构

技术背景 在前面一篇文章中&#xff0c;我们介绍了MindSponge的两种不同的安装与使用方法&#xff0c;让大家能够上手使用。这篇文章主要讲解MindSponge的软件架构&#xff0c;并且协同mindscience仓库讲解一下二者的区别。 整体架构 首先我们来了解一下MindSponge独立仓库的…

全新策略打造智慧公厕,引领智慧城市公共卫生的信息化发展

智慧公厕的建设至关重要&#xff0c;要确保高质量、高效率&#xff0c;并以人民为中心。在规划方面&#xff0c;融合各种高精尖的技术是必不可少的。而在使用方面&#xff0c;提供更多贴心智能设备是体现温度的关键。让人民群众能够享受到更多的获得感、幸福感和安全感&#xf…

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中&#xff0c;经常会遇到一些错误信息的返回&#xff0c;存在的可能性有&#xff0c;参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误&#xff0c;可以通过perror函数输出具体描述&#xff0c;或者通过str…

CCF-Csp算法能力认证, 202303-1田地丈量(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

内网安全综合管理系统是什么 | 好用的那我王安全管理系统有哪些

内网安全综合管理系统是指一种集成终端管理、网络管理、内容管理、资产管理等功能的综合性安全管理系统。它主要对内网上的主机进行统一安全管理&#xff0c;包括对网络主机用户操作实施监督控制&#xff0c;并对主机中的安全软件&#xff08;如主机入侵监测系统、主机防火墙和…

python将两张图片对齐

目录 需要对齐的照片如下&#xff1a; 源码&#xff1a; 结果&#xff1a; 需要对齐的照片如下&#xff1a; 源码&#xff1a; import cv2 import numpy as np from matplotlib import pyplot as plt# 读取两张图片 imgA cv2.imread(./out/out/3.png) imgB cv2.imread(./…