1 版本说明
2 官方文档
3 开发指南
3.1 Nacos 服务注册与发现
3.1.1 Nacos 单机部署
使用 Docker 单机模式启动 Nacos(注意:容器下部署需要暴露 3 个端口)。
docker run -d \-e PREFER_HOST_MODE=hostname \-e MODE=standalone \-e NACOS_APPLICATION_PORT=8848 \-e NACOS_SERVERS="192.168.50.163:8848" \-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_SERVICE_HOST=192.168.50.163 \-e MYSQL_SERVICE_PORT=3306 \-e MYSQL_SERVICE_USER=root \-e MYSQL_SERVICE_PASSWORD=demo \-e MYSQL_SERVICE_DB_NAME=nacos \-e NACOS_SERVER_IP=192.168.50.163 \-p 8848:8848 \-p 9848:9848 \-p 9849:9849 \--name nacos-node1 \nacos/nacos-server
请注意,Nacos 2.0 版本相比 1.X 新增了 gRPC 的通信方式,在设置的主端口 8848 基础上偏移 1000 生成 9848 端口和偏移 1001 生成 9849 端口,因此,在部署 Docker 时需要设置相关端口,允许对外访问。
启动完成后,访问 http://192.168.50.163:8848/nacos,初始用户密码为 nacos/nacos。
3.1.2 Nacos 集群部署
以 Docker 伪集群搭建为例,分别启动 nacos-node1、nacos-node2、nacos-node3 节点。
docker run -d \-e PREFER_HOST_MODE=hostname \-e MODE=cluster \-e NACOS_APPLICATION_PORT=8850 \-e NACOS_SERVERS="192.168.50.163:8850 192.168.50.163:8852 192.168.50.163:8854" \-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_SERVICE_HOST=192.168.50.163 \-e MYSQL_SERVICE_PORT=3306 \-e MYSQL_SERVICE_USER=root \-e MYSQL_SERVICE_PASSWORD=数据库密码 \-e MYSQL_SERVICE_DB_NAME=nacos \-e NACOS_SERVER_IP=192.168.50.163 \-e JVM_XMS=256m \-e JVM_XMX=256m \-p 8850:8850 \-p 9850:9850 \-p 9851:9851 \--name nacos-node1 \nacos/nacos-server
启动 nacos-node2 节点。
docker run -d \-e PREFER_HOST_MODE=hostname \-e MODE=cluster \-e NACOS_APPLICATION_PORT=8852 \-e NACOS_SERVERS="192.168.50.163:8850 192.168.50.163:8852 192.168.50.163:8854" \-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_SERVICE_HOST=192.168.50.163 \-e MYSQL_SERVICE_PORT=3306 \-e MYSQL_SERVICE_USER=root \-e MYSQL_SERVICE_PASSWORD=数据库密码 \-e MYSQL_SERVICE_DB_NAME=nacos \-e NACOS_SERVER_IP=192.168.50.163 \-e JVM_XMS=256m \-e JVM_XMX=256m \-p 8852:8852 \-p 9852:9852 \-p 9853:9853 \--name nacos-node2 \nacos/nacos-server
启动 nacos-node3 节点。
docker run -d \-e PREFER_HOST_MODE=hostname \-e MODE=cluster \-e NACOS_APPLICATION_PORT=8854 \-e NACOS_SERVERS="192.168.50.163:8850 192.168.50.163:8852 192.168.50.163:8854" \-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_SERVICE_HOST=192.168.50.163 \-e MYSQL_SERVICE_PORT=3306 \-e MYSQL_SERVICE_USER=root \-e MYSQL_SERVICE_PASSWORD=数据库密码 \-e MYSQL_SERVICE_DB_NAME=nacos \-e NACOS_SERVER_IP=192.168.50.163 \-e JVM_XMS=256m \-e JVM_XMX=256m \-p 8854:8854 \-p 9854:9854 \-p 9855:9855 \--name nacos-node3 \nacos/nacos-server
Nacos 的集群依赖 Nginx 的反向代理。由于 Nacos 2.0 版本新增了 gRPC 端口,需要 Nginx 开启 stream 模块实现 TCP 协议的转发。Nginx 默认安装时并没有加载 stream 模块,因此我们需要在 ./configure 编译时新增 --with-stream 选项。
# 需要开启 Nginx 的 stream 模块,执行 ./configure 编译时新增 --with-stream 选项./configure --prefix=/opt/nginx --sbin-path=/opt/nginx/sbin/nginx --conf-path=/opt/nginx/conf/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-stream
关于启动 nginx 容器如何开启 stream 模块这块还在研究中。
docker run --name nginx -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 8080:8080 -d nginx
修改 /opt/nginx/conf/nginx.conf 的内容,配置 Nacos 服务的代理。
http {# ..upstream nacos-cluster {server 192.168.50.163:8850;server 192.168.50.163:8852;server 192.168.50.163:8854;}server {listen 8848;server_name _;location / {proxy_pass http://nacos-cluster;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE-HOST $remote_addr;add_header X-Cache $upstream_cache_status;add_header Cache-Control no-cache;}}}stream {upstream nacos-grpc-9848 {server 192.168.50.163:9850;server 192.168.50.163:9852;server 192.168.50.163:9854;}server {listen 9848;proxy_connect_timeout 300s;proxy_timeout 300s;proxy_pass nacos-grpc-9848;}upstream nacos-grpc-9849 {server 192.168.50.163:9851;server 192.168.50.163:8853;server 192.168.50.163:8855;}server {listen 9849;proxy_connect_timeout 300s;proxy_timeout 300s;proxy_pass nacos-grpc-9849;}}
访问 Nginx 代理后的地址 http://192.168.50.163:8848/nacos。
3.1.3 服务提供者注册到 Nacos
Nacos Discovery 使用文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
在 pom.xml 文件中添加相关依赖。
<dependency><groupid>com.alibaba.cloud</groupid><artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid></dependency>
在 bootstrap.yaml 文件中新增相关配置。
spring:application:name: democloud:nacos:discovery:server-addr: 192.168.50.163:8848namespace: demo # 环境隔离,默认使用 public 命名空间group: DEFAULT_GROUP # 组件隔离,默认使用 DEFAULT_GROUP 组名username: 开源版 nacos 账号password: 开源版 nacos 密码# access-key: 阿里云账号名称# secret-key: 阿里云账号密码management:endpoints:web:exposure:include: '*'
Spring Boot 启动类新增 @EnableDiscoveryClient 注解。
@EnableDiscoveryClient@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
3.1.4 服务消费者注册到 Nacos
3.1.5 异构微服务注册到 Nacos
Java 平台的项目,在 pom.xml 文件中添加相关依赖。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sidecar</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>
在 application.yaml 添加如下配置:
spring:cloud:nacos:discovery:server-addr: 192.168.50.163:8848application:name: sidecar-simpleserver:port: 8080sidecar:ip: localhostport: 8081health-check-url: http://localhost:8081/healthmanagement:endpoint:health:show-details: always
非 Java 平台语言,需要自行实现 /health 接口,返回特定的 JSON 数据,格式如下:
返回服务在线状态的报文格式如下:
{status: "UP"}
返回服务离线状态的报文格式如下:
{status: "DOWN"}
3.1.6 Nacos 接入 Prometheus 监控
访问 Nacos 端点是否正常:http://192.168.50.163:8848/nacos/actuator/prometheus。
设置 Prometheus 的配置文件 /opt/docker/prometheus/etc/prometheus.yaml。
global:scrape_interval: 15sevaluation_interval: 15sscrape_configs:- job_name: nacosmetrics_path: '/nacos/actuator/prometheus'static_configs:- targets: ['192.168.50.163:8850','192.168.50.163:8852','192.168.50.163:8854']
启动 Prometheus 容器,挂载 /opt/docker/prometheus/etc/prometheus.yaml。
docker run -d -p 9090:9090 --name=prometheus -v /opt/docker/prometheus/etc/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
访问 http://192.168.50.163:9090/graph,输入 nacos_monitor 关键字验证是否返回数据。
访问 http://192.168.50.163:9090/targets,查看 Nacos 集群状态是否为 UP。
启动 Grafana 容器,挂在数据到宿主机的 /opt/docker/grafana 目录。
docker run -d -p 3000:3000 --name=grafana -v /opt/docker/grafana:/var/lib/grafana grafana/grafana
访问 http://192.168.50.163:3000/dashboards。
导入 Nacos 官方提供的 Grafana 模板。
{"annotations": {"list": [{"builtIn": 1,"datasource": "-- Grafana --","enable": true,"hide": true,"iconColor": "rgba(0, 211, 255, 1)","name": "Annotations & Alerts","type": "dashboard"}]},"editable": true,"gnetId": null,"graphTooltip": 0,"id": 8,"iteration": 1547344645256,"links": [],"panels": [{"collapsed": false,"gridPos": {"h": 1,"w": 24,"x": 0,"y": 0},"id": 80,"panels": [],"title": "nacos monitor","type": "row"},{"cacheTimeout": null,"colorBackground": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","format": "none","gauge": {"maxValue": 100,"minValue": 0,"show": false,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 3,"w": 3,"x": 0,"y": 1},"id": 89,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "count(nacos_monitor{name=\"configCount\"})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "","title": "UP","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","format": "none","gauge": {"maxValue": 100,"minValue": 0,"show": false,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 3,"w": 3,"x": 3,"y": 1},"id": 90,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "max(nacos_monitor{name='domCount'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "","title": "service count","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","format": "none","gauge": {"maxValue": 100,"minValue": 0,"show": false,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 3,"w": 3,"x": 6,"y": 1},"id": 93,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "max(nacos_monitor{name='ipCount'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "","title": "ip count","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","format": "none","gauge": {"maxValue": 100,"minValue": 0,"show": false,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 3,"w": 3,"x": 9,"y": 1},"id": 92,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "max(nacos_monitor{name='configCount', instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "","title": "config count","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","format": "none","gauge": {"maxValue": 100,"minValue": 0,"show": false,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 3,"w": 3,"x": 12,"y": 1},"id": 91,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "sum(nacos_monitor{name='longPolling'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "","title": "long polling","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","format": "none","gauge": {"maxValue": 100,"minValue": 0,"show": false,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 3,"w": 3,"x": 15,"y": 1},"id": 88,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "sum(nacos_monitor{name='getConfig', instance=~'$instance'}) by (name)","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "","title": "config push total","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"content": "<br/><center><a href=\"https://nacos.io\">\n<img src=\"https://nacos.io/img/nacos.png\" style=\"height: 50px;\" >\n</a>\n</center>","gridPos": {"h": 3,"w": 6,"x": 18,"y": 1},"id": 82,"links": [],"mode": "html","title": "","type": "text"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 100,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 0,"y": 4},"id": 33,"interval": "","links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "%","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"repeat": null,"repeatDirection": "h","sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "max(system_cpu_usage{instance=~'$instance'}) * 100","format": "time_series","interval": "","intervalFactor": 1,"legendFormat": "","refId": "A"}],"thresholds": "50,80","title": "cpu","type": "singlestat","valueFontSize": "70%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 70,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 9,"y": 4},"id": 32,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "%","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "sum(jvm_memory_used_bytes{area=\"heap\", instance=~'$instance'})/sum(jvm_memory_max_bytes{area=\"heap\", instance=~'$instance'}) * 100","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "50,70","title": "memory","type": "singlestat","valueFontSize": "70%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"dashboardFilter": "","folderId": null,"gridPos": {"h": 16,"w": 6,"x": 18,"y": 4},"id": 48,"limit": 10,"links": [],"nameFilter": "","onlyAlertsOnDashboard": false,"repeat": null,"show": "current","sortOrder": 1,"stateFilter": [],"title": "alert list","transparent": false,"type": "alertlist"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 1500,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 0,"y": 8},"id": 29,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "max(jvm_threads_daemon_threads{instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "800,1500","title": "threads","type": "singlestat","valueFontSize": "70%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 20,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 9,"y": 8},"id": 30,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "max(system_load_average_1m{instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "5,10","title": "load","type": "singlestat","valueFontSize": "70%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 5000,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 0,"y": 12},"id": 61,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "ms","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "sum(rate(nacos_timer_seconds_sum{instance=~'$instance'}[1m]))/sum(rate(nacos_timer_seconds_count{instance=~'$instance'}[1m])) * 1000","format": "time_series","intervalFactor": 1,"legendFormat": "","refId": "A"}],"thresholds": "3000,5000","title": "notify rt","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 5000,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 9,"y": 12},"id": 26,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "ms","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "sum(rate(http_server_requests_seconds_sum{instance=~'$instance'}[1m]))/sum(rate(http_server_requests_seconds_count{instance=~'$instance'}[1m])) * 1000","format": "time_series","intervalFactor": 1,"legendFormat": "","refId": "A"}],"thresholds": "3000,5000","title": "rt","type": "singlestat","valueFontSize": "80%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 2000,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 0,"y": 16},"id": 25,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "sum(rate(http_server_requests_seconds_count{instance=~'$instance'}[1m]))","format": "time_series","intervalFactor": 1,"legendFormat": "","refId": "A"}],"thresholds": "1000,2000","title": "qps","type": "singlestat","valueFontSize": "70%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"cacheTimeout": null,"colorBackground": false,"colorPrefix": false,"colorValue": false,"colors": ["#299c46","rgba(237, 129, 40, 0.89)","#d44a3a"],"datasource": "Prometheus","decimals": null,"format": "none","gauge": {"maxValue": 5000,"minValue": 0,"show": true,"thresholdLabels": false,"thresholdMarkers": true},"gridPos": {"h": 4,"w": 9,"x": 9,"y": 16},"id": 70,"interval": null,"links": [],"mappingType": 1,"mappingTypes": [{"name": "value to text","value": 1},{"name": "range to text","value": 2}],"maxDataPoints": 100,"nullPointMode": "connected","nullText": null,"postfix": "ms","postfixFontSize": "50%","prefix": "","prefixFontSize": "50%","rangeMaps": [{"from": "null","text": "N/A","to": "null"}],"sparkline": {"fillColor": "rgba(31, 118, 189, 0.18)","full": false,"lineColor": "rgb(31, 120, 193)","show": false},"tableColumn": "","targets": [{"expr": "max(nacos_monitor{name='avgPushCost', instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": "1000,5000","title": "avgPushCost","type": "singlestat","valueFontSize": "70%","valueMaps": [{"op": "=","text": "N/A","value": "null"}],"valueName": "current"},{"collapsed": false,"gridPos": {"h": 1,"w": 24,"x": 0,"y": 20},"id": 78,"panels": [],"title": "nacos detail","type": "row"},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 21},"id": 20,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(http_server_requests_seconds_sum{uri=~'/v1/cs/configs|/nacos/v1/ns', instance=~'$instance'}[1m])/rate(http_server_requests_seconds_count{uri=~'/v1/cs/configs|/nacos/v1/ns/instance|/nacos/v1/ns/health', instance=~'$instance'}[1m])) by (method,uri) * 1000","format": "time_series","intervalFactor": 1,"refId": "A"},{"expr": "sum(rate(http_server_requests_seconds_sum{instance=~'$instance'}[1m]))/sum(rate(http_server_requests_seconds_count{instance=~'$instance'}[1m])) * 1000","format": "time_series","hide": false,"intervalFactor": 1,"legendFormat": "all","refId": "B"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "rt","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 21},"id": 41,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","repeat": "group","repeatDirection": "h","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(nacos_monitor{name='longPolling', instance=~'$instance'})","format": "time_series","intervalFactor": 1,"legendFormat": "","refId": "A"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "long polling","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": "","logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 21},"id": 37,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "max(system_load_average_1m{instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "load 1m","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 26},"id": 18,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(http_server_requests_seconds_count{uri=~'/v1/cs/configs|/nacos/v1/ns/instance|/nacos/v1/ns/health', instance=~'$instance'}[1m])) by (method,uri)","format": "time_series","intervalFactor": 1,"refId": "A"},{"expr": "sum(rate(http_server_requests_seconds_count[1m]))","format": "time_series","intervalFactor": 1,"refId": "B"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "qps","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"transparent": false,"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 26},"id": 52,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(nacos_monitor{name='leaderStatus', instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "B"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "leaderStatus","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 26},"id": 50,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(nacos_monitor{name='avgPushCost', instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "avgPushCost","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 31},"id": 53,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "max(nacos_monitor{name='maxPushCost', instance=~'$instance'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "maxPushCost","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 31},"id": 83,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(nacos_monitor{name='publish', instance=~'$instance'}) by (name)","format": "time_series","intervalFactor": 1,"legendFormat": "publish config","refId": "A"},{"expr": "sum(nacos_monitor{name='getConfig', instance=~'$instance'}) by (name)","format": "time_series","intervalFactor": 1,"legendFormat": "get config","refId": "B"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "config statistics","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 31},"id": 16,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_monitor{name=~'.*HealthCheck', instance=~'$instance'}[1m])) by (name) * 60","format": "time_series","intervalFactor": 1,"legendFormat": "","refId": "A"}],"thresholds": [],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "health check","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"collapsed": false,"gridPos": {"h": 1,"w": 24,"x": 0,"y": 36},"id": 74,"panels": [],"title": "nacos alert","type": "row"},{"alert": {"conditions": [{"evaluator": {"params": [50],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","for": "1m","frequency": "1m","handler": 1,"name": "cpu alert","noDataState": "ok","notifications": [{"id": 1}]},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 37},"id": 45,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "max(system_cpu_usage) * 100","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 50}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "cpu alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [15],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "load 1m alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 37},"id": 86,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "max(system_load_average_1m)","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 15}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "load alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [60],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","5m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "memory alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 37},"id": 46,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(jvm_memory_used_bytes{area=\"heap\"})/sum(jvm_memory_max_bytes{area=\"heap\"}) * 100","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 60}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "memory alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [500],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "threads alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 42},"id": 39,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "max(jvm_threads_daemon_threads)","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 500}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "threads alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [5],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","for": "1m","frequency": "1m","handler": 1,"message": "too many full gc","name": "gc alert","noDataState": "ok","notifications": [{"id": 1}]},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 42},"id": 38,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "max(rate(jvm_gc_pause_seconds_count{action=\"end of major GC\"}[5m])) * 300","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 5}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "gc alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [10],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "notify task alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 42},"id": 49,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(nacos_monitor{name='notifyTask'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 10}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "notify task alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [5000],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["B","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "rt alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 47},"id": 85,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(http_server_requests_seconds_sum[1m]))/sum(rate(http_server_requests_seconds_count[1m])) * 1000","format": "time_series","hide": false,"intervalFactor": 1,"refId": "B"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 5000}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "rt alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [5000],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "long polling alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 47},"id": 84,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","repeatDirection": "h","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "max(nacos_monitor{name='longPolling'})","format": "time_series","intervalFactor": 1,"legendFormat": "","refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 5000}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "long polling alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": "","logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "config unhealth exception alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 47},"id": 56,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_exception_total{name='unhealth'}[1m])) * 60","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "config unhealth exception alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "db exception alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 52},"id": 54,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_exception_total{name='db'}[1m])) * 60","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "db exception alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "failedPush alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 52},"id": 51,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(nacos_monitor{name='failedPush'})","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "failed push alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "illegalArgument exception alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 52},"id": 59,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_exception_total{name='illegalArgument'}[1m])) * 60","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "illegalArgument exception alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","5m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "naming disk exception alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 57},"id": 57,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_exception_total{name='disk'}[1m])) * 60","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "naming disk exception alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "config notify exception alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 8,"y": 57},"id": 55,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_exception_total{name='configNotify'}[1m])) * 60","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "config notify exception alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "naming leader send beat failed exception alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 16,"y": 57},"id": 58,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_exception_total{name='leaderSendBeatFailed'}[1m])) * 60","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "naming leader send beat failed exception alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}},{"alert": {"conditions": [{"evaluator": {"params": [1],"type": "gt"},"operator": {"type": "and"},"query": {"params": ["A","1m","now"]},"reducer": {"params": [],"type": "avg"},"type": "query"}],"executionErrorState": "keep_state","frequency": "60s","handler": 1,"name": "nacos_exception alert","noDataState": "ok","notifications": []},"aliasColors": {},"bars": false,"dashLength": 10,"dashes": false,"datasource": "Prometheus","fill": 1,"gridPos": {"h": 5,"w": 8,"x": 0,"y": 62},"id": 60,"legend": {"avg": false,"current": false,"max": false,"min": false,"show": true,"total": false,"values": false},"lines": true,"linewidth": 1,"links": [],"nullPointMode": "null","percentage": false,"pointradius": 5,"points": false,"renderer": "flot","seriesOverrides": [],"spaceLength": 10,"stack": false,"steppedLine": false,"targets": [{"expr": "sum(rate(nacos_exception_total{name='nacos'}[1m])) * 60","format": "time_series","intervalFactor": 1,"refId": "A"}],"thresholds": [{"colorMode": "critical","fill": true,"line": true,"op": "gt","value": 1}],"timeFrom": null,"timeRegions": [],"timeShift": null,"title": "nacos exception alert","tooltip": {"shared": true,"sort": 0,"value_type": "individual"},"type": "graph","xaxis": {"buckets": null,"mode": "time","name": null,"show": true,"values": []},"yaxes": [{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true},{"format": "short","label": null,"logBase": 1,"max": null,"min": null,"show": true}],"yaxis": {"align": false,"alignLevel": null}}],"refresh": false,"schemaVersion": 16,"style": "dark","tags": [],"templating": {"list": [{"allValue": ".*:8848","current": {"selected": true,"text": "All","value": "$__all"},"datasource": "Prometheus","definition": "label_values(instance)","hide": 0,"includeAll": true,"label": "instance","multi": false,"name": "instance","options": [],"query": "label_values(instance)","refresh": 2,"regex": "/.*:8848/","skipUrlSync": false,"sort": 0,"tagValuesQuery": "","tags": [],"tagsQuery": "","type": "query","useTags": false}]},"time": {"from": "now-5m","to": "now"},"timepicker": {"refresh_intervals": ["5s","10s","30s","1m","5m","15m","30m","1h","2h","1d"],"time_options": ["5m","15m","1h","6h","12h","24h","2d","7d","30d"]},"timezone": "","title": "Nacos","uid": "Bz_QALEiz1","version": 38}
3.2 Nacos 配置管理
在 pom.xml 文件中添加相关依赖。
<dependency>
<groupid>com.alibaba.cloud</groupid>
<artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
</dependency>
在 bootstrap.yaml 文件中新增相关配置。
spring:
application:
name: demo
cloud:
nacos:
config:
server-addr: 192.168.50.163:8848
namespace: demo
group: DEFAULT_GROUP
file-extension: yaml
username: 开源版 nacos 账号
password: 开源版 nacos 密码
# access-key: 阿里云账号名称
# secret-key: 阿里云账号密码
# sharedConfigs: # 支持自定义 dataId,支持一个应用对应多个配置文件
# - data-id: common-db.yaml
# group: REFRESH_GROUP
# refresh: true
# - data-id: common-mq.yaml
# group: REFRESH_GROUP
# refresh: true
management:
endpoints:
web:
exposure:
include: '*'
3.2.1 使用 @RefreshScope 支持 @Value 动态刷新
通过 @Value + @RefreshScope 可以实现配置的注入,但是个人不建议这样使用,请看 3.2.2 小节。
@RefreshScope
@RestController
public class TestController {
// @Value 可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用 @RefreshScope 注解实现动态刷新
@Value("${name}")
private String name;
@GetMapping("/test")
public String hello() {
return name;
}
}
3.2.2 使用 @ConfigurationProperties 管理配置项
建议使用 @ConfigurationProperties 代替 @Value获取配置值,理由:@Value 使用字符串标识,多处引用不方便维护,很难通过编译报错发现拼错名称的问题。实测 @ConfigurationProperties 是支持动态刷新配置的,当然,你也可以用 @NacosConfigurationProperties 作为备选项。
@ConfigurationProperties(prefix = "test")
public class TestProperties {
private String name; // 读取 "test.name" 配置值
}
@Component
public class TestComponent {
// 注入属性配置对象
private final TestProperties properties;
public TestComponent(TestProperties properties) {
this.properties = properties;
}
public void method() {
// properties.getName();
}
}
3.3 Sentinel 限流熔断降级
3.3.1 定制 Sentinel 控制台
[
](https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0#2-%E5%90%AF%E5%8A%A8%E6%8E%A7%E5%88%B6%E5%8F%B0)
3.3.2 集成 Sentinel 控制台
在 pom.xml 文件中添加相关依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在 application.yaml 文件中新增相关配置。
spring:
application:
name: demo
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
sentinel:
transport:
dashboard: 127.0.0.1:8080 # Sentinel 控制台地址
port: 8719 # 另起一个端口和 Sentinel 控制台交互
server:
port: 8800
# http://localhost:8800/actuator/sentinel
management:
endpoints:
web:
exposure:
include: '*'
3.3.3 OpenFeign 集成 Sentinel
在 pom.xml 文件中添加相关依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在 application.yaml 开启 Feign 对 Sentinel 的支持。
spring:
application:
name: demo
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
sentinel:
transport:
dashboard: 127.0.0.1:8080 # Sentinel 控制台地址
port: 8719 # 另起一个端口和 Sentinel 控制台交互
server:
port: 8800
# http://localhost:8800/actuator/sentinel
management:
endpoints:
web:
exposure:
include: '*'
# 开启 Feign 对 Sentinel 的支持
feign:
sentinel:
enabled: true
在 Feign 的声明式接口添加 fallback 配置。
@FeignClient(value = "user", path = "/users", fallback = FallbackUserFeignService.class)
public interface UserFeignService {
@RequestMapping("/{userId}")
public Response findByUserId(@PathVariable("userId") Long userId);
}
@Component
public class FallbackUserFeignService implements UserFeignService {
@Override
public Response findByUserId(Long userId) {
return Response.buildFailure("B0220", "系统功能降级"); // 参考阿里巴巴错误码
}
}
或者使用 fallbackFactory 配置。
@FeignClient(value = "user", path = "/users", fallbackFactory = FallbackUserFeignServiceFactory.class)
public interface UserFeignService {
@RequestMapping("/{userId}")
public Response findByUserId(@PathVariable("userId") Long userId);
}
@Component
public class FallbackDemoFeignServiceFactory implements FallbackFactory<DemoFeignService> {
@Override
public UserFeignService create(Throwable throwable) {
return new UserFeignService() {
@Override
public Response findByUserId(Long userId) {
return Response.buildFailure("B0220", "系统功能降级"); // 参考阿里巴巴错误码
}
};
}
}
3.3.4 Dubbo 集成 Sentinel
在 pom.xml 文件中添加相关依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-apache-dubbo-adapter</artifactId>
</dependency>
Provider 端全局降级配置初始化。
@PostConstruct
public void init() {
DubboAdapterGlobalConfig.setProviderFallback(
(invoker, invocation, ex) ‐>
AsyncRpcResult.newDefaultAsyncResult(Response.buildFailure("B0220", "系统功能降级"), invocation));
}
Consumer 端全局降级配置初始化。
@PostConstruct
public void init() {
DubboAdapterGlobalConfig.setConsumerFallback(
(invoker, invocation, ex) ‐>
AsyncRpcResult.newDefaultAsyncResult(Response.buildFailure("B0220", "系统功能降级"), invocation));
}
3.3.5 RestTemplate 集成 Sentinel
在 pom.xml 文件中添加相关依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
在 application.yaml 开启 RestTemplate 对 Sentinel 的支持。
spring:
application:
name: demo
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
sentinel:
transport:
dashboard: 127.0.0.1:8080 # Sentinel 控制台地址
port: 8719 # 另起一个端口和 Sentinel 控制台交互
server:
port: 8800
# http://localhost:8800/actuator/sentinel
management:
endpoints:
web:
exposure:
include: '*'
# 开启 RestTemplate 对 Sentinel 的支持
resttemplate:
sentinel:
enabled: true
自定义装配 RestTemplate,添加 @SentinelRestTemplate 注解。
@Configuration
public class SentinelRestTemplateAutoConfiguration {
@Bean
@LoadBalanced
@SentinelRestTemplate(
blockHandler = "handleException", blockHandlerClass = GlobalExceptionHandler.class,
fallback = "fallback", fallbackClass = GlobalExceptionHandler.class
)
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
