SpringCloudAlibaba 主要组件与nacos 填坑记录
SpringCloudAlibaba 主要功能 与 实现组件
(1)SpringCloudAlibaba 主要功能 与 实现组件
【功能与实现组件:】
服务限流降级:
基本说明:
默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,
可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
实现组件:
Sentinel: 把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
服务注册与发现:
基本说明:
适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
实现组件:
Nacos: 一个更易于构建云原生应用的动态服务发现和服务管理平台。
分布式配置管理:
基本说明:
支持分布式系统中的外部化配置,配置更改时自动刷新。
实现组件:
Nacos: 一个更易于构建云原生应用的配置管理平台。
消息驱动能力:
基本说明:
基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
实现组件:
RocketMQ: 一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
分布式事务:
基本说明:
使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
实现组件:
Seata: 阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
阿里云对象存储:
基本说明:
阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
实现组件:
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:
基本说明:
提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
实现组件:
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
阿里云短信服务:
基本说明:
覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
实现组件:
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
(2)开发中常使用的技术搭配
【开发中使用的技术:】
在平时开发中使用的技术搭配,我一般采用一下方案:
SpringCloud:
OpenFeign: 声明式 HTTP 客户端(即 远程服务调用)。
Ribbon: 负载均衡(OpenFeign 中已集成,无需单独引入)。
Gateway: API 网关。
Sleuth: 分布式链路追踪(即 请求调用链监控)。
SpringCloudAlibaba:
Nacos: 注册中心 以及 配置中心(即 服务注册、发现 以及 动态配置管理)。
Sentinel: 服务容错(即限流、降级、熔断)。
Seata: 解决分布式事务。
注:
通过前面几篇博客的学习,知道了 OpenFeign、Ribbon、Sleuth、Sentinel 相关操作。
OpenFeign、Ribbon 相关操作详见:https://www.cnblogs.com/l-y-h/p/14238203.html
Sleuth 相关操作详见:https://www.cnblogs.com/l-y-h/p/14447473.html#_label4
Sentinel 相关操作详见:https://www.cnblogs.com/l-y-h/p/14364167.html#_label2
情景再现:
在阿里云服务器上,想使用 docker-compose 一次性启动三个 Nacos Server 以及 mysql,结果一直启动失败。
坑一:
nacos-mysql:8.0.16 无法启动,更换成 nacos-mysql:5.7 之后正常启动。
但若 nacos-mysql:8.0.16 是事先就启动好的(即不跟随 Nacos Server 启动),那么连接是正常的。
为什么会出现这种情况,没有仔细研究,此处仅简单记录一下可能存在的问题。
坑二:
访问 http://120.26.184.41:8850/nacos,可以成功登录进去。
但点击 “集群管理” =》 “节点列表”,依次点击 “节点元数据”,可以发现其 "state" 均为 "CANDIDATE"。
即 集群中三个节点 并未选举成功,未成功选举出 LEADER、FOLLOWER。
坑三:
集群节点 "state" 均为 "FOLLOWER",没有 "LEADER"。选举仍然失败。
出现了 8848 端口,貌似其被选择为 LEADER。
坑四:
当前觉得你的配置没有问题了,但是 选举依然失败,这边建议你更换一下镜像看看。
此处 nacos/nacos-server:1.4.1 选举总是失败,更换 nacos/nacos-server:1.3.0 之后没问题了。
具体原因没有深入研究,此处仅记录一下可能存在的问题。
S1:
将 nacos-mysql:8.0.16 镜像替换为 nacos-mysql:5.7 后,重新启动即可。
S2:填坑记录二:
若在控制台页面中,看见节点 “state” 均为 “CANDIDATE”。这是选举出问题了,可以查看 nacos 日志(naming-raft.log、nacos.log)。
【nacos.log 错误日志为:(如下两句语句循环出现)】 java.lang.IllegalStateException: can not find peer: 172.22.0.3:8848 java.lang.IllegalStateException: can not find peer: 172.22.0.5:8848 【naming-raft.log 错误日志为:】 ERROR NACOS-RAFT vote failed: 500, url: http://120.26.184.41:8850/nacos/v1/ns/raft/vote ERROR NACOS-RAFT vote failed: 500, url: http://120.26.184.41:8851/nacos/v1/ns/raft/vote WARN [IS LEADER] no leader is available now! 【分析:】 通过 nacos.log 的 ip 地址,可以猜测当前 nacos 读取到的是内网 IP。 而集群列表中不存在这个 IP,所以无法连接到其余 节点(无法通信),进而选举失败。 【解决:】 既然获取不到 IP 地址,那就手动输入 IP 地址。 在环境变量中,通过 NACOS_SERVER_IP 指定当前主机的 IP 即可。 比如: - NACOS_SERVER_IP=120.26.184.41
S3:填坑记录三
通过上面截图,可以看到三个节点状态均从 "CANDIDATE" 变为了 "FOLLOWER",为什么没有选举出 "LEADER"?
【查看 naming-raft.log 日志如下:】 2021-03-25 17:45:09,770 INFO received approve from peer: {"ip":"120.26.184.41:8848","voteFor":"120.26.184.41:8848","term":9,"leaderDueMs":18440,"heartbeatDueMs":2000,"state":"FOLLOWER"} 2021-03-25 17:45:09,772 INFO received approve from peer: {"ip":"120.26.184.41:8848","voteFor":"120.26.184.41:8848","term":9,"leaderDueMs":18531,"heartbeatDueMs":5000,"state":"CANDIDATE"} 2021-03-25 17:45:09,788 INFO received approve from peer: {"ip":"120.26.184.41:8848","voteFor":"120.26.184.41:8848","term":9,"leaderDueMs":18671,"heartbeatDueMs":5000,"state":"FOLLOWER"} 2021-03-25 17:45:15,001 WARN [IS LEADER] no leader is available now! 2021-03-25 17:45:28,123 INFO vote 120.26.184.41:8848 as leader, term: 10 【分析:】 通过日志可以看到貌似 120.26.184.41:8848 这个东西被选为了 LEADER, 而实际上 我开放的是 8849、8850、8851 三个端口,但是这三个端口并没有被访问。 【解决:】 默认端口号为 8848。既然获取不到端口,那就手动设置端口。 在环境变量中,通过 NACOS_APPLICATION_PORT 指定当前主机需要访问的端口即可。 修改 NACOS_APPLICATION_PORT 后,端口映射 ports 也需要修改。 比如: environment: - NACOS_APPLICATION_PORT=8851 ports: - 8851:8851
(4)连接 Nacos 集群
在 Nacos Client 配置文件中,直接通过 server-addr 设置节点地址即可,多个节点之间可使用 逗号 隔开。
若使用 Nginx 做代理,则 server-addr 设置 Nginx 访问地址即可。
Nginx 在 Nacos 真集群版中使用(请继续往下看)。
【比如:】 spring: cloud: nacos: discovery: server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 config: server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 【bootstrap.yml】 server: port: 7100 spring: application: name: nacos-client-config cloud: nacos: discovery: # 配置 nacos server 地址(作为注册中心) # server-addr: 120.26.184.41:8848 server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 config: # 配置 nacos server 地址(作为配置中心) # server-addr: 120.26.184.41:8848 server-addr: 120.26.184.41:8849,120.26.184.41:8850,120.26.184.41:8851 # 设置配置文件前缀,默认为 ${spring.application.name} prefix: ${spring.application.name} # 设置配置文件后缀名 file-extension: yml shared-configs[0]: data-id: test-0-dev.yml shared-configs[1]: data-id: test-1-dev.yml shared-configs[2]: data-id: test-2-dev.yml group: DEFAULT_GROUP refresh: true