原创

SpringCloud第一篇:Nacos

温馨提示:
本文最后更新于 2024年07月12日,已超过 281 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

Spring Cloud Alibaba 是阿里巴巴开源的一套微服务解决方案,它为分布式系统开发提供了一套全面的组件和解决方案,旨在与 Spring Cloud 生态完美融合,为开发者提供一站式微服务开发体验。Spring Cloud Alibaba 主要关注于服务发现、配置管理、限流降级、分布式事务、消息队列等多个方面,旨在帮助企业级用户构建稳定、高性能的分布式系统。下面是一些核心组件和功能的简要解析:

  1. 服务发现与配置管理 - Nacos:Nacos 提供了服务发现与配置管理两大核心功能。作为服务注册中心,它负责管理微服务实例的生命周期,实现服务的动态发现与健康检查。同时,Nacos 也是强大的配置中心,支持配置的统一管理和推送,使得配置修改后可以实时推送到各个服务实例,无需重启服务。
  2. 分布式配置中心 - Config Server & Config Client:虽然 Nacos 已经具备配置管理功能,Spring Cloud Alibaba 也支持 Spring Cloud Config,用于集中管理应用的配置信息。Config Server 用于存储配置,Config Client 能够与 Config Server 交互,获取并刷新配置。
  3. 流量控制与熔断降级 - Sentinel:Sentinel 是面向分布式服务架构的流量控制组件,提供了流量控制、熔断降级、系统自适应保护等能力。它能够帮助服务平稳应对流量高峰,防止雪崩效应,保证服务的稳定性。
  4. API 网关 - Gateway:Spring Cloud Gateway 是Spring Cloud提供的官方网关,它支持路由、过滤器等多种功能,可以实现请求的路由转发、协议转换、权限控制等,是微服务架构中的重要组件。
  5. 分布式任务调度 - Seata:Seata 是一款高性能、易于使用的分布式事务解决方案,它提供了一种声明式的分布式事务处理方式,支持 Saga、AT 等事务模式,帮助解决微服务架构中的事务一致性问题。
  6. 消息驱动 - RocketMQ / Spring Cloud Stream:RocketMQ 是阿里巴巴开源的分布式消息中间件,支持高吞吐量、低延迟的消息传输。Spring Cloud Stream 提供了一种统一的消息抽象层,使得开发者可以方便地与消息中间件集成,如 RocketMQ、Kafka 等。
  7. 服务链路追踪 - Sleuth + Zipkin / SkyWalking:虽然这不是直接属于Spring Cloud Alibaba的一部分,但在微服务架构中,链路追踪是非常重要的。Spring Cloud Sleuth 结合 Zipkin 或者 Apache SkyWalking 可以帮助开发者收集和分析微服务间的调用链路,便于故障排查和性能优化。

Spring Cloud Alibaba 的设计哲学是“开箱即用”,通过简单的配置就能快速接入上述组件,降低微服务架构的复杂度,提升开发效率。同时,它也支持与 Spring Cloud 生态的其他组件无缝集成,如Spring Cloud OpenFeign 用于声明式HTTP客户端,Spring Cloud LoadBalancer 用于服务间的负载均衡等。需要注意SpringBoot和SpringCloud版本兼容

下面开始Nacos的安装及使用,由于Nacos基于JDK,还有我们微服务中使用的是springBoot3.2,所以先说下JDK17的安装。

1.JDK17

使用wget命令下载jdk17

sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz

解压jdk17压缩包

sudo tar -zxvf jdk-17_linux-x64_bin.tar.gz

创建一个从 /usr/sbin/java 到 /opt/jdk-17.0.11/bin/java 的符号链接

sudo ln -sv /opt/jdk-17.0.11/bin/java /usr/sbin/java

验证是否成功安装了jdk17

java -version

2.Nacos

Nacos是SpringCloud Alibaba的核心组件之一,可以用来作为注册中心和配置中心。核心功能有

  • 服务发现和服务健康检测
  • 动态配置服务
  • 负载均衡

2.1安装

2.1.1Ubuntu

使用命令下载Nacos2.3.0版本

sudo wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.gz

将Nacos压缩包解压

sudo tar -zxvf nacos-server-2.3.0.tar.gz

Nacos默认端口是8848,若要修改端口可以修改conf/application.properties文件的server.port的值

cd到bin目录,启动nacos

# 单机模式
sh startup.sh -m standalone

# 集群模式
sh startup.sh -m cluster

报错如下

readlink: 缺少操作对象
请尝试执行 "readlink --help" 来获取更多信息。
dirname: 缺少操作对象
请尝试执行 "dirname --help" 来获取更多信息。
ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! !!

