项目
博客
文档
归档
资源链接
关于我
项目
博客
文档
归档
资源链接
关于我
41| 微服务配置中心引入和Sentinel限流配置
2024-09-19
·
·
原创
·
·
本文共 878个字,预计阅读需要 3分钟。
### Nacos配置中心开发和配置 * 配置中心引入-common项目添加 ```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
``` - 配置文件优先级讲解 - 不能使用原先的application.yml, 需要使用`bootstrap.yml`作为配置文件 - 配置读取优先级 bootstrap.yml > application.yml - 配置实操 - 服务迁移配置(除了bootstrap.yml配置的,其他都迁移到`nla-order-service-dev.yml`文件中) - 增加bootstrap.yml ```yml spring: application: name: nla-order-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #Nacos注册中心地址 config: server-addr: 127.0.0.1:8848 #Nacos配置中心地址 file-extension: yml #文件拓展格式,与配置中心配置的文件后缀保持一致:.yml/.yaml profiles: active: dev #设置⽇志级别,ERROR/WARN/INFO/DEBUG,默认是INFO以上才显示 logging: level: root: INFO # nacos日志问题,一致打印 com.alibaba.nacos.client.config.impl: WARN ``` * 启动微服务服务验证 * 测试是否可以获取配置 ```shell # 浏览器访问 http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nla-coupon-service-dev.yml&group=DEFAULT_GROUP # 部分同学如果出现 config dta not exist 建议重启nacos # 除开上述问题,如果还是拉取不到配置(保持和课程版本,文件名一样先) # 重新构建下项目 mvn clean package -U # 然后重启IDEA ``` * dataId组成,在 Nacos Spring Cloud 中,dataId 的完整格式如下 ```shell ${prefix}-${spring.profiles.active}.${file-extension} # prefix 默认为 spring.application.name 的值 # spring.profiles.active 即为当前环境对应的 profile # 当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension} # file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。 ``` ### 高并发下的限流神器Sentinel容器化部署 什么是Sentinel - 阿里巴巴开源的分布式系统流控工具 - 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性 - 丰富的应用场景:消息削峰填谷、集群流量控制、实时熔断下游不可用应用等 - 完备的实时监控:Sentinel 同时提供实时的监控功能 - 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合 ![](https://yn-blog.oss-cn-chengdu.aliyuncs.com/v_2023/2024-09-19/bcae2d39-101e-4751-a2ed-3eb8e55df9d9.png) 文档:https://github.com/alibaba/Sentinel/wiki/控制台 Sentinel 分为两个部分 - 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo、Spring Cloud 等框架也有较好的支持。 - 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。 docker容器化部署sentinel ```shell docker pull bladex/sentinel-dashboard:latest # 查看镜像 docker images # 启动Sentinel docker run --name sentinel -d -p 8858:8858 镜像id # 访问Sentinel(记得检查防火墙或者网络安全组) http://公网ip:8858 # 登录密码默认sentinel/sentinel ``` 下载jar直接启动部署: ```shell #下载最新的sentinel-dashboard包:https://github.com/alibaba/Sentinel/releases # 部署文档: https://sentinelguard.io/zh-cn/docs/dashboard.html # 启动: java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar # 默认用户名和密码都是 sentinel ``` ### 微服务整合Sentinel项目依赖配置 common项目添加依赖(网关也需要添加) ```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
``` 多个微服务接入Sentinel配置 ```yaml spring: cloud: sentinel: transport: dashboard: 192.168.30.130:8080 port: 9999 #dashboard: 8080 控制台端口 #port: 9999 本地启的端口,随机选个不能被占用的,与dashboard进行数据交互,会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互, 若被占用,则开始+1一次扫描 ``` * 微服务注册上去后,由于Sentinel是懒加载模式,所以需要访问微服务后才会在控制台出现 ### 网关+微服务Sentinel限流实战和问题引出 * 优惠券列表接口限流配置: http://127.0.0.1:8089/coupon/cop/coupon/v1/page_coupon * 其他的根据实际情况配置:配置QPS 为1, ![](https://yn-blog.oss-cn-chengdu.aliyuncs.com/v_2023/2024-09-19/80311a61-f6b6-4c1b-8021-fdd2b35bb51e.png) 此时请求过快是就限流:Blocked by Sentinel (flow limiting) * **默认是在微服务内存中,service服务重启后就丢失*** * 解决:持久化配置到配置中心Nacos, 并落地数据库 * 流控协议不明显 * Blocked by Sentinel (flow limiting) * 影响接口性能的点 * 代码 * CPU、内存 * 带宽、IO ### 微服务整合Sentinel自定义降级异常数据响应 * 异常种类 ```java FlowException //限流异常 DegradeException //降级异常 ParamFlowException //参数限流异常 SystemBlockException //系统负载异常 AuthorityException //授权异常 ``` * 【新版】实现BlockExceptionHandler并且重写handle方法(在common模块中) ```java @Component public class SentinelBlockHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception { JsonData jsonData = null; if(e instanceof FlowException){ jsonData = JsonData.buildResult(BizCodeEnum.CONTROL_FLOW); }else if(e instanceof DegradeException){ jsonData = JsonData.buildResult(BizCodeEnum.CONTROL_DEGRADE); } else if(e instanceof AuthorityException){ jsonData = JsonData.buildResult(BizCodeEnum.CONTROL_AUTH); } httpServletResponse.setStatus(200); CommonUtil.sendJsonMessage(httpServletResponse,jsonData); } } ``` ### 生产环境-Sentinel流控规则持久化到nacos配置中心 * 文档: https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel * 生产环境下更常用 push 模式的数据源 * 流控规则持久化到nacos配置中心配置-common和gateway都添加 ```xml
com.alibaba.csp
sentinel-datasource-nacos
``` * 配置持久化数据源 ```yaml #流控面板ip sentinel: # Sentinel配置,如果上面配置了就不需要这块 transport: dashboard: 192.168.30.130:8080 port: 9999 #流控规则持久化到nacos配置中心 datasource: ds1: nacos: server-addr:192.168.0.88:8848 # ncaos地址 data-id: ${spring.application.name}.json group-id: DEFAULT_GROUP data-type: json rule-type: flow ``` * 配置中心配置`nla-coupon-service.json` ```json [ { "resource":"/test", "controlBehavior":0, "count":2, "grade":1, "limitApp":"default", "strategy":0 }, { "resource":"/cop/coupon/v1/page_coupon", "controlBehavior":0, "count":1, "grade":1, "limitApp":"default", "strategy":0 } ] ``` * 解释 ```shell resource:资源名, limitApp:流控针对的调用来源,若为 default 则不区分调用来源 grade:限流类型(QPS 或并发线程数),0代表根据并发数量来限流,1代表根据QPS来进行流量控制 count:限流阈值 strategy:调用关系限流策略 controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队) clusterMode:是否为集群模式,存在问题 ``` > 配置启动之后,在sentinel控制台下该服务的`流控规则`下可以看到持久化配置的数据。 * 流控规则持久化测试 * 如果再sentinel控制台修改了配置,会不会反向同步到nacos里? * 再sentinel控制台修改不会同步到nacos * 如果要修改策略,**只能在nacos里面修改** * 集群流控问题 * https://github.com/alibaba/Sentinel/wiki/%E9%9B%86%E7%BE%A4%E6%B5%81%E6%8E%A7#%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F * 限流测试-重启微服务 * 每个微服务都没做流控限制(优惠券微服务只是做了一个配置的例子)