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
复制代码

 

posted on 2022-10-31 23:00  一只阿木木  阅读(366)  评论(0编辑  收藏  举报