樟树网站制作,济南的互联网公司,推广学校网站怎么做,本地装修网前言 本文小新为大家带来 微服务组件Sentinel介绍与使用 相关知识#xff0c;具体内容包括分布式系统存在的问题#xff0c;分布式系统问题的解决方案#xff0c;Sentinel介绍#xff0c;Sentinel快速开始#xff08;包括#xff1a;API实现Sentinel资源保护#xff0c;…前言 本文小新为大家带来 微服务组件Sentinel介绍与使用 相关知识具体内容包括分布式系统存在的问题分布式系统问题的解决方案Sentinel介绍Sentinel快速开始包括API实现Sentinel资源保护SentinelResource注解实现资源保护Sentinel控制台Spring Cloud Alibaba整合Sentinel 等进行详尽介绍~
不积跬步无以至千里不积小流无以成江海。每天进步一点点在成为强者的路上小新与大家共同成长
博主主页小新要变强 的主页 Java全栈学习路线可参考【Java全栈学习路线】最全的Java学习路线及知识清单Java自学方向指引内含最全Java全栈学习技术清单~ 算法刷题路线可参考算法刷题路线总结与相关资料分享内含最详尽的算法刷题路线指南及相关资料分享~ Java微服务开源项目可参考企业级Java微服务开源项目开源框架用于学习、毕设、公司项目、私活等减少开发工作让您只关注业务
↩️本文上接Spring Cloud Alibaba全家桶五——微服务组件Nacos配置中心 目录 微服务组件Sentinel介绍与使用前言目录一、分布式系统存在的问题二、分布式系统问题的解决方案三、Sentinel介绍四、Sentinel快速开始1️⃣API实现Sentinel资源保护2️⃣SentinelResource注解实现资源保护五、Sentinel控制台六、Spring Cloud Alibaba整合Sentinel后记一、分布式系统存在的问题
分布式系统可能会遇到的问题服务的可用性问题
服务的可用性场景在一个高度服务化的系统中我们实现的一个业务逻辑通常会依赖多个服务, 如图所示 如果其中的下单服务不可用就会出现线程池里所有线程都因等待响应而被阻塞从而造成整个服务链路不可用进而导致整个系统的服务雪崩如图所示 服务雪崩效应因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程就叫服务雪崩效应导致服务不可用的原因 在服务提供者不可用的时候会出现大量重试的情况用户重试、代码逻辑重试这些重试 终导致进一步加大请求流量。所以归根结底导致雪崩效应的 根本原因是大量请求线程同步等待造成的资源耗尽。当服务调用者使用同步调用时, 会产生大量的等待线程占用系统资源。一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。
二、分布式系统问题的解决方案
解决问题的关键就是提高系统的稳定性、恢复性。 常见的容错机制 超时机制 在不做任何处理的情况下服务提供者不可用会导致消费者请求线程强制等待而造成系统资源耗尽。加入超时机制一旦超时就释放资源。由于释放资源速度较快一定程度上可以抑制资源耗尽的问题。 服务限流 隔离
原理用户的请求将不再直接访问服务而是通过线程池中的空闲线程来访问服务如果线程池已满则会进行降级处理用户的请求不会被阻塞至少可以看到一个执行结果例如返回友好的提示信息而不是无休止的等待或者看到系统崩溃。
隔离前 隔离后 信号隔离信号隔离也可以用于限制并发访问防止阻塞扩散, 与线程隔离 大不同在于执行依赖代码的线程依然是请求线程该线程需要通过信号申请, 如果客户端是可信的且可以快速返回可以使用信号隔离替换线程隔离,降低开销。信号量的大小可以动态调整, 线程池大小不可以。
服务熔断
远程服务不稳定或网络抖动时暂时关闭就叫服务熔断。
现实世界的断路器大家肯定都很了解断路器实时监控电路的情况如果发现电路电流异常就会跳闸从而防止电路被烧毁。
软件世界的断路器可以这样理解实时监测应用如果发现在一定时间内失败次数/失败率达到一定阈值就“跳闸”断路器打开——此时请求直接返回而不去调用原本调用的逻辑。跳闸一段时间后例如10秒断路器会进入半开状态这是一个瞬间态此时允许一次请求调用该调的逻辑如果成功则断路器关闭应用正常调用如果调用依然不成功断路器继续回到打开状态过段时间再进入半开状态尝试——通过”跳闸“应用可以保护自己而且避免浪费资源而通过半开的设计可实现应用的“自我修复“。
所以同样的道理当依赖的服务有大量超时时在让新的请求去访问根本没有意义只会无畏的消耗现有资源。比如我们设置了超时时间为1s,如果短时间内有大量请求在1s内都得不到响应就意味着这个服务出现了异常此时就没有必要再让其他的请求去访问这个依赖了这个时候就应该使用断路器避免资源浪费。 服务降级有服务熔断必然要有服务降级。
所谓降级就是当某个服务熔断之后服务将不再被调用此时客户端可以自己准备一个本地的fallback回退回调返回一个缺省值。 例如(备用接口/缓存/mock数据) 。这样做虽然服务水平下降但好歹可用比直接挂掉要强当然这也要看适合的业务场景。 三、Sentinel介绍
Sentinel:——分布式系统的流量防卫兵。 随着微服务的流行服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件主要以流量为切入点从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
源码地址https://github.com/alibaba/Sentinel
官方文档https://github.com/alibaba/Sentinel/wiki
Sentinel具有以下特征
丰富的应用场景Sentinel 承接了阿里巴巴近 10年的双十一大促流量的核心场景例如秒杀即突发流量控制在系统容量可以承受的范围、消息削峰填谷、实时熔断下游不可用应用等。完备的实时监控Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据甚至 500台以下规模的集群的汇总运行情况。广泛的开源生态 Sentinel 提供开箱即用的与其它开源框架/库的整合模块例如与 Spring Cloud、Dubbo、 gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。完善的 SPI 扩展点Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点快速的定制逻辑。例如定制规则管理、适配数据源等。
阿里云提供了 企业级的 Sentinel 服务应用高可用服务 AHAS。 Sentinel和Hystrix对比
四、Sentinel快速开始
https://github.com/alibaba/Sentinel/wiki/如何使用
使用 Sentinel 来进行资源保护主要分为几个步骤:
定义资源定义规则检验规则是否生效
Entry entry null;
// 务必保证 finally 会被执行
try {// 资源名可使用任意有业务语义的字符串注意数目不能太多超过 1K超出几千请作为参数传入而不要直接作为资源名// EntryType 代表流量类型inbound/outbound其中系统规则只对 IN 类型的埋点生效entry SphU.entry(自定义资源名);// 被保护的业务逻辑// do something...
} catch (BlockException ex) {// 资源访问阻止被限流或被降级// 进行相应的处理操作
} catch (Exception ex) {// 若需要配置降级规则需要通过这种方式记录业务异常Tracer.traceEntry(ex, entry);
} finally {// 务必保证 exit务必保证每个 entry 与 exit 配对if (entry ! null) {entry.exit();}
}1️⃣API实现Sentinel资源保护
1引入依赖
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel‐core/artifactIdversion1.8.0/version
/dependency
2编写测试逻辑
RestController
slf4j
public class Hellocontroller {private static final String RESOURCE_NAAE hello ;RequestMapping(walue /hello)public String hello() {Entry entry null;try {//资源名可使用任意有业务语义的字符中比如方法名、接口名或其它可唯一标识的字符串。entry SphU.entry(RESOURCE_NAME);//被保护的业务逻辑String str hello world;log .info(str);return str;} catch (BlockException e1){// 资源访问阻止被限流或被降级// 进行相应的处理操作log.info(block!);} catch (Exception ex) {// 若需要配置降级规则需要通过这种方式记录业务异常Tracer.traceEntry(ex, entry);} finally {if(entry ! null){entry.exit();}}return null;}/*** 定义流程规则*/ PostConstructprivate static void initFlowRules() {ListFlowRule rules new ArrayList();FlowRule rule new FlowaRule();// 设置受保护的资源rule.setResource(RESOURCE_NAME);}
}3测试效果 4缺点
业务侵入性很强需要在controller中写入非业务代码配置不灵活若需要添加新的受保护资源需要手动添加init方法来添加流控规则。
2️⃣SentinelResource注解实现资源保护
SentinelResource 注解用来标识资源是否被限流、降级。
blockHandler: 定义当资源内部发生了BlockException应该进入的方法捕获的是Sentinel定义的异常。
fallback: 定义的是资源内部发生了Throwable应该进入的方法。
exceptionsToIgnore配置fallback可以忽略的异常。
源码入口com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect。
1引入依赖
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel‐annotation‐aspectj/artifactIdversion1.8.0/version
/dependency
2配置切面支持
Configuration
public class SentinelAspectConfiguration {Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
}3UserController中编写测试逻辑添加SentinelResource并配置blockHandler和fallback
RequestMapping(value /findOrderByUserId/{id})
SentinelResource(value findOrderByUserId,fallback fallback,fallbackClass ExceptionUtil.class,blockHandler handleException,blockHandlerClass ExceptionUtil.class)
public R findOrderByUserId(PathVariable(id) Integer id) {//ribbon实现String url http://mall‐order/order/findOrderByUserId/id;R result restTemplate.getForObject(url,R.class);if(id4){throw new IllegalArgumentException(非法参数异常);}return result;
}4编写ExceptionUtil注意如果指定了class方法必须是static方法
public class ExceptionUtil {public static R fallback(Integer id,Throwable e){return R.error(‐2,被异常降级啦);}public static R handleException(Integer id, BlockException e){return R.error(‐2,被限流啦);}
}5流控规则设置可以通过Sentinel dashboard配置
客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel‐transport‐simple‐http/artifactIdversion1.8.0/version
/dependency‐Dcsp.sentinel.dashboard.serverconsoleIp:port五、Sentinel控制台
下载控制台 jar 包并在本地启动可以参见此处文档https://github.com/alibaba/Sentinel/releases
#启动控制台命令
java ‐jar sentinel‐dashboard‐1.8.0.jar用户可以通过如下参数进行配置
-Dsentinel.dashboard.auth.usernamesentinel 用于指定控制台的登录用户名为 sentinel-Dsentinel.dashboard.auth.password123456 用于指定控制台的登录密码为 123456如果省略这两个参数默认用户和密码均为sentinel-Dserver.servlet.session.timeout7200 用于指定 Spring Boot 服务端 session 的过期时间如 7200 表示 7200 秒60m 表示 60 分钟默认为 30 分钟
java Dserver.port8858 Dsentinel.dashboard.auth.usernamexushu Dsentinel.dashboard.auth.password123456 jar sentineldashboard1.8.0.jar为了方便快捷启动可以在桌面创建.bat文件
java ‐Dserver.port8858 ‐Dsentinel.dashboard.auth.usernamexushu ‐Dsentinel.dashboard.auth.password123456 ‐jar D:\server\sentinel‐dashboard‐1.8.0.jar
pause访问http://localhost:8080/#/login 默认用户名密码 sentinel/sentinel Sentinel 会在客户端首次调用的时候进行初始化开始向控制台发送心跳包所以要确保客户端有访问量 六、Spring Cloud Alibaba整合Sentinel
1引入依赖
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring‐cloud‐starter‐alibaba‐sentinel/artifactId
/dependency2添加yml配置为微服务设置sentinel控制台地址添加Sentinel后需要暴露/actuator/sentinel端点,而Springboot默认是没有暴露该端点的所以需要设置测试 http://localhost:8800/actuator/sentinel
server:port: 8800spring:application:name: mall‐user‐sentinel‐democloud:nacos:discovery:server‐addr: 127.0.0.1:8848sentinel:transport:# 添加sentinel的控制台地址dashboard: 127.0.0.1:8080# 指定应用与Sentinel控制台交互的端口应用本地会起一个该端口占用的HttpServer# port: 87193在sentinel控制台中设置流控规则
资源名: 接口的API针对来源: 默认是default当多个微服务都调用这个资源时可以配置微服务名来对指定的微服务设置阈值阈值类型: 分为QPS和线程数 假设阈值为10QPS类型: 只得是每秒访问接口的次数10就进行限流线程数: 为接受请求该资源分配的线程数10就进行限流
4测试
因为QPS是1所以1秒内多次访问会出现如下情形 访问http://localhost:8800/actuator/sentinel 可以查看flowRules。 5微服务和Sentinel Dashboard通信原理
Sentinel控制台与微服务端之间实现了一套服务发现机制集成了Sentinel的微服务都会将元数据传递给Sentinel控制台架构图如下所示 流控针对privoder 熔断降级针对consumer。 后记 Java全栈学习路线可参考【Java全栈学习路线】最全的Java学习路线及知识清单Java自学方向指引内含最全Java全栈学习技术清单~ 算法刷题路线可参考算法刷题路线总结与相关资料分享内含最详尽的算法刷题路线指南及相关资料分享~