SpringCloud第一篇:Nacos
Spring Cloud Alibaba 是阿里巴巴开源的一套微服务解决方案,它为分布式系统开发提供了一套全面的组件和解决方案,旨在与 Spring Cloud 生态完美融合,为开发者提供一站式微服务开发体验。Spring Cloud Alibaba 主要关注于服务发现、配置管理、限流降级、分布式事务、消息队列等多个方面,旨在帮助企业级用户构建稳定、高性能的分布式系统。下面是一些核心组件和功能的简要解析:
- 服务发现与配置管理 - Nacos:Nacos 提供了服务发现与配置管理两大核心功能。作为服务注册中心,它负责管理微服务实例的生命周期,实现服务的动态发现与健康检查。同时,Nacos 也是强大的配置中心,支持配置的统一管理和推送,使得配置修改后可以实时推送到各个服务实例,无需重启服务。
- 分布式配置中心 - Config Server & Config Client:虽然 Nacos 已经具备配置管理功能,Spring Cloud Alibaba 也支持 Spring Cloud Config,用于集中管理应用的配置信息。Config Server 用于存储配置,Config Client 能够与 Config Server 交互,获取并刷新配置。
- 流量控制与熔断降级 - Sentinel:Sentinel 是面向分布式服务架构的流量控制组件,提供了流量控制、熔断降级、系统自适应保护等能力。它能够帮助服务平稳应对流量高峰,防止雪崩效应,保证服务的稳定性。
- API 网关 - Gateway:Spring Cloud Gateway 是Spring Cloud提供的官方网关,它支持路由、过滤器等多种功能,可以实现请求的路由转发、协议转换、权限控制等,是微服务架构中的重要组件。
- 分布式任务调度 - Seata:Seata 是一款高性能、易于使用的分布式事务解决方案,它提供了一种声明式的分布式事务处理方式,支持 Saga、AT 等事务模式,帮助解决微服务架构中的事务一致性问题。
- 消息驱动 - RocketMQ / Spring Cloud Stream:RocketMQ 是阿里巴巴开源的分布式消息中间件,支持高吞吐量、低延迟的消息传输。Spring Cloud Stream 提供了一种统一的消息抽象层,使得开发者可以方便地与消息中间件集成,如 RocketMQ、Kafka 等。
- 服务链路追踪 - 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;
}
- 本文标签: Spring Cloud Alibaba
- 本文链接: https://lanzi.cyou/article/6
- 版权声明: 本文由咖啡豆原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权