微服务集成spring cloud sentinel

目录

1. sentinel使用场景

2.  sentinel组成

3. sentinel dashboard搭建

 4. sentinel客户端详细使用

4.1 引入依赖

4.2 application.properties增加dashboard注册地址

4.3 手动增加限流配置类

4.4 rest接口及service类

4.5 通过dashboard动态配置限流规则


1. sentinel使用场景

限流、熔断、监控、动态规则配置

2.  sentinel组成

由两部分组成,

第一个是dashboard监控仪表盘,单独的jar,官网下载后启动,可监控所有服务、动态发现服务、配置限流策略、熔断等;

第二个是sentinel的客户端核心包,供微服务引用,注册到dashboard仪表盘,引入相关pom及设置相关配置即可;

3. sentinel dashboard搭建

启动命令

java -Dserver.port=8400 -Dcsp.sentinel.dashboard.server=localhost:8400 -Dproject.name=hj-sentinel -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel -jar sentinel-dashboard-1.8.6.jar

启动成功,地址栏输入localhost:8400, 如图:

 

 4. sentinel客户端详细使用

4.1 引入依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.2.5.RELEASE</version>
</dependency>

4.2 application.properties增加dashboard注册地址

spring.cloud.sentinel.transport.dashboard=localhost:8400

4.3 手动增加限流配置类

package hj.example.sampleprovider.sample.config;import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.ArrayList;
import java.util.List;/*** @Description: sentinel 限流规则配置类**/
@Configuration
public class SentinelRulesConfig {@Beanpublic void initFlowQpsRules() {List<FlowRule> rules = new ArrayList<>();FlowRule flowRule = new FlowRule();flowRule.setResource("sentinelTest");flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);flowRule.setCount(1);flowRule.setLimitApp("default");flowRule.setClusterMode(false);flowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);rules.add(flowRule);FlowRule flowRule1 = new FlowRule();flowRule1.setResource("sayHello");flowRule1.setGrade(RuleConstant.FLOW_GRADE_QPS);flowRule1.setCount(1);flowRule1.setLimitApp("default");flowRule1.setClusterMode(false);flowRule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);rules.add(flowRule1);FlowRuleManager.loadRules(rules);}
}

4.4 rest接口及service类

其中sentinelTest为rest接口限流,sayHello为方法限流

