1:搭建Nacos环境 nacos-server-1.3.1.tar.gz ,github下载太慢了
在linux 中新建usr/local/nacos 文件 把 nacos-server-1.3.1.tar.gz 拷贝到新建的文件夹中,
解压 tar -zxvf nacos-server-1.3.1.tar.gz 进入/usr/local/nacos/nacos/bin
启动 ./startup.sh -m standalone 单例模式启动
报错 Unable to start embedded Tomcat 通过查看日志 发现连接数据库问题 就配置mysql数据库 目前Nacos仅支持Mysql
数据库,且版本要求:5.6.5+
再次启动成功 访问 http://127.0.0.1:8848/nacos 默认账号nacos nacos
关闭nacos ./shutdown.sh 在bin目录下有关闭脚本
2:服务的endpoint
http://localhost:18082/actuator/nacos-discovery
endpoint提供的信息主要提供了两类
1:subsribes:显示当前服务有哪些服务订阅者
2:NacosDiscoveryProperties:显示当前服务实例关于Nacos的基础配置
nacos 密码直接暴露
3:Nacos服务配置数据模型
- Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境、测试环境和⽣产环境
- Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组,通常习惯⼀个系统归为⼀个组
- Service:某⼀个服务,⽐如简历微服务
- DataId:配置集或者可以认为是⼀个配置⽂件
Namespace + Group + Service 如同 Maven 中的GAV坐标, GAV坐标是为了锁定Jar,⼆这⾥是为了锁定服务
Namespace + Group + DataId 如同 Maven 中的GAV坐标, GAV坐标是为了锁定Jar,⼆这⾥是为了锁定配置⽂件
注:在测试Nacos自动刷新的过程中,刚开始通过注解的方式获取配置文件的数据,如下,在Nacos 控制台中修改对应的值 可以实现主动刷新
@Value("${user.name}")
private String name;
在设置spring.cloud.nacos.config.refresh-enabled=false后,不自动刷新,后取消该设置,再次测试 就不能自动刷新。最后通过添加该@RefreshScope 解决。在该过程中在启动类里面监控的值一直都是可以自动刷新的。
while(true){
ConfigurableEnvironment environment = applicationContext.getEnvironment();
String username = environment.getProperty("user.name");
String age = environment.getProperty("user.age");
String env = environment.getProperty("current.env");
System.out.println("username:"+username+" | age:"+age + " | env:"+env);
TimeUnit.SECONDS.sleep(1);
}
4:Nacos回滚
如果操作类型是插入,回滚之后配置就没有了
如果操作类型是更新,则会回滚到指定的配置
5:流量防卫兵Sentinel
在分布式系统里,许多服务之间通过远程调用实现信息交互,调用时不可避免会出现调用失败,比如超时,异常等原因导致调用失败,Sentinel能够保证在一个服务处问题的情况下,不会导致整体服务失败,避免级联故障(服务雪崩),
以提高分布式系统观的弹性
比如电商中的用户下订单,我们有两个服务,一个订单服务,一个减库存服务,当用户下订单时调用订单服务又调用减库存服务,如果减库存服务响应延迟或者没有响应,则会造成下订单的服务的线程挂起等待,如果大量的用户请求下
订单,或导致大量的请求堆积,引起下订单服务也不可用,如果还有另外一个服务依赖于订单服务,比如用户服务,它要查询用户订单,那么用户订单,那么用户服务查询订单也会引起大量的延迟和请求堆积,导致用户服务也不可用。
所以在微服务架构中,很容易造成服务故障的蔓延,引发整个微服务系统的瘫痪不可用。
常见的导致雪崩的情况有以下几种:
- 程序bug导致服务不可用,或者运行缓慢
- 缓存击穿,导致调用全部访问某服务,导致down掉
- 访问量的突然激增。
- 硬件问题
常用的容错方案或思想
1超时,设置比较短的超时时间,调用不成功,很短的时间就释放线程,避免大量线程堵塞等待,导致服务CPU,内存等资源标高(快速失败)
2:限流,超过设置的阈值就拒绝,比如评估系统的qps是3000,那么就可以设置限流阈值是2800
3:仓壁保护,就是一艘船不是一个船舱,而是把一个船舱划分为多个船舱,某个船舱进水了,其它船舱不收影响
4:断路器,熔断器也叫断路器,断路器就是对服务进行检测,如果发现在一定时间内失败次数或者失败率达到一定的值的话,就是跳闸,这时断路器就是直接打开了,此时不会调用原来的逻辑,而是回退调用我们自己定义的回退调用的方法。
跳闸一段时间后,一般时15秒之后,断路器就会进入半开状态,半开状态就是允许一次的调用,如果这次调用成功的话,就会关闭断路器,如果没有调用成功,则会再次打开断路器。这种半开的设计,可以实现自我的修复。
6:什么是sentinel?
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
在linux下部署sentinel 去官网下载jar包 https://github.com/alibaba/Sentinel 放到/usr/local/sentinel/sentinel-dashboard-1.7.2.jar 然后java -jar sentinel-dashboard-1.7.2.jar 启动 端口8080 账号密码 sentinel 启动之后访问后台会报connect time out错误
改成下面命令 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.2.jar 正常 。暂不知道原因
问题:把sentinel.dashboard 部署到公网服务器 服务可以注册进入 但是不能获取到服务的详细信息 把sentinel-dashboard在本地电脑启动没有 问题 原因 未知
流控模式
直接:就是直接对该资源进行控制
关联,关联某一个资源,被关联的资源达到阈值,则限制当前资源的访问
链路,记录指定链路上的流量。
流控效果
直接失败,直接控制
warm up,根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
限流效果:系统初始化的阈值为10/3等于3.即阈值刚开始为3.如果刚开始每秒请求数大于3则默认失败。过了5秒后阈值才慢慢升高恢复到10,即5秒后能承受大于3但是仍要小于10的请求,才不会被限流
排队等待,在QPS阈值达到后,新的请求就等待,直到超时,可以适用于突发流量的请求。等待的超时时间20000ms
Sentinel以三种方式衡量被访问的资源是否处理稳定的状态
1 平均响应时间 (DEGRADE_GRADE_RT
):当资源的平均响应时间超过阈值(DegradeRule
中的 count
,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule
中的 timeWindow
,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException
)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.
2 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO
):当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule
中的 count
)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule
中的 timeWindow
,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0]
,代表 0% - 100%。
3 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT
):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意 由于统计时间窗口时分钟级别的,若timeWindow小于60s,则结束熔断状态后仍可能在进入熔断状态。
Sentinel控制台配置热点规则,是一种特殊的流控规则,支持对特定参数和参数的值限流。
热点参数限流会统计参数中的热点参数,并根据配置的限流阀值与模式,对包含热点参数的资源调用进行限流。热点参数限制可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel利用LRU策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。
适用于存在热点参数(某些参数QPS很高),并希望提升API可用性的场景。
注意:参数必须是基本类型或者String。
使用红框中的增加热点规则是不成功的,必须使用app才可以生效
@GetMapping("/app")
@SentinelResource(value = "app", fallback = "fallbackHandler")
public String app(@RequestParam(value = "a",required = false) String a,
@RequestParam(value = "b",required = false) String b){
System.out.println("/app/-->" + a + "--" +b);
return restTemplate.getForObject("http://springcloud-alibaba-nacos-provider/test",String.class);
}
public String fallbackHandler(String a,String b) {
return "热点参数a= " + a + " 限流了";
}
如果在@SentinelResource中,不添加fallback ,如果达到单机阀值,则直接抛出错误页面。而添加后达到单机阀值,则返回自定义的值。
系统规则
- Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。
- 系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5。
- 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
- CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
Resttemplate整合sentinel
#开启sentinel对resttemplate的支持,false是关闭
resttemplate.sentinel.enabled=true
在RestTemplate上添加注解