spring-cloud-alibaba/blob/master/README-zh.md
SpringCloudAlibaba_test/tree/master
开发记录文档
1 控制台地址在Nacos-server(github下载)启动时会暴露。
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命名空间:
5 spring.application.name必须配置,否则注册不成功
6 持久化,默认使用内嵌数据库。集群模式为了数据一致性需要外部化数据库Mysql。
7 服务存储结构
serviceName=spring.application.name。一个service下注册多个服务提供者实例 IP:PORT。
主要作用:依赖隔离、流量\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格式:
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);
}
启动
(官方github下载)
首先需要获取 Sentinel 控制台,支持直接下载和源码构建两种方式。
启动控制台,执行 Java 命令 java -jar sentinel-dashboard.jar
完成 Sentinel 控制台的启动。 控制台默认的监听端口为 8080。
若下载官方编译好的sentinel-dashboard.jar启动报错,则需要git clone sentinel项目,找到sentinel-dashboard子模块(springboot)运行main()方法启动。
动态配置
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配置偶尔会失效。