Java之 Spring Cloud 微服务搭建Sentinel (第二个阶段)【三】【SpringBoot项目实现商品服务器端是调用

Sentinel官方提供了详细的由Hystrix 迁移到Sentinel 的方法

在这里插入图片描述

(4) 名词解释

Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合Dashboard 可以取得最好的效果。

使用 Sentinel 来进行熔断保护,主要分为几个步骤:

  1. 定义资源

  2. 定义规则

  3. 检验规则是否生效

资源:可以是任何东西,一个服务,服务里的方法,甚至是一段代码。

规则:Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和 热点参数规则。

Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效先把可能需要保护的资源定义好,之后再配置规则。

也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

3、Sentinel中的管理控制台


(1)下载启动控制台

1)获取 Sentinel 控制台

您可以从官方网站中下载最新版本的控制台 jar 包,下载地址如下:

https://github.com/alibaba/Sentinel/releases/download/1.6.3/sentinel-dashboard-1.6.3.jar

2)启动

使用如下命令启动控制台:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar

其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080

Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel 。可以参考 鉴权模块文档 配置用户名和密码。

启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

在这里插入图片描述

访问:

http://localhost:8080/#/login

在这里插入图片描述

在这里插入图片描述

4 、基于Sentinel的服务保护


(1)客户端能接入控制台(将所有的服务交给控制台管理)

控制台启动后,客户端需要按照以下步骤接入到控制台。

1)创建案例

之前都已经创建过这里直接导入代码学习即可

代码下载地址

https://download.csdn.net/download/qq_44757034/49774279

在这里插入图片描述

启动所有项目

在这里插入图片描述

2)引入依赖

需要注意SpringCloud-Alibaba与SpringCloud的版本关系

在这里插入图片描述

父工程引入alibaba实现的SpringCloud

在这里插入图片描述

com.alibaba.cloud

spring-cloud-alibaba-dependencies

2.1.0.RELEASE

pom

import

子工程中引入sentinel

  • order_service_feign

在这里插入图片描述

  • order_service_rest

在这里插入图片描述

com.alibaba.cloud

spring-cloud-starter-alibaba-sentinel

3)配置参数
  • 在order_service_rest当中的application.yml

在这里插入图片描述

cloud:

sentinel:

transport:

dashboard: localhost:8080 #sentinel控制台的请求地址

  • order_service_feign当中的application.yml

在这里插入图片描述

cloud:

sentinel:

transport:

dashboard: localhost:8080 #sentinel控制台的请求地址

4)启动运行测试

在这里插入图片描述

在这里插入图片描述

访问:http://localhost:9003/order/buy/1

在这里插入图片描述

http://localhost:9004/order/buy/1

在这里插入图片描述

访问:http://localhost:8080/#/login

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(2)通用的资源保护

1)修改order_service_rest当中的OrderController

在这里插入图片描述

package cn.itbluebox.order.controller;

import cn.itbluebox.order.entity.Product;

import com.alibaba.csp.sentinel.annotation.SentinelResource;

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

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(“错误”);

}

return restTemplate.getForObject(“http://service-product/product/1”,Product.class);

}

/**

  • 定义降级逻辑

  • hystrix和sentinel

  •  熔断执行的降级方法
    
  •  抛出异常执行的降级方法
    

*/

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;

}

}

在这里插入图片描述

在需要被保护的方法上使用@SentinelResource注解进行熔断配置。与Hystrix不同的是,Sentinel对抛

出异常和熔断降级做了更加细致的区分,通过 blockHandler 指定熔断降级方法,通过 fallback 指定

触发异常执行的降级方法。

2)运行测试

在这里插入图片描述

访问http://localhost:9004/order/buy/1

在这里插入图片描述

访问http://localhost:8080/#/dashboard/metric/service-order-rest

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

访问测试:http://localhost:9004/order/buy/2进入降级方法

在这里插入图片描述

多刷新上述访问我们再次访问http://localhost:9004/order/buy/1也进入降级方法

在这里插入图片描述

等待5s以后再次访问http://localhost:9004/order/buy/1

恢复正常状态,退出降级方法

在这里插入图片描述

3)对于@SentinelResource的其他配置如下表:

在这里插入图片描述

在这里插入图片描述

注:1.6.0 之前的版本 fallback 函数只针对降级异常( DegradeException )进行处理,不能针对业务异常进行处理。

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。

若未配置 blockHandler 、 fallback 和 defaultFallback ,则被限流降级时会BlockException 直接抛出。

5 、加载本地配置


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

resource:资源名,即限流规则的作用对象

count: 限流阈值

grade: 限流阈值类型(QPS 或并发线程数)

limitApp: 流控针对的调用来源,若为 default 则不区分调用来源

strategy: 调用关系限流策略

controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

java代码 RuleConstant

配置文件添加如下配置

#通过文件读取限流规则

spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json

spring.cloud.sentinel.datasource.ds1.file.data-type=json

spring.cloud.sentinel.datasource.ds1.file.rule-type=flow

1)修改order_service_rest当中的application.yml

在这里插入图片描述

ds1:

file:

file: classpath:flowrule.json

data-type: json

rule-type: flow

eager: true #立即加载

2)创建flowrule.json

在这里插入图片描述

[

{

“resource”: “orderFindById”,

“controlBehavior”: 0,

“count”: 1,

“grade”: 1,

“limitApp”: “default”,

“strategy”: 0

}

]

3)运行测试

在这里插入图片描述

访问:http://localhost:9004/order/buy/1

在这里插入图片描述

访问:http://localhost:8080/#/dashboard/identity/service-order-rest