startup.sh启动脚本中JAVA_HOME路径不对,增加一行配置JAVA_HOME路径即可

然后又报错,这是因为Ubuntu执行sh默认使用dash,而nacos被设计为使用bash。所以运行该脚本出现“[[”找不到,因为这个在dash中不存在。

startup.sh: 87: [[: not found
startup.sh: 91: [[: not found
startup.sh: 100: [[: not found
startup.sh: 102: [[: not found
startup.sh: 109: [[: not found

将sh替换为bash -f即可成功启动nacos

sudo bash -f startup.sh -m standalone

访问Nacos控制台,在浏览器输入http://your_server_ip:8848/nacos,可以看到Nacos登录界面,默认用户名和密码为nacos/nacos

2.1.2Windows

Windows安装Nacos,下载路径https://github.com/alibaba/nacos/releases,我们下载的是2.3.0版本。解压后,进入bin目录,执行以下命令,提示Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!。出现该提示是因为JDK版本低于jdk8或者没有配置JAVA_HOME环境变量。

startup.cmd -m standalone

修改的startup.cmd文件内容,将%JAVA_HOME%修改为jdk17的绝对路径。

然后再执行上述命令,即可成功启动nacos。

nacos默认使用8848端口启动服务,也可以自己修改其他端口,修改nacos目录下conf/application.properties文件,将server.port的值修改为其他端口。

2.2注册中心

Nacos允许服务实例项Nacos Server注册,便于其他服务发现和调用。通过心跳检测或主动探测来判断服务实例是否可用,确保服务调用不会路由到不健康的服务实例上。还可以配置权重等方式来进行客户端负载均衡。

添加依赖

<!-- nacos 服务注册 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

添加nacos配置

spring:
  application:
    # 服务名称
    name: meeting-service
  cloud:
    nacos:
      # Nacos服务地址
      server-addr: 127.0.0.1:8848

在控制台服务列表中出现了该服务


在IDEA将会议室服务多个端口启动

点击Override configuration properties

添加一个server.port配置

在idea中开启services,点击+,Run Configuration Type,SpringBoot可以将相关服务加入Services统一管理

Ribbon在SpringCloud中已经停止维护了,SpringCloud推荐使用 Spring Cloud LoadBalancer来实现负载均衡。在Nacos2.0及之后的版本不在内置Ribbon,需要添加loadbalancer依赖。

<!--客户端负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

会议服务调用会议室服务的接口,会议室服务添加一个接口

@RestController
public class TestController {
    @RequestMapping("/sayHello/{name}")
    public String sayHello(@PathVariable(value = "name") String name){
        return "Hello, " + name;
    }
}

会议服务RestTemplate对象注册并添加@LoadBalanced注解

@LoadBalanced
@Bean
public RestTemplate restTemplate(){
    // 用于进行 HTTP 请求的对象
    return new RestTemplate();
}

会议服务的接口中调用会议室服务的接口

@RestController
public class TestController {
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/hello")
    public String hello(String name){
        // 调用会议室服务的 sayHello 方法,并返回结果
        return restTemplate.getForObject("http://room-service/sayHello/" + name,
                String.class);
    }
}

调用六次会议服务hello接口,可以发现三个会议室服务每个都响应了两次,默认是使用轮询的方式调用。在nacos中配置权重看看,配置8080和8081端口的会议室服务权重为0.1,配置8082端口的会议室服务权重为1。

在配置中开启Nacos负载均衡

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

再次进行接口调用,这一次调用了30次。测试发现8082端口会议室服务响应了28次,而其他两个服务都只响应了一次,可见确实是按照分配的权重进行调用。

还可以将服务下线,服务调用的时候就会绕过下线服务实例,需要的时候可以再次上线。

2.2配置中心

配置中心的作用是将本地配置云端化,保障敏感数据不会暴露。而且可以对配置进行实时查看、修改、回滚及动态刷新。在Nacos控制台添加配置,其中Data ID的完整格式是${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension},即项目名称-不同环境的profile名称.配置文件的数据格式。Group分组选项,用来隔离不同的配置项目的,默认值为 DEFAULT_GROUP,可以通过spring.cloud.nacos.config.group 配置

添加配置中心依赖

<!--nacos 配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

添加配置,注意在SpringCloud2020之后,出于对云原生多配置文件的支持,关闭了对bootstrap.yml的使用。最新版是通过spring.config.import去引入配置。

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.1.7:8848
        file-extension: yaml
  # 导入配置
  config:
    import:
      - nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

使用@Value注解来获取配置,在@Value注解对应的类上加上@RefreshScope注解,可以实现配置自动更新。

@RefreshScope
@RestController
public class TestController {
    @Value("${zhuo.test}")
    private String test;
}
正文到此结束