springcloud alibaba 框架学习总结

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上添加注解

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值