1.复制nacos根目录
2.修改conf文件下的
3.修改conf文件下的
cluster.conf里面写上ip:端口号
4.进入nacos下的bin
启动startup.cmd
5.连接Nacos
打开浏览器输入ip:8848出现如下页面代表登录成功
6.Sentinel
Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能sentinel的版本一定要和组件的版本对应一致,否则出现会在一定程序出现不可预知的错误,当前的环境需要1.8.1版本的sentinel
1 .下载jar包,解压到文件夹
Release v1.8.1 · alibaba/Sentinel · GitHub
2 .启动控制台
# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)
java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
3. 通过浏览器访问
输入localhost:8888 进入控制台 ( 默认用户名密码是 sentinel/sentinel )
Sentinel的控制台其实就是一个SpringBoot编写的程序。我们需要将我们的微服务程序注册到控制台上, 即在微服务中指定控制台的地址, 并且还要开启一个跟控制台传递数据的端口, 控制台也可以通过此端口调用微服务中的监控程序获取微服务的各种信息。
我们先做一个简单配置,设置阈值类型为QPS,单机阈值为2。即每秒请求量大于2的时候开始限流
接下来,在流控规则页面就可以看到这个配置
然后快速访问 /tab-product接口,观察效果。此时发现,当QPS > 2的时候,服务就不能正常响应,而是返回Blocked by Sentinel (flow limiting)结果。
4.BlockException异常统一处理
springwebmvc接口资源限流入口在HandlerInterceptor的实现类AbstractSentinelInterceptor的preHandle方法中,对异常的处理是BlockExceptionHandler的实现类
自定义BlockExceptionHandler 的实现类统一处理BlockException
package com.example.exception;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.example.until.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyExceptionHandler implements BlockExceptionHandler {
@Resource
private ObjectMapper objectMapper;
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, BlockException e) throws Exception {
if (e instanceof FlowException){
Result r = null;
if (e instanceof FlowException) {
r =new Result(100,"限流了","");
}
response.setStatus(500);
response.setCharacterEncoding("utf-8");
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
objectMapper.writeValue(response.getWriter(), r);
}
}
}
5.sentinel共有三种流控模式,分别是:
l 直接(默认):接口达到限流条件时,开启限流
l 关联:当关联的资源达到限流条件时,开启限流 [适合做应用让步]
l 链路:当从某个接口过来的资源达到限流条件时,开启限流
下面呢分别演示三种模式:
5.1直接流控模式
直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。上面案例使用的就是直接流控模式。
5.2关联流控模式
关联流控模式指的是,当指定接口关联的接口达到限流条件时,开启对指定接口开启限流。
第1步:配置限流规则, 将流控模式设置为关联,关联资源设置为的 /messa
5.3链路流控模式
链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流。
5.3.1注解:@SentinelResource
我们可以对某一个方法进行限流控制,无论是谁在何处调用了它,这里需要使用到@SentinelResource
,一旦方法被标注,那么就会进行监控@SentinelResource
,一旦方法被标注,那么就会进行监控。
5.3.1.1.第1步: 编写一个service,在里面添加一个方法message
@Service
public class ProductService {
@SentinelResource("message")
public void message(){
System.out.println("hello====message!!!");
}
}
5.3.1.2.第2步: 在Controller中声明两个方法,分别调用service中的方法message
@RestController
public class MessageController {
@Resource
private ProductService service;
@GetMapping("message1")
public String message1(){
service.message();
return "message1";
}
@GetMapping("message2")
public String message2(){
service.message();
return "message2";
}
}
5.3.1.3.第3步: 禁止收敛URL的入口 context
在application.properties中添加:
spring.cloud.sentinel.web-context-unify=false
#用于控制是否收敛context。将其配置为 false 即可根据不同的URL 进行链路限流。