1. Nacos 全面解析与使用指南
一、什么是 Nacos
Nacos 是一个致力于帮助开发者更轻松构建云原生应用的动态服务发现、配置管理和服务管理平台。
1.1 Nacos 功能
1.1.1 配置中心
配置中心是集中化管理配置的关键服务,主要作用显著:集中管理配置信息、动态更新配置、配置信息共享、配置信息安全、信息追溯。
1.1.2 注册中心
注册中心是微服务架构的核心组件,主要作用如下:服务注册、服务发现、服务健康检查、服务路由、服务监控、服务更新。
1.2 Nacos 优点
- 简单易用、特性丰富、超高性能、高可用、超大容量。
二、Nacos 基本使用
2.1 Nacos 部署安装
2.1.1 部署方式
单机模式、集群模式、多集群模式
2.1.2 安装并启动
-
官网下载安装包
-
在mysql执行本地sql语句样例(nacos\conf\mysql-schema.sql)
-
修改配置,nacos后台数据存储到mysql(文件:nacos\conf\application.properties)
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysgl://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketT db.user=nacos devtest db.password=youdontknow
-
启动nacos
startup.cmd -m standalone
2.2 配置中心使用 ★
Spring Boot 项目使用配置中心,实现步骤如下:
- 添加配置中心依赖:在项目 pom.xml 文件中添加如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 设置 Nacos 服务端信息:在项目配置文件(application.properties)中添加如下信息:
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=
#spring.cloud.nacos.config.group=
spring.config.import=nacos:nacos-config-example
-
在nacos上填写配置信息:
-
读取配置文件:在 Controller 中使用 @Value 注解和 @RefreshScope 实现配置的读取和自动更新:
@RestController
@RefreshScope
public class TestController {
@Value("${myconfig}")
private String myconfig;
@RequestMapping("/getconfig")
public String getMyconfig() {
return myconfig;
}
}
2.3 注册中心使用 ★
注册中心有两个主要角色:
-
服务提供者(生产者):对外提供服务的微服务应用,将自身服务地址注册到注册中心,供消费者发现和调用。
-
服务消费者(消费者):调用其他微服务的应用程序,向注册中心订阅所需服务,并基于服务提供者注册信息发起远程调用。
2.3.1 生产者实现
生产者实现步骤如下:
- 添加 nacos-discovery 框架支持:在项目 pom.xml 文件中添加如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置 nacos 服务器端信息:在 application.yml 文件中添加如下配置:
spring:
application:
name: nacos-discovery-demo # Nacos 服务名(很重要,命名不用使用“_”)
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
ephemeral: false # 设置此服务为永久实例
# group: TEST_GROUP
server:
port: 0 # 动态端口
- 编写调用接口:在 Controller 中编写业务接口:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private ServletWebServerApplicationContext context;
@RequestMapping("/getnamebyid")
public String getNameById(Integer id) throws InterruptedException {
System.out.println("-------------------- Do Provider getNameById method."
+ LocalDateTime.now());
Thread.sleep(1500);
return "provider-name-" + id +
" | port:" + context.getWebServer().getPort();
}
}
2.3.2 消费者实现
-
创建消费者模块
-
配置
spring: application: name: nacos-consumer-demo cloud: nacos: discovery: server-addr: localhost:8848 username: nacos password: nacos register-enabled: false # 消费者(不需要将此服务注册到nacos) server: port: 8080
-
使用 FeignClient 调用示例:
首先添加 Feign 依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
然后定义 Feign 接口:
@FeignClient(name = "nacos-discovery-demo") public interface UserFeignClient { @RequestMapping("/user/getnamebyid") String getNameById(Integer id); }
最后在 Controller 中使用:
@RestController public class ConsumerFeignController { @Autowired private UserFeignClient userFeignClient; @RequestMapping("/consumer/getnamebyid") public String getNameById(Integer id) { return userFeignClient.getNameById(id); } }