package hj.example.sampleprovider.sample.controller;import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSONObject;
import hj.example.sampleprovider.sample.HelloServiceImpl;
import hj.example.sampleprovider.sample.config.SentinelRulesConfig;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @Description: TODO**/
@RestController
public class SentinelTestController {@Autowiredprivate HelloServiceImpl helloService;@RequestMapping("/testClean/{id}")public ResponseEntity<Object> testClean(@PathVariable("id") String id) {String resultStr = String.format("test clean id: %s [%s]", id, DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss ssss"));return new ResponseEntity<>(resultStr , HttpStatus.OK);}@RequestMapping("/testSentinelDynamicDashboard")public ResponseEntity<Object> testSentinelDynamicDashboard() {String resultStr = String.format("testSentinelDynamicDashboard [%s]", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss sss"));return new ResponseEntity<>(resultStr, HttpStatus.OK);}@RequestMapping("/sayHello")public ResponseEntity<Object> sayHelloTest() {String helloStr = helloService.sayHello("sayHelloTest");return new ResponseEntity<>(helloStr, HttpStatus.OK);}@SentinelResource(value = "sentinelTest", blockHandler = "sentinelTestHandler")@RequestMapping("/sentinelTest")public ResponseEntity<Object> sentinelTest() {System.out.println(" sentinelTest :" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss sss"));return new ResponseEntity<>("sentinelTest ", HttpStatus.OK);}public ResponseEntity<Object>  sentinelTestHandler(BlockException e) {System.out.println("被限流了");return new ResponseEntity<>("========sentinelTestHandler 被限流了:" + JSONObject.toJSONString(e), HttpStatus.OK);}
}
package hj.example.sampleprovider.sample;import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.fastjson.JSON;
import hj.example.sample.IHelloService;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Value;
import test.SentinelTest;import javax.xml.bind.ValidationException;
import java.util.Date;@DubboService
public class HelloServiceImpl implements IHelloService {@Value("${dubbo.application.name}")private String serviceName;@SentinelResource(value = "sayHello", blockHandler = "sayHelloBlockHandler")public String sayHello(String name) {System.out.printf("[%s]: Hello, %s%n", serviceName, name);return String.format("[%s]: Hello, %s", serviceName, name);}public String sayHelloBlockHandler(String name, BlockException e) throws ValidationException {System.out.println("sayHello 被限流了。name:" + name + ",被限流了:" + JSON.toJSONString(e));return "sayHello 被限流了。name:" + name + ",被限流了:" + JSON.toJSONString(e);}public void sentinelTestMethod() {try(Entry entry = SphU.entry("sentinelTestMethod")) {System.out.println("hello sentinel : " + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss sss"));}catch (BlockException e) {e.printStackTrace();}}public void sentinelTestHandler(BlockException e) throws ValidationException {e.printStackTrace();throw new ValidationException(e.getMessage());}
}

4.5 通过dashboard动态配置限流规则

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

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

相关文章

Vue3项目实战

目录 一、项目准备 二、基础语法应用 2.1、mixin应用 2.2、网络请求 2.3、显示与隐藏 2.4、编程式路由跳转 2.5、下载资料 2.6、调用方法 2.7、监听路由变化 2.8、pinia应用 (1)存储token(user.js) (2)全选全不选案例(car.js) 一、项目准备 下载&#xff1a; cnp…

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …

mybatis-plus如何使用枚举类来实现性别和标签的数字带描述

文章目录 目录 文章目录 前言 一、环境准备 二、使用步骤 一 实体类 二 枚举类 三 持久层 四 控制层 总结 前言 枚举是一种表示一组有限可能取值的数据类型。它具有以下几个好处&#xff1a; 易于理解和维护&#xff1a;枚举提供了一种清晰明了的方式来表示一组具体的取值&a…

【Linux操作系统】线程的基本知识和创建--循环创建多个子线程

本篇文章主要介绍了线程的概念和作用&#xff0c;线程三级映射的实现&#xff0c;创建线程的方法&#xff08;讲解pthread_self和pthread_create函数&#xff09;&#xff0c;循环创建多个子线程为例子&#xff0c;同时分析线程之间的全局变量的共享问题&#xff0c;希望可以帮…

Redis笔记——(狂神说)待续

Nosql概述 为什么要用NoSql&#xff1f; 1、单机mysql的年代&#xff1a;90年代&#xff0c;网站访问量小&#xff0c;很多使用静态网页html写的&#xff0c;服务器没压力。 当时瓶颈是&#xff1a;1)数据量太大一个机器放不下。2)数据的索引(BTree)&#xff0c;一个机器内存也…

Git最简入门

文章目录 几个基本概念版本控制Git的由来分布式 vs 集中式GitSVN Git、GitHub、GitLab、GitWeb、Gitee的区别 动手进行版本控制初始化Git使用情景一&#xff1a;开发新项目使用情景二&#xff1a;在已有项目上开发设置代理 参考 几个基本概念 版本控制 在工作学习中&#xff…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg&#xff0c;方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像

About Alpine&#xff08;简介&#xff09; Alpine Linux 是一款极其轻量级的 Linux 发行版&#xff0c;基于 busybox&#xff0c;多被当做 Docker 镜像的底包&#xff08;基础镜像&#xff09;&#xff0c;在使用容器时或多或少都会接触到此系统&#xff0c;本篇文章我们以该镜…

Pydev·离线git包

Pydev离线git包 1.下载离线git包&#xff1a;eclipse.egit.repository-4.4.0.201606070830-r.zip 2.将解压后目录&#xff1a;eclipse.egit.repository-4.4.0.201606070830-r\plugins下的jar文件放到 ide\eclipse\plugins目录下 3.重启pydevIDE 百度搜索站长工具&#xff1a;h…

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

校对的力量:当专业遇上细节,文字焕发新生

在这个信息爆炸的时代&#xff0c;文字成为了我们传达思想、展现形象的重要工具。从新闻稿、政府材料到商业文档&#xff0c;其背后的准确性和专业性往往决定了信息传递的效果。而保证这一切的&#xff0c;就是细致入微的校对工作。 1.错别字与校对&#xff1a;细节之美 错别字…

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一&#xff1a;页面在线引用2.2 方式二&#xff1a;页面离线使用2.3 方式三&#xff1a;完整项目使用 3、CesiumJS学习教程&#xff08;快速上手 API文档&#xff09;3、Cesium官方示例…

vue离线缓存资源文件

本文章主要是解决大文件,实时请求资源浪费网络资源的问题 从而有效的将解决用户体验的问题 话不多说上才艺 ⬇️⬇️⬇️⬇️⬇️⬇️⬇️ 找到项目中的 index.html 文件,并在 html 标签中加入 manifest"manifest.appcache" 安装 appcache-manifest 包 npm ins…

c++ qt--信号与槽(二) (第四部分)

c qt–信号与槽(二) &#xff08;第四部分&#xff09; 信号与槽的关系 1.一对一 2.一对多 3.多对一 4.多对多 还可以进行传递 信号->信号->槽 一个信号控制多个槽的例子&#xff08;通过水平滑块控制两个组件&#xff09; 1.应用的组件 注意这里最下面的组件进行…

【Qt学习】06:事件与事件过滤器

OVERVIEW 事件与事件过滤器一、事件1.鼠标事件创建子类MyLabel重写鼠标事件提升Label控件为MyLabel 2.定时器事件timerEventQTimer 3.事件分发器&#xff08;event函数&#xff09;event函数重写event函数深入 二、事件过滤器1.事件过滤器2.事件处理的五个层次 事件与事件过滤器…

Tomcat和Servlet基础知识的讲解(JavaEE初阶系列16)

目录 前言&#xff1a; 1.Tomcat 1.1Tomcat是什么 1.2下载安装 2.Servlet 2.1什么是Servlet 2.2使用Servlet来编写一个“hello world” 1.2.1创建项目&#xff08;Maven&#xff09; 1.2.2引入依赖&#xff08;Servlet&#xff09; 1.2.3创建目录&#xff08;webapp&a…

VR法治警示教育:情景式课堂增强教育效果

VR法治警示教育平台是一款基于虚拟现实技术的在线教育平台&#xff0c;旨在通过模拟真实场景和互动体验&#xff0c;向公众普及法律知识&#xff0c;提高公民的法律意识和素养。该平台采用先进的虚拟现实技术&#xff0c;将用户带入一个逼真的仿真环境&#xff0c;让用户身临其…

python systemrdl 使用实例

今天来看一个具体实例&#xff0c;上一篇传送门&#xff1a;python SystemRDL 包介绍_Bug_Killer_Master的博客-CSDN博客 通常来说&#xff0c;我们验证过程用到的情况大多都是需要提取reg field的路径以及reset 值等信息&#xff0c;所以比较常见的一种方法就是先把rdl compil…

简析SCTP开发指南

目录 前言一、SCTP基本概念二、SCTP开发步骤1. **环境配置**&#xff1a;2. **建立Socket**&#xff1a;3. **绑定和监听**&#xff1a;4. **接收和发送数据**&#xff1a;5. **关闭连接**&#xff1a; 三、 C语言实现SCTP3.1SCTP客户端代码&#xff1a;3.2 SCTP服务器端代码&a…