在这里插入图片描述

6 、RestTemplate的资源保护


(1)修改order_service_rest当中的OrderController

去除之前配置的关于熔断的方法

在这里插入图片描述

package cn.itbluebox.order.controller;

import cn.itbluebox.order.entity.Product;

import com.alibaba.csp.sentinel.annotation.SentinelResource;

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

private RestTemplate restTemplate;

/**

  • @SentinelResource

  •  blockHandler : 声明熔断时调用的降级方法
    
  •  fallback : 抛出异常执行的降级方法
    
  •  value : 自定义的资源名称
    
  •      * 不设置:当前全类名.方法名
    

*/

@RequestMapping(value = “/buy/{id}”,method = RequestMethod.GET)

public Product findById(@PathVariable Long id) {

if(id != 1) {

throw new RuntimeException(“错误”);

}

return restTemplate.getForObject(“http://service-product/product/1”,Product.class);

}

}

(2)在order_service_rest当中的RestOrderApplication上测试

1)创建ExceptionUtils

在这里插入图片描述

package cn.itbluebox.order.exception;

import cn.itbluebox.order.entity.Product;

import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse;

import com.alibaba.csp.sentinel.slots.block.BlockException;

import com.alibaba.fastjson.JSON;

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) {

Product product = new Product();

product.setProductName(“限流熔断降级”);

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

image

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

image

2、Redis学习笔记及学习思维脑图

image

3、数据面试必备20题+数据库性能优化的21个最佳实践

image

tpResponse handleBlock(HttpRequest request, byte[] body,

ClientHttpRequestExecution execution,

BlockException ex) {

Product product = new Product();

product.setProductName(“限流熔断降级”);

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

[外链图片转存中…(img-1g1XQZO7-1714337818521)]

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

[外链图片转存中…(img-3lTQobcc-1714337818522)]

2、Redis学习笔记及学习思维脑图

[外链图片转存中…(img-2SNOHBR2-1714337818522)]

3、数据面试必备20题+数据库性能优化的21个最佳实践

[外链图片转存中…(img-ePheKTFk-1714337818523)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于 Spring Cloud+Spring Boot+Nacos+Dubbo+mybatis plus+RocketMQ+Sentinel+Seata+mysql 搭建一个项目的步骤: 1. 首先,你需要安装并启动 Nacos 作为服务注册中心和配置中心。可以去官网下载最新版本的 Nacos,然后解压并启动即可。 2. 接下来,使用 Spring Initializr 创建一个基于 Spring Boot 的项目,并添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-seata</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-sentinel</artifactId> </dependency> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 3. 配置 Nacos 作为服务注册中心和配置中心: ``` spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.prefix=/config spring.cloud.nacos.config.file-extension=properties ``` 4. 配置 Dubbo: ``` spring.application.name=provider-service spring.dubbo.application.name=provider-service spring.dubbo.registry.address=nacos://127.0.0.1:8848 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=20880 ``` 5. 配置 RocketMQ: ``` spring.rocketmq.name-server=127.0.0.1:9876 spring.rocketmq.producer.group=producer-group spring.rocketmq.consumer.group=consumer-group ``` 6. 配置 Sentinel: ``` spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080 ``` 7. 配置 Seata: ``` spring.cloud.alibaba.seata.tx-service-group=my_seata_tx_group spring.cloud.alibaba.seata.tx-service-mode=AT spring.cloud.alibaba.seata.config.type=nacos spring.cloud.alibaba.seata.config.nacos.server-addr=127.0.0.1:8848 spring.cloud.alibaba.seata.config.nacos.namespace=seata-dev ``` 8. 配置 MySQL 数据源: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 9. 编写 Dubbo 服务接口和实现类: ``` public interface UserService { User getUserById(Long id); } @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User getUserById(Long id) { return userDao.selectById(id); } } ``` 10. 配置 Dubbo 服务提供者: ``` @Configuration public class DubboConfig { @Reference private UserService userService; @Bean public ApplicationRunner runner() { return args -> { User user = userService.getUserById(1L); System.out.println(user); }; } } ``` 11. 编写 RocketMQ 生产者和消费者: ``` @Component public class MessageProducer { @Autowired private RocketMQTemplate rocketMQTemplate; public void send(String message) { rocketMQTemplate.convertAndSend("test-topic", message); } } @Component @RocketMQMessageListener(topic = "test-topic", consumerGroup = "test-consumer-group") public class MessageConsumer implements RocketMQListener<String> { @Override public void onMessage(String message) { System.out.println("Received message: " + message); } } ``` 12. 编写 MySQL 数据访问层: ``` @Mapper public interface UserDao extends BaseMapper<User> { } ``` 13. 使用 Seata 进行分布式事务控制: ``` @Service public class OrderServiceImpl implements OrderService { @Autowired private OrderDao orderDao; @GlobalTransactional @Override public void createOrder(Order order) { orderDao.insert(order); // 调用其他服务,可能会涉及到分布式事务操作 // ... } } ``` 14. 使用 Sentinel 进行服务限流和熔断: ``` @GetMapping("/hello") @SentinelResource(value = "hello", blockHandler = "helloBlockHandler") public String hello() { return "Hello World!"; } public String helloBlockHandler(BlockException ex) { return "Blocked by Sentinel: " + ex.getClass().getSimpleName(); } ``` 15. 最后,启动项目并测试各个功能是否正常运行。 以上就是基于 Spring Cloud+Spring Boot+Nacos+Dubbo+mybatis plus+RocketMQ+Sentinel+Seata+mysql 搭建一个项目的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值