Spring Cloud Alibaba 随记

官方项目文档

spring-cloud-alibaba/blob/master/README-zh.md

本人测试项目

SpringCloudAlibaba_test/tree/master

开发记录文档

Nacos

1 控制台地址在Nacos-server(github下载)启动时会暴露。

Spring Cloud Alibaba 随记_第1张图片

2 在控制台可以控制服务下线/上线/权重,但是会有延迟。因为客户端在下次同步服务列表时才会感知。

3 nacos-server高可用集群

nacos集群是主从模式,至少需要三台才能保证选举投票,底层实现Raft协议。可以用nginx代理Nacos集群,其他服务访问nginx的地址/域名即可。集群模式为了数据一致性需要外部化数据库Mysql,数据库脚本和配置文件都在下面的官网文档中(配置文件中搜MySQL找到数据库配置项即可)。application.properties 配置端口、数据库,cluster.conf 配置集群中各主机所有 ip:port。

官网文档:

/cluster-mode-quick-start.html

网文:

hellxz/p/nacos-cluster-docker

didispace.com/spring-cloud-alibaba-5/

4 配置中心

结合springcloud  /nacos-config-example/readme-zh.md

单独springboot  /quick-start-spring-boot.html

给Bean的类添加 @RefreshScope  @ConfigurationProperties支持动态刷新。配置中心、服务名等不变信息,请配置在bootstrap.properties。启动时会主动拉取对应dataId的配置文件。

 

namespace+group+dataId 找到对应的配置文件

dataId 配置标识默认格式:

${prefix} - ${spring.profiles.active} . ${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档

    注意,当 activeprofile 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

  • file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension来配置。 目前只支持 properties 类型。

group分组:可以实现按机房分别配置等

  • 可选配置,group 默认为 DEFAULT_GROUP,可以通过 spring.cloud.nacos.config.group 配置。

namespace命名空间:

  • 可选配置,默认是public

5 spring.application.name必须配置,否则注册不成功

6 持久化,默认使用内嵌数据库。集群模式为了数据一致性需要外部化数据库Mysql。

7 服务存储结构

serviceName=spring.application.name。一个service下注册多个服务提供者实例 IP:PORT。

Spring Cloud Alibaba 随记_第2张图片

Spring Cloud Alibaba 随记_第3张图片

Sentinel

主要作用:依赖隔离、流量\RT控制、降级熔断...

资料:

官方文档:

         /spring-cloud-alibaba/wiki/Sentinel

         alibaba/Sentinel/wiki/如何使用

官方整合各种框架DEMO:/sentinel-demo

Spring Cloud Alibaba官方各种整合DEMO:推荐首先看sentinel-core-example

        spring-cloud-alibaba-examples/sentinel-example

项目使用心得:SpringCloudAlibaba随记

 

@RequestMapping("url")将以URL自动埋点

Sentinel可以为"/hello"或"re"做流控配置

1 旧版本BUG,AOP失效

@RequestMapping("/hello")
public String sayHello(){
   //直接调用方法aop失效 
   return doHello();
}

//AOP实现
@SentinelResource("re")
public String doHello(){
   return "hello";
}

2 @SentinelResource降级熔断

官方文档:wiki/注解支持

details/99689562

3 限流Warm Up模式

官方文档:wiki/流量控制

Warm Up为预热模式。比如Sentinel设置QPS限流500,但是服务长期处于很低的QPS。突然来一波高并发,Sentinel首次会在QPS= 500/3 时限流,阶梯式的把限流提升到500。

4 异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效

5 配置持久化:本地.json文件、Nacos(json)、Zookeeper、redis...

SpringCloudAlibaba整合文件配置:官网/application.properties

本地json文件:

网文使用案例:json文件配置

spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
spring.cloud.sentinel.datasource.ds1.file.data-type=json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow
 
spring.cloud.sentinel.datasource.ds2.file.file=classpath: degraderule.json
spring.cloud.sentinel.datasource.ds2.file.data-type=json
spring.cloud.sentinel.datasource.ds2.file.rule-type=degrade

json格式: 

Spring Cloud Alibaba 随记_第4张图片

Spring Cloud Alibaba 随记_第5张图片

Nacos(json)持久化: json格式与上面本地json相同

网文案例:/7c94c3a5f892

# nacos 服务器地址
spring.cloud.sentinel.datasource.ds.nacos.server-addr=localhost:8848
# nacos 中dataId
spring.cloud.sentinel.datasource.ds.nacos.dataId=${spring.application.name}-sentinel
spring.cloud.sentinel.datasource.ds.nacos.groupId=DEFAULT_GROUP
# 规则类型
spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow

6 通过代码配置规则:wiki/如何使用

//流量控制
private void initFlowQpsRule() {
    List rules = new ArrayList<>();
    FlowRule rule = new FlowRule(resourceName);
    // set limit qps to 20
    rule.setCount(20);
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule.setLimitApp("default");
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

//熔断降级
private void initDegradeRule() {
    List rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);
    // set threshold RT, 10 ms
    rule.setCount(10);
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
    rule.setTimeWindow(10);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

Sentinel控制台

启动

(官方github下载)

  1. 首先需要获取 Sentinel 控制台,支持直接下载和源码构建两种方式。

    1. 直接下载:下载 Sentinel 控制台
    2. 源码构建:进入 Sentinel Github 项目页面,将代码 git clone 到本地自行编译打包,参考此文档。
  2. 启动控制台,执行 Java 命令 java -jar sentinel-dashboard.jar完成 Sentinel 控制台的启动。 控制台默认的监听端口为 8080。

若下载官方编译好的sentinel-dashboard.jar启动报错,则需要git clone sentinel项目,找到sentinel-dashboard子模块(springboot)运行main()方法启动。

动态配置

Spring Cloud Alibaba 随记_第6张图片

1、每次设置规则只对当前选中服务名集群中所选机器进程的资源埋点生效。同样的服务可以为不同进程配置不同规则。 

2、上图中左侧是服务列表,点击一个服务名可以看到监控+链路+规则等选项。

3、上图中显示demo-consumer服务中一台服务实例/进程的请求情况。QPS等信息只记录时间窗范围以内,过期重置为0。

      上图中标出各个链路对应demo-consumer中的信息。测试代码:SpringCloudAlibaba_test/tree/master/demo-consumer

4、为对应的资源配置流量、降级、热点、授权规则。

流控:超过标准会抛出FlowException

注意:如上图有多个URL匹配@GetMapping(value = "/consumer-feign/{str}")。如果针对图中的url做限流规则,只会影响到一种url请求。比如对/consumer-feign/123做限流规则不会影响/consumer-feign/456请求。如果想控制所有符合/consumer-feign/{str}规则的请求  推荐对这种Mapping增加@SentinelResource统一资源挂载点。然后针对@SentinelResource做限流

   
    /**
     * @SentinelResource 资源埋点
     * 通过AOP包装被标注方法,监控其执行时间等信息
     * 注解说明 https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
     * @param str
     * @return
     */
    @GetMapping(value = "/consumer-feign/{str}")
    @SentinelResource(value = "demo-consumer/consumer-feign",blockHandler = "blockHandler",fallback = "fallHandler")
    public String feign(@PathVariable String str) {
        //fegin
        return echoService.echo(str);
    }
    /**
     * 原方法调用被配置的流控规则限流时触发BlockException,调用blockHandler
     * @param str 原方法参数
     * @param ex 异常
     * @return
     */
    public String blockHandler(String str, BlockException ex) {
        return "Sentinel-blockback "+str;
    }
    /**
     * 原方法调用触发配置的降级规则时抛出DegradeException,调用fallback
     * fallback还可以捕获业务异常
     * @param str
     * @return
     */
    public String fallHandler(String str) {
        return "Sentinel-fallback "+str;
    }

5 降级处理

@FeignClient@SentinelResource都可以配置降级,但是在Sentinel环境下推荐使用@SentinelResource配置。测试时@FeignClient的fallback配置偶尔会失效。

 

你可能感兴趣的:(spring,cloud)