净水 技术支持 东莞网站建设,简述网站建设基本过程,做中文的云图网站,建立网站视频教程微服务保护雪崩问题服务保护技术Sentinel微服务整合Sentinel流量控制簇点链路入门练习流控模式关联链路流控效果Warm Up排队等待热点参数限流隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)实现线程隔离熔断降级慢调用异常比例/异常数授权规则获取origin给网关添加请求头…
微服务保护雪崩问题服务保护技术Sentinel微服务整合Sentinel流量控制簇点链路入门练习流控模式关联链路流控效果Warm Up排队等待热点参数限流隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)实现线程隔离熔断降级慢调用异常比例/异常数授权规则获取origin给网关添加请求头自定义异常结果规则持久化规则管理模式实现push模式代码地址
https://gitee.com/suisui9857/cloud-demo雪崩问题
在微服务中一个微服务往往依赖于多个其它微服务。如果服务提供者I发生了故障当前的应用的部分业务因为依赖于服务I因此也会被阻塞。依赖服务I的业务请求被阻塞用户不会得到响应则tomcat的这个线程不会释放于是越来越多的用户请求到来越来越多的线程会阻塞服务器支持的线程和并发数有限请求一直阻塞会导致服务器资源耗尽从而导致所有其它服务都不可用那么当前服务也就不可用了。
微服务之间相互调用因为调用链中的一个服务故障引起整个链路都无法访问的情况就是雪崩。 解决雪崩问题的常见方式
超时处理 设定超时时间请求超过一定时间没有响应就返回错误信息不会无休止等待。(释放速度没有请求速度快终有一天会阻塞) 舱壁模式 限定每个业务能使用的线程数避免耗尽整个tomcat的资源因此也叫线程隔离。(服务c挂了之后还一直访问会造成资源浪费) 熔断降级 由熔断器统计业务执行的异常比例如果超出阈值则会熔断该业务拦截访问该业务的一切需求。 流量控制 限制业务访问的QPS(每秒钟请求的数量)避免服务因流量的突增而故障。
如何避免因瞬间高并发流量而导致服务故障流量控制
如何避免因服务故障引起的雪崩问题超时处理舱壁模式熔断降级
服务保护技术
早期比较流行的是Hystrix框架但目前国内实用最广泛的还是阿里巴巴的Sentinel框架对比如下
SentinelHystrix隔离策略信号量隔离线程池隔离/信号量隔离熔断降级策略基于慢调用比例或异常比例基于失败比率实时指标实现滑动窗口滑动窗口基于 RxJava规则配置支持多种数据源支持多种数据源扩展性多个扩展点插件的形式基于注解的支持支持支持限流基于 QPS支持基于调用关系热点数量的限流有限的支持流量整形支持慢启动、匀速排队模式不支持系统自适应保护支持不支持控制台开箱即用可配置规则、查看秒级监控、机器发现等不完善常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix
Sentinel
sentinel官方提供了UI控制台方便对系统做限流设置。可以在GitHub下载。
将jar包放到任意非中文目录执行命令
java -jar sentinel-dashboard-1.8.1.jar修改Sentinel的默认端口、账户、密码可以通过下列配置
配置项默认值说明server.port8080服务端口sentinel.dashboard.auth.usernamesentinel默认用户名sentinel.dashboard.auth.passwordsentinel默认密码
修改端口
java -Dserver.port8090 -jar sentinel-dashboard-1.8.1.jar访问http://localhost:8080页面可以看到sentinel的控制台账号和密码默认sentinel
微服务整合Sentinel
1.引入sentinel依赖
!--sentinel--
dependencygroupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId
/dependency2.修改配置文件
server:port: 8088
spring:cloud: sentinel:transport:dashboard: localhost:80903.访问order-service的任意端点(http://localhost:8088/order/101)触发sentinel的监控
流量控制
簇点链路
当请求进入微服务时首先会访问DispatcherServlet然后进入Controller、Service、Mapper这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源。
默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint也就是controller中的方法)因此SpringMVC的每一个端点就是调用链路中的一个资源。 流控、熔断等都是针对簇点链路中的资源来设置的因此可以点击对应资源后面的按钮来设置规则
流控流量控制降级降级熔断热点热点参数限流是限流的一种授权请求的权限控制
入门练习
1.点击资源/order/{orderId}后面的流控按钮就可以弹出表单
其含义是限制 /order/{orderId}这个资源的单机QPS为1即每秒只允许1次请求超出的请求会被拦截并报错。(default默认所有请求都检测) 2.给 /order/{orderId}资源设置流控规则QPS不能超过 5
3.利用jmeter测试2秒内发闪送20个请求QPS是10
流控模式
直接统计当前资源的请求触发阈值时对当前资源直接限流也是默认的模式关联统计与当前资源相关的另一个资源触发阈值时对当前资源限流(A触发阈值对B限流)链路统计从指定链路访问到本资源的请求触发阈值时对指定链路限流(对请求来源做判断和限流)
关联
关联 统计与当前资源相关的另一个资源触发阈值时对当前资源限流(A触发阈值对B限流)
使用场景比如用户支付时需要修改订单状态同时用户要查询订单。查询和修改操作会争抢数据库锁产生竞争。业务需求是优先支付和更新订单的业务因此当修改订单业务触发阈值时需要对查询订单业务限流。
语法说明 当/write资源访问量触发阈值时就会对/read资源限流避免影响/write资源。 案例
在OrderController新建两个端点/order/query和/order/update无需实现业务
RestController
RequestMapping(order)
public class OrderController {GetMapping(/query)public String queryOrder() {return 查询订单成功;}GetMapping(/update)public String updateOrder() {return 更新订单成功;}
}配置流控规则当/order/ update资源被访问的QPS超过5时对/order/query请求限流 在Jmeter测试
200个用户2秒因此QPS为100超过了设定的阈值5 发送http请求 请求的目标是/order/update这样这个断点就会触发阈值。限流的目标是/order/query浏览器访问 使用关联模式的满足条件
两个有竞争关系的资源一个优先级较高一个优先级较低
链路
链路 只针对从指定链路访问都本资源的请求做统计(对请求来源做判断和限流)。 假如有两条请求链路/test1-/common/test2-/common只希望统计从/test2进入到/common的请求配置如下 案例 有查询订单和创建订单业务两者都需要查询商品。针对从查询订单进入到查询商品的请求统计并设置限流。
在OrderService中添加一个queryGoods方法不用实现业务被Sentinel监控
SentinelResource(goods)
public void queryGoods(){System.err.println(查询商品);
}1.1修改配置文件因为sentinel默认将controller方法做context整合导致链路模式失效
spring:cloud:sentinel:web-context-unify: false # 关闭context整合在OrderController中改造/order/query端点调用OrderService中的queryGoods方法
GetMapping(/query)
public String queryOrder() {// 查询商品orderService.queryGoods();// 查询订单System.out.println(查询订单);return 查询订单成功;
}在OrderController中添加一个/order/save的端点调用OrderService的queryGoods方法
GetMapping(/save)
public String saveOrder() {// 查询商品orderService.queryGoods();// 查询订单System.err.println(新增订单);return 新增订单成功;
}重启服务访问/order/query和/order/save可以查看到sentinel的簇点链路规则中出现了新的资源 给queryGoods设置限流规则从/order/query进入queryGoods的方法限制QPS必须小于2。 Jmeter测试
200个用户50秒内发完QPS为4超过了我们设定的阈值2 一个http请求是访问/order/save 运行的结果完全不受影响。 另一个是访问/order/query 运行结果 流控模式有哪些
直接对当前资源限流关联高优先级资源触发阈值对低优先级资源限流。链路阈值统计时只统计从指定资源进入当前资源的请求是对请求来源的限流
流控效果
流控效果是指请求达到流控阈值时应该采取的措施包括三种
快速失败达到阈值后新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。warm up预热模式对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化从一个较小值逐渐增加到最大阈值。排队等待让所有的请求按照先后次序排队执行两个请求的间隔不能大于指定时长
Warm Up
warm up也叫预热模式是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor持续指定时长后逐渐提高到maxThreshold值。而coldFactor的默认值是3.
假如设置QPS的maxThreshold为10预热时间为5秒那么初始阈值就是 10 / 3 也就是3然后在5秒后逐渐增长到10.
案例 给/order/{orderId}这个资源设置限流最大QPS为10利用warm up效果预热时长为5秒 Jmeter测试QPS为10. 刚刚启动时大部分请求失败成功的只有3个说明QPS被限定在3 随着时间推移成功比例越来越高 Sentinel控制台查看实时监控 排队等待
当请求超过QPS阈值时快速失败和warm up 会拒绝新的请求并抛出异常。 排队等待则是让所有请求进入一个队列中然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成如果请求预期的等待时间超出最大时长则会被拒绝。
例如QPS 5意味着每200ms处理一个队列中的请求timeout 2000意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。
使用队列模式做流控所有进入的请求都要排队以固定的200ms的间隔执行QPS会变的很平滑平滑的QPS曲线对于服务器来说是更友好的。 案例 给/order/{orderId}这个资源设置限流最大QPS为10利用排队的流控效果超时时长设置为5s Jmeter测试QPS为15已经超过了我们设定的10。 如果是之前的快速失败、warmup模式超出的请求应该会直接报错。现在结果都通过了。 sentinel查看实时监控的QPS曲线
QPS非常平滑一致保持在10但是超出的请求没有被拒绝而是放入队列。因此响应时间等待时间会越来越长。
当队列满了以后才会有部分请求失败 流控效果有哪些
快速失败QPS超过阈值时拒绝新的请求warm up QPS超过阈值时拒绝新的请求QPS阈值是逐渐提升的可以避免冷启动时高并发导致服务宕机。排队等待请求会进入队列按照阈值允许的时间间隔依次执行请求如果请求预期等待时长大于超时时间直接拒绝
热点参数限流
之前的限流是统计访问某个资源的所有请求判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求判断是否超过QPS阈值。
例如访问/goods/{id}的请求中id参数值会有变化热点参数限流会根据参数值分别统计QPS统计结果 当id1的请求触发阈值被限流时id值不为1的请求不受影响。
配置示例代表的含义是对hot这个资源的0号参数第一个参数做统计每1秒相同参数值的请求数不能超过5对查询商品这个接口的所有商品一视同仁QPS都限定为5。 在实际开发中可能部分商品是热点商品例如秒杀商品我们希望这部分商品的QPS限制与其它商品不一样高一些。就需要配置热点参数限流的高级选项了 结合上一个配置这里的含义是对0号的long类型参数限流每1秒相同参数的QPS不能超过5有两个例外
如果参数值是100则每1秒允许的QPS为10如果参数值是101则每1秒允许的QPS为15
案例 给/order/{orderId}这个资源添加热点参数限流规则如下
默认的热点参数规则是每1秒请求量不超过2给102这个参数设置例外每1秒请求量不超过4给103这个参数设置例外每1秒请求量不超过10
1.给order-service中的OrderController中的/order/{orderId}资源添加注解 热点参数限流对默认的SpringMVC资源无效 SentinelResource(hot)GetMapping({orderId})public Order queryOrderByUserId(PathVariable(orderId) Long orderId) {return orderService.queryOrderById(orderId);}2.点击左侧菜单中热点规则菜单点击新增填写表单 3.Jmeter测试发起请求的QPS为5. 包含3个http请求
普通参数QPS阈值为2 运行结果 例外项QPS阈值为4 例外项QPS阈值为10
隔离和降级
限流是一种预防措施虽然限流可以尽量避免因高并发而引起的服务故障但服务还会因为其它原因而故障。要将这些故障控制在一定范围避免雪崩就要靠线程隔离舱壁模式和熔断降级。 不管是线程隔离还是熔断降级都是对客户端调用方的保护。需要在调用方 发起远程调用时做线程隔离、或者服务熔断。微服务远程调用都是基于Feign来完成的因此我们需要将Feign与Sentinel整合在Feign里面实现线程隔离和服务熔断。
FeignClient整合Sentinel
1.修改OrderService的application.yml文件开启Feign的Sentinel功能
Sentinel会自动监护Feign客户端把它变成链路中的一个资源
feign:sentinel:enabled: true # 开启feign对sentinel的支持2.给FeignClient编写失败后的降级逻辑(业务失败后不能直接报错而应该返回用户一个友好提示或者默认结果这个就是失败降级逻辑)
FallbackClass无法对远程调用的异常做处理FallbackFactory可以对远程调用的异常做处理我们选择这种
2.1.在feing-api项目中定义类实现FallbackFactory
Slf4j
//指定给哪个feign客户端编写
public class UserClientFallbackFactory implements FallbackFactoryUserClient {Overridepublic UserClient create(Throwable throwable) {//创建UserClient接口实现类实现其中的方法编写失败降级的处理逻辑return new UserClient() {Overridepublic User findById(Long id) {//记录异常信息log.error(查询用户异常, throwable);//根据业务需求返回默认的数据这里是空用户return new User();}};}
}2.2.在feing-api项目中的DefaultFeignConfiguration类中注入UserClientFallbackFactory
public class DefaultFeignConfiguration {Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; // 日志级别为BASIC}Beanpublic UserClientFallbackFactory userClientFallbackFactory(){return new UserClientFallbackFactory();}
}2.3.在feing-api项目中的UserClient接口中使用UserClientFallbackFactory
FeignClient(value userservice, configuration DefaultFeignConfiguration.class,fallbackFactory UserClientFallbackFactory.class)
public interface UserClient {GetMapping(/user/{id})User findById(PathVariable(id) Long id);
}3.重启后访问一次订单查询业务然后查看sentinel控制台可以看到新的簇点链路
线程隔离(舱壁模式)
线程隔离 调用者在调用服务提供者时给每个调用的请求分配独立线程池出现故障时最多消耗这个线程池内资源避免把调用者的所有资源耗尽。 线程隔离有两种方式实现
线程池隔离信号量隔离Sentinel默认采用 线程池隔离给每个服务调用业务分配一个线程池利用线程池本身实现隔离效果(基于计数器模式简单开销小)
优点支持主动超时(在远程调用请求的独立线程通过线程池可以终止)支持异步调用缺点线程的额外开销比较大场景低扇出(依赖的服务少)
信号量隔离不创建线程池而是计数器模式记录业务使用的线程数量达到信号量上限时禁止新的请求(基于线程池模式有额外开销但隔离控制更强)
优点轻量集无额外开销缺点不支持主动超时不支持异步调用场景高频调用高扇出
实现线程隔离
在添加限流规则时可以选择两种阈值类型
QPS就是每秒的请求数在快速入门中已经演示过线程数是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量实现线程隔离舱壁模式。
案例 给 order-service服务中的UserClient的查询用户接口设置流控规则线程数不能超过 2。然后利用jemeter测试。
1.配置隔离规则 2.Jmeter测试
一次发生10个请求有较大概率并发线程数超过2而超出的请求会走之前定义的失败降级逻辑。
查看运行结果发现虽然结果都是通过了不过部分请求得到的响应是降级返回的null信息。 熔断降级
熔断降级 在调用方这边加入断路器统计对服务提供者的调用如果调用的失败比例过高则熔断该业务不允许访问该服务的提供者了。 熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求而当服务恢复时断路器会放行访问该服务的请求。
断路器控制熔断和放行是通过状态机来完成的 状态机包括三个状态
closed关闭状态断路器放行所有请求并开始统计异常比例、慢请求比例。超过阈值则切换到open状态open打开状态服务调用被熔断访问被熔断服务的请求会被拒绝快速失败直接走降级逻辑。Open状态5秒后会进入half-open状态half-open半开状态放行一次请求根据执行结果来判断接下来的操作。 请求成功则切换到closed状态请求失败则切换到open状态
断路器熔断策略有三种慢调用、异常比例、异常数
慢调用
业务的响应时长RT大于指定时长的请求认定为慢调用请求。在指定时间内如果请求数量超过设定的最小数量慢调用比例大于设定的阈值则触发熔断。 解读 RT超过500ms的调用是慢调用统计最近10000ms内的请求如果请求量超过10次并且慢调用比例不低于0.5则触发熔断熔断时长为5秒。然后进入half-open状态放行一次请求做测试。
案例 给 UserClient的查询用户接口设置降级规则慢调用的RT阈值为50ms统计时间为1秒最小请求数量为5失败阈值比例为0.4熔断时长为5
1.设置慢调用
Service
public class UserService {Autowiredprivate UserMapper userMapper;public User queryById(Long id) throws Exception {if (id 1) {Thread.sleep(60);}return userMapper.findById(id);}
}2.给feign接口设置降级规则 超过50ms的请求都会被认为是慢请求 3.测试
在浏览器访问http://localhost:8080/order/101快速刷新5次触发了熔断请求时长缩短至5ms快速失败了并且走降级逻辑返回的null 在浏览器访问http://localhost:8088/order/102也被熔断了 异常比例/异常数
异常比例或异常数统计指定时间内的调用如果调用次数超过指定请求数并且出现异常的比例达到设定的比例阈值或超过指定异常数则触发熔断。
例如异常比例设置 解读 统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于0.4则触发熔断。
一个异常数设置 解读 统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于2次则触发熔断。
案例 给 UserClient的查询用户接口设置降级规则统计时间为1秒最小请求数量为5失败阈值比例为0.4熔断时长为5s
1.设置异常请求
Service
public class UserService {Autowiredprivate UserMapper userMapper;public User queryById(Long id) throws Exception {if (id 1) {Thread.sleep(60);}else if(id 2){throw new RuntimeException(故意抛出异常触发异常比例熔断);}return userMapper.findById(id);}
}2.设置熔断规则 在5次请求中只要异常比例超过0.4也就是有2次以上的异常就会触发熔断。
3.测试
在浏览器快速访问http://localhost:8088/order/102快速刷新5次触发熔断 访问本来应该正常的103
Sentine熔断降级的策略有哪些 慢调用比例超过指定时长的调用为慢调用统计单位时长内慢调用的比例超过阈值则熔断 异常比例统计单位时长内异常调用的比例超过阈值则熔断 异常数统计单位时长内异常调用的次数超过阈值则熔断
授权规则
授权规则可以对调用方的来源做控制有白名单和黑名单两种方式。
白名单来源origin在白名单内的调用者允许访问黑名单来源origin在黑名单内的调用者不允许访问 资源名就是受保护的资源例如/order/{orderId}流控应用是来源者的名单 如果是勾选白名单则名单中的来源被许可访问。如果是勾选黑名单则名单中的来源被禁止访问。
允许请求从gateway到order-service不允许浏览器访问order-service那么白名单中就要填写网关的来源名称origin。
获取origin
Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源。
public interface RequestOriginParser {/*** 从请求request对象中获取origin获取方式自定义*/String parseOrigin(HttpServletRequest request);
}默认情况下sentinel不管请求者从哪里来返回值永远是default也就是说一切请求的来源都被认为是一样的值default。因此需要自定义这个接口的实现让不同的请求返回不同的origin。
1.在order-service服务中定义RequestOriginParser的实现类获取origin
Component
public class HeaderOriginParse implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest request) {// 1.获取请求头String origin request.getHeader(origin);// 2.非空判断if (StringUtils.isEmpty(origin)) {origin blank;}return origin;}
}给网关添加请求头
获取请求origin的方式是从reques-header中获取origin值所以必须让所有从gateway路由到微服务的请求都带上origin头。需要通过AddRequestHeaderGatewayFilter来实现。
2.修改gateway服务中的application.yml添加一个defaultFilter
spring:cloud:gateway:default-filters:- AddRequestHeaderorigin,gateway #添加名为origin的请求头值为gatewayroutes:# ...略3.配置授权规则 4.测试直接跳过网关访问order-service服务 5.通过网关访问 自定义异常结果
默认情况下发生限流、降级、授权拦截时都会抛出异常到调用方。异常结果都是flow limmiting限流。这样不够友好无法得知是限流还是降级还是授权拦截。
自定义异常时的返回结果需要实现BlockExceptionHandler接口
public interface BlockExceptionHandler {/*** 处理请求被限流、降级、授权拦截时抛出的异常BlockException*/void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception;
}三个参数
HttpServletRequest requestrequest对象HttpServletResponse responseresponse对象BlockException e被sentinel拦截时抛出的异常
BlockException包含多个不同的子类
异常说明FlowException限流异常ParamFlowException热点参数限流的异常DegradeException降级异常AuthorityException授权规则异常SystemBlockException系统规则异常
1.在order-service定义一个自定义异常处理类
Component
public class SentinelExceptionHandler implements BlockExceptionHandler {Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg 未知异常;int status 429;if (e instanceof FlowException) {msg 请求被限流了;} else if (e instanceof ParamFlowException) {msg 请求被热点参数限流;} else if (e instanceof DegradeException) {msg 请求被降级了;} else if (e instanceof AuthorityException) {msg 没有权限访问;status 401;}response.setContentType(application/json;charsetutf-8);response.setStatus(status);response.getWriter().println({\msg\: msg , \status\: status });}
}2.重启测试在不同场景下会返回不同的异常消息.
规则持久化
sentinel的所有规则都是内存存储重启后所有规则都会丢失。在生产环境下必须确保这些规则的持久化避免丢失。
规则管理模式
规则是否能持久化取决于规则管理模式sentinel支持三种规则管理模式
原始模式Sentinel的默认模式将规则保存在内存重启服务会丢失。pull模式控制台将配置的规则推送到Sentinel客户端而客户端会将配置规则保存在本地文件或数据库中。以后会定时去本地文件或数据库中查询更新本地规则。 缺点时效性较差数据不一致 push模式控制台将配置规则推送到远程配置中心例如Nacos。Sentinel客户端监听Nacos获取配置变更的推送消息完成本地配置更新。
实现push模式
修改OrderService让其监听Nacos中的sentinel规则配置。
1.在order-service中引入sentinel监听nacos的依赖
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId
/dependency2.在order-service中的application.yml文件配置nacos地址及监听的配置信息
spring:cloud:sentinel:datasource:flow:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-flow-rulesgroupId: SENTINEL_GROUPrule-type: flow # 限流还可以是degrade(降级)、authority(授权)、param-flow(热点参数)# 配置多个degrade:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-degrade-rulesgroupId: SENTINEL_GROUPrule-type: degrade # 限流还可以是degrade(降级)、authority(授权)、param-flow(热点参数)
3.修改sentinel-dashboard源码
3.1解压sentinel源码包用IDEA打开这个项目结构如下 3.2修改nacos依赖
在sentinel-dashboard源码的pom文件中nacos的依赖默认的scope是test只能在测试时使用这里要去除
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactIdscopetest/scope
/dependency3.3添加nacos支持
在sentinel-dashboard的test包下已经编写了对nacos的支持我们需要将其拷贝到main下。 4.修改nacos地址
修改测试代码中的NacosConfig类
修改其中的nacos地址让其读取application.properties中的配置
在sentinel-dashboard的application.properties中添加nacos地址配置
nacos.addrlocalhost:88485.配置nacos数据源
修改com.alibaba.csp.sentinel.dashboard.controller.v2包下的FlowControllerV2类
让添加的Nacos数据源生效
6.修改前端页面添加一个支持nacos的菜单。
修改src/main/webapp/resources/app/scripts/directives/sidebar/目录下的sidebar.html文件 将其中的这部分注释打开 修改其中的文本 7.重新编译打包项目
运行IDEA中的maven插件编译和打包修改好的Sentinel-Dashboard 8.启动 启动方式跟官方一样
java -jar sentinel-dashboard.jar修改nacos地址需要添加参数
java -jar -Dnacos.addrlocalhost:8848 sentinel-dashboard.jar
文章转载自: http://www.morning.bkgfp.cn.gov.cn.bkgfp.cn http://www.morning.phtqr.cn.gov.cn.phtqr.cn http://www.morning.skrww.cn.gov.cn.skrww.cn http://www.morning.nlqmp.cn.gov.cn.nlqmp.cn http://www.morning.zbnkt.cn.gov.cn.zbnkt.cn http://www.morning.wdrxh.cn.gov.cn.wdrxh.cn http://www.morning.qjlnh.cn.gov.cn.qjlnh.cn http://www.morning.hwlk.cn.gov.cn.hwlk.cn http://www.morning.nsjpz.cn.gov.cn.nsjpz.cn http://www.morning.tphjl.cn.gov.cn.tphjl.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.qtyfb.cn.gov.cn.qtyfb.cn http://www.morning.fhghy.cn.gov.cn.fhghy.cn http://www.morning.jqrp.cn.gov.cn.jqrp.cn http://www.morning.sgtq.cn.gov.cn.sgtq.cn http://www.morning.tnbsh.cn.gov.cn.tnbsh.cn http://www.morning.ghlyy.cn.gov.cn.ghlyy.cn http://www.morning.kdfqx.cn.gov.cn.kdfqx.cn http://www.morning.mbmtn.cn.gov.cn.mbmtn.cn http://www.morning.dyxlj.cn.gov.cn.dyxlj.cn http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn http://www.morning.kzcfr.cn.gov.cn.kzcfr.cn http://www.morning.prjns.cn.gov.cn.prjns.cn http://www.morning.skrcn.cn.gov.cn.skrcn.cn http://www.morning.lnrhk.cn.gov.cn.lnrhk.cn http://www.morning.ymdhq.cn.gov.cn.ymdhq.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.kxsnp.cn.gov.cn.kxsnp.cn http://www.morning.zfrs.cn.gov.cn.zfrs.cn http://www.morning.lsnhs.cn.gov.cn.lsnhs.cn http://www.morning.pluimers.cn.gov.cn.pluimers.cn http://www.morning.yhywx.cn.gov.cn.yhywx.cn http://www.morning.xxknq.cn.gov.cn.xxknq.cn http://www.morning.fjmfq.cn.gov.cn.fjmfq.cn http://www.morning.gjtdp.cn.gov.cn.gjtdp.cn http://www.morning.lhptg.cn.gov.cn.lhptg.cn http://www.morning.zlcsz.cn.gov.cn.zlcsz.cn http://www.morning.bysey.com.gov.cn.bysey.com http://www.morning.jzykw.cn.gov.cn.jzykw.cn http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.lwsct.cn.gov.cn.lwsct.cn http://www.morning.kxscs.cn.gov.cn.kxscs.cn http://www.morning.thntp.cn.gov.cn.thntp.cn http://www.morning.trqzk.cn.gov.cn.trqzk.cn http://www.morning.xtqr.cn.gov.cn.xtqr.cn http://www.morning.ymjrg.cn.gov.cn.ymjrg.cn http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn http://www.morning.sfwcx.cn.gov.cn.sfwcx.cn http://www.morning.cylbs.cn.gov.cn.cylbs.cn http://www.morning.w58hje.cn.gov.cn.w58hje.cn http://www.morning.rkyw.cn.gov.cn.rkyw.cn http://www.morning.qxdrw.cn.gov.cn.qxdrw.cn http://www.morning.jljwk.cn.gov.cn.jljwk.cn http://www.morning.yrflh.cn.gov.cn.yrflh.cn http://www.morning.eronghe.com.gov.cn.eronghe.com http://www.morning.sfnjr.cn.gov.cn.sfnjr.cn http://www.morning.bnjnp.cn.gov.cn.bnjnp.cn http://www.morning.gbnsq.cn.gov.cn.gbnsq.cn http://www.morning.glswq.cn.gov.cn.glswq.cn http://www.morning.nkjpl.cn.gov.cn.nkjpl.cn http://www.morning.tpxgm.cn.gov.cn.tpxgm.cn http://www.morning.gjtdp.cn.gov.cn.gjtdp.cn http://www.morning.dmhs.cn.gov.cn.dmhs.cn http://www.morning.hrqfl.cn.gov.cn.hrqfl.cn http://www.morning.ldqrd.cn.gov.cn.ldqrd.cn http://www.morning.mhlkc.cn.gov.cn.mhlkc.cn http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn http://www.morning.cndxl.cn.gov.cn.cndxl.cn http://www.morning.tqsmg.cn.gov.cn.tqsmg.cn http://www.morning.qbnfc.cn.gov.cn.qbnfc.cn http://www.morning.bhbxd.cn.gov.cn.bhbxd.cn http://www.morning.sgrwd.cn.gov.cn.sgrwd.cn http://www.morning.hlxxl.cn.gov.cn.hlxxl.cn http://www.morning.srkwf.cn.gov.cn.srkwf.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.lnyds.cn.gov.cn.lnyds.cn http://www.morning.fgqbx.cn.gov.cn.fgqbx.cn http://www.morning.ryfq.cn.gov.cn.ryfq.cn