写在最前
项目 GitHub 地址 mingyue-springcloud-learning 【mingyue-springcloud-user、mingyue-springcloud-member】
阅读推荐
- Spring Cloud 入门必读
- Spring Cloud Alibaba 入门必读
版本声明
spring-boot: 2.7.5
spring-cloud: 2021.0.5
spring-cloud-alibaba: 2021.0.4.0
nacos: 2.1.2
Nacos 简介
Nacos 是一个 Alibaba 开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
-
Spring Cloud Alibaba Nacos Discovery,可基于 Spring Cloud 的编程模型快速接入 Nacos 服务注册功能。
-
Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。
Nacos 下载
Nacos 的获取和启动方式可以参考 Nacos 官网。
本文使用 Nacos 2.1.1
版本选择
1.通过 pom.xml 文件依赖项,spring cloud alibaba 坐标 artifactId,进入 spring cloud alibaba 的 pom.xml 文件
<!-- spring cloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.查看 nacos.client.version
,最低推荐 2.0.4 版本。截至目前推荐的稳定版本为 2.1.1
<properties>
<maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
<sentinel.version>1.8.5</sentinel.version>
<maven-gpg-plugin.version>3.0.1</maven-gpg-plugin.version>
<maven-source-plugin.version>3.2.1</maven-source-plugin.version>
<flatten-maven-plugin.version>1.2.7</flatten-maven-plugin.version>
<revision>2021.0.4.0</revision>
<nacos.client.version>2.0.4</nacos.client.version>
<seata.version>1.5.2</seata.version>
<spring.context.support.version>1.0.11</spring.context.support.version>
</properties>
Window 安装启动
解压 nacos-server-2.1.1.zip,进入
nacos-server-2.1.1\nacos\bin
目录
# bin 目录打开 cmd 直接双击打开是集群模式
startup.cmd -m standalone
启动成功后访问:http://127.0.0.1:8848/nacos/#/login
用户名 | 密码 |
---|---|
nacos | nacos |
Docker 安装
推荐使用 Docker 安装
- Docker
- Docker-Compose
- 官方推荐的 Docker 安装方式:Nacos Docker 快速开始
本项目提供了
docker-compose
基础环境安装进入
docker
目录,执行docker-compose up -d
,启动成功后访问:http://127.0.0.1:8848/nacos/#/login
docker
└── mysql
└── db
└── nacos-mysql.sql
└── dockerfile
└── nacos
└── conf
└── application.properties
└── dockerfile
└── docker-compose.yml
服务注册/发现: Nacos Discovery
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息-例如 host,port, 健康检查URL,主页等内容注册到 Nacos。
添加 pom 文件依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
bootstrap.yml 添加配置
spring:
cloud:
nacos:
discovery:
server-addr: ip:port
开启服务注册发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class MingYueUserApplication {
public static void main(String[] args) {
SpringApplication.run(MingYueUserApplication.class, args);
}
}
启动服务
这个时候你就可以在 Nacos 的控制台上看到注册上来的服务信息了。
调用 Nacos 注册的服务
Nacos Discovery 适配了 Netflix Ribbon,可以使用 RestTemplate 或 OpenFeign 进行服务的调用。
Consumer 应用可能还没像启动一个 Provider 应用那么简单。因为在 Consumer 端需要去调用 Provider 端提供的 REST 服务。例子中我们使用最原始的一种方式,即显示的使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问。
编写 Consumer
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* 用户接口
*
* @author Strive
*/
@RestController
@RequestMapping("/memberNacos")
@RequiredArgsConstructor
public class MemberNacosController {
private final LoadBalancerClient loadBalancerClient;
@GetMapping("/userInfo")
public String getUserNacos() {
// 使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
ServiceInstance serviceInstance = loadBalancerClient.choose("mingyue-springcloud-user");
String url = String.format("http://%s:%s/userNacos/info", serviceInstance.getHost(), serviceInstance.getPort());
System.out.println("request url:" + url);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(url, String.class);
}
}
引入 loadbalancer
<!-- SpringCloud Loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
启动服务,测试接口
curl --location --request GET 'http://127.0.0.1:8100/memberNacos/userInfo' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8100' \
--header 'Connection: keep-alive'
返回数据:
{
"userNick": "none",
"username": "none"
}
配置管理: Nacos Config
Nacos 是一个 Alibaba 开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。
添加 pom 文件依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap.yml 添加配置
在运行此 NacosConfigApplication 之前, 必须使用 bootstrap.yml 配置文件来配置 Nacos Server 地址。
spring:
profiles:
active: @profiles.active@
application:
name: @artifactId@
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yaml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
Naocs 添加配置
DataId 默认使用
spring.application.name
配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为mingyue-springcloud-user-mingyue.yaml
, GROUP 为 DEFAULT_GROUP。如果需要切换环境,只需要更改
${spring.profiles.active}
参数配置即可!此案例中我们通过
spring.profiles.active=<profilename>
的方式写死在配置文件中,而在真正的项目实施过程中这个变量的值是需要不同环境而有不同的值。这个时候通常的做法是通过-Dspring.profiles.active=<profile>
参数指定其配置来达到环境间灵活的切换。
录入以下配置,点击
发布
生效。
server:
port: 8200
user:
username: Strive
userNick: 小小程
添加测试接口
/**
* 用户接口
*
* @author Strive
*/
@RefreshScope
@RestController
@RequestMapping("/userNacos")
public class UserNacosController {
@Value("${user.username:none}")
private String username;
@Value("${user.userNick:none}")
private String userNick;
@GetMapping("/info")
public Map<String, String> info() {
HashMap<String, String> userInfo = MapUtil.newHashMap();
userInfo.put("username", username);
userInfo.put("userNick", userNick);
return userInfo;
}
}
启动项目,访问接口
curl --location --request GET 'http://127.0.0.1:8200/userNacos/info' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8200' \
--header 'Connection: keep-alive'
返回数据
{"userNick":"小小程","username":"Strive"}
动态配置
Nacos Config 默认支持配置的动态更新,可以通过配置 spring.cloud.nacos.config.refresh.enabled=false
来关闭动态刷新
编辑完,点击
发布
生效,再次访问接口查看是否生效!
user:
username: MingYue
userNick: 小小猪
后台会有日志打印:
...
o.s.boot.SpringApplication : The following 1 profile is active: "mingyue"
o.s.boot.SpringApplication : Started application in 0.297 seconds (JVM running for 160.784)
o.s.c.e.event.RefreshEventListener : Refresh keys changed: [user.userNick, user.username]
Tips
Nacos 主要的功能介绍完了,当然 Nacos 功能远不止这些,授人以鱼不如授人以渔
:
- 中文文档 第三章 Nacos
- [官方文档 第三章 Nacos](Spring Cloud Alibaba Reference Documentation (spring-cloud-alibaba-group.github.io))
3. Spring Cloud Alibaba Nacos Discovery
3.1. 服务注册/发现: Nacos Discovery
3.2. 如何引入 Nacos Discovery 进行服务注册/发现
3.3. 一个使用 Nacos Discovery 进行服务注册/发现并调用的例子
3.3.1. Nacos Server 启动
3.3.2. Provider 应用
3.3.3. Consumer 应用
3.4. Nacos Discovery 对外暴露的 Endpoint
3.5. 如何开启权重路由
3.5.1. Ribbon
3.6. 关于 Nacos Discovery Starter 更多的配置项信息
4. Spring Cloud Alibaba Nacos Config
4.1. 如何引入 Nacos Config 进行配置管理
4.2. 快速开始
4.2.1. Nacos 服务端初始化
4.2.2. 客户端使用方式
4.3. 基于 DataId 为 yaml 的文件扩展名配置方式
4.4. 支持配置的动态更新
4.5. 支持profile粒度的配置
4.6. 支持自定义 namespace 的配置
4.7. 支持自定义 Group 的配置
4.8. 支持自定义扩展的 Data Id 配置
4.9. 配置的优先级
4.10. Nacos Config 对外暴露的 Endpoint
4.11. 完全关闭 Nacos Config 的自动化配置
4.12. 关于 Nacos Config Starter 更多的配置项信息