作为一名后端程序员,在日常工作中难免要和消息队列打交道,而在目前的微服务场景下,很多服务的性能是我们无法控制的。这不是阿芬最近遇到的一幕。由于上游业务流量增加,发送到消息队列的消息数量增加。阿粉在处理消息的时候,需要依赖一个下游的服务。处理的太多了,CPU居高不下。昨天看过我们文章的朋友应该知道,这个时候我们需要限流。为了避免下游服务被known,我们会进行单机限流操作。这里我们模拟操作过程。首先我们通过一段伪代码模拟一个大流量,然后通过配置sentinel控制台来配置规则,达到单机QPS20的限制。创建一个SpringBoot服务首先我们创建一个SpringBoot服务,在pom.xml文件中添加如下配置。<依赖>
*功能:
*作者:@authorziyou
*日期:2022-05-0812:56
*Desc:无
*/@RestControllerpublicclassLoginController{@GetMapping(value="/login")publicvoidlogin(Stringusername,Stringpassword){System.out.println("login");//模拟一百万条消息for(inti=0;i<1000000;i++){booleanentry=false;尝试{entry=SphO.entry("HelloWorld");while(!entry){try{线程。睡觉(50);System.out.println("输入错误");entry=SphO.entry("HelloWorld");}catch(InterruptedExceptione){}}System.out.println("entrytrue");catch(Exceptione){}finally{if(entry){SphO.exit();}}}}}调用接口后,循环100万次模拟一个大流程。下面我们将对SphO的以下内容进行说明。entry("HelloWorld"):是Sentinel的资源控制器,"HelloWord"是资源的名字,资源是sentinel很重要的一个概念,所有的限流都是针对资源操作的;SphO.entry()返回值布尔值。如果为真,则表示该资源可用且未受限。如果为false,说明资源有限。这里模拟程序在限流后等待一段时间,再判断是否限流。只有当资源不受限时,才能继续处理;SphO.exit();最后需要操作。当限流时,即SphO.entry()==true后,必须执行SphO.exit();否则将创建代码MultipleEntry对象。程序运行时间长后,会造成内存泄漏,引起FullGC。这个时候我们启动一个服务,调用接口。可以看到如下效果。马上就要跑完了,还没到限流。效果是因为此时我们还没有配置限流规则,所以没有触发限流的逻辑。配置sentinel控制台接下来我们安装sentinel控制台,通过控制台配置限流规则,达到限流的目的。控制台的构造非常简单。我们通过官方地址下载指定版本的jar,在本地运行。能。通过地址https://github.com/alibaba/Sentinel/releases/download/1.8.4/sentinel-dashboard-1.8.4.jar下载。然后运行命令java-Dserver.port=8081-Dcsp.sentinel.dashboard.server=localhost:8081-Dproject.name=sentinel-dashboard-jarsentinel-dashboard-1.8.4.jar,如下图:这里我们指定端口8081访问哨兵。启动成功后,我们就可以通过浏览器登录了。默认初始账号和密码为sentinel。因为我们在上面的命令中指定了sentinel-dashboard项目,所以默认只会看到sentinel-dashboard项目。这时候我们需要修改代码,在pom.xml中添加如下配置。
