目录
一、Nacos介绍
Nacos是阿里巴巴开源的一个针对微服务架构的综合解决方案,它提供了服务发现、配置管理、服务治理等功能。
在微服务架构中,当系统被拆分成分布式服务节点后,配置文件也随之分散,这时就需要一个中心化的配置管理中心对配置进行统一管理。Nacos就扮演了这个角色,它支持几乎所有主流类型的“服务”的发现、配置和管理,包括Kubernetes Service、gRPC & Dubbo RPC Service、Spring Cloud RESTful Service等。
Nacos也提供了简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。它提供了对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos支持传输层(PING 或 TCP)和应用层(如 HTTP、MySQL、用户自定义)的健康检查。
其是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。它可以帮助您更敏捷和容易地构建、交付和管理微服务平台。总之,Nacos是一个功能强大的微服务架构解决方案,它可以提高分布式系统的可靠性、可扩展性和易用性。
详细介绍查看:什么是 Nacos
二、Nacos安装
Nacos下载
github搜索nacos,在alibaba/nacos项目的README.md下,点击下载最新版跳转页,下载nacos的压缩包。
Nacos启动
进入nacos文件夹的bin目录下,windows选择startup.cmd启动,linux选择startup.sh启动。
而启动脚本默认设置的是集群模式:set MODE = "cluster",若单机启动则改成set MODE="standalone",或者在执行cmd脚本时加上-m standalone即可。
- startup.cmd
- startup.sh
这边演示windows启动,启动成功后如下图:
访问Nacos
直接访问http://localhost:8848/nacos/,默认用户名和密码为nacos/nacos
三、Nacos使用
pom添加依赖
引入版本依赖之前,建议大家先去官网查看对应的SpringBoot版本、SpringCloud版本所支持的nacos最低版本,以防因为版本不对而导致的不必要问题排查。参考:Nacos Spring Cloud 快速开始
本文只介绍SpringCloud项目如何集成Nacos(请忽略图中与Service无关的子工程),Nacos服务端版本为nacos-server-2.1.0.zip,采用的项目架构如下:
cloud-demo父模块依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/>
</parent>
<modules>
<module>userService</module>
<module>orderService</module>
</modules>
<properties>
<spring-boot.version>2.4.4</spring-boot.version>
<spring-cloud.version>2020.0.2</spring-cloud.version>
</properties>
<!-- 模块继承:依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springboot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子模块userService依赖(子模块已经继承父模块依赖,所以版本号无需再填。):
<!-- 依赖修改为父工程-->
<parent>
<artifactId>cloud-demo</artifactId>
<groupId>com.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<!--nacos配置中心-->
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<!--nacos服务注册中心-->
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
yaml配置文件
在Nacos 2.0.0及更高版本中,配置项应该放在bootstrap.yaml(properties)文件中。
因为springboot启动时,加载bootstrap优先级会非常高,在创建并配置当前springboot的Environment时就会读取到所配置的bootstrap,后续会将此environment传给nacos调用nacos Server,自始至终nacos都不会读取到本地的application配置。
userService配置文件bootstrap.yaml如下:
server:
port: 8001
spring:
application:
#对应pom中的配置的name
name: userService
profiles:
active: dev # 指定环境
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
password: nacos
username: nacos
# 指定namespace的id,默认为public
namespace: 75c348bd-4244-4dad-a5b5-357f8f83da26
# 指定组名,默认为DEFAULT_GROUP
group: DEFAULT_GROUP
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 指定namespace的id,默认为public
namespace: 75c348bd-4244-4dad-a5b5-357f8f83da26
# 指定组名
group: DEFAULT_GROUP
# 共享配置
shared-configs:
- application-${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
解决SpringCloud项目无法读取bootstrap.yaml配置文件,子模块添加依赖
<dependency>
<!--解决SpringCloud项目无法读取bootstrap.yaml配置文件-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
Nacos配置管理
- 创建cloud-demo命名空间
- 新建配置
选择不同的配置格式,则配置内容则需按配置的格式去填入即可。
启动测试
启动子工程userService后,去打开服务列表发现userService服务已注册。
再测试Nacos配置中心是否生效,UserController增加获取配置信息的接口来测试。
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("user")
public class UserController {
@Value("${user.name}")
private String userName;
/**
* 获取配置信息
* @return RetResponse
*/
@GetMapping("/getConfig")
@ResponseBody
public String getConfig() {
return JSON.toJSONString(userName);
}
}
使用apifox工具来调用http://localhost:8001/user/getConfig接口后发现配置中心已生效。
Nacos动态刷新
实现Nacos属性值自动刷新,可以简化我们一旦改动Nacos配置后再重启服务的繁琐操作。
修改配置文件
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 指定namespace的id,默认为public
namespace: 75c348bd-4244-4dad-a5b5-357f8f83da26
# 指定组名,默认为DEFAULT_GROUP
group: DEFAULT_GROUP
# 共享配置
# shared-configs:
# - application-${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
shared-configs[0]:
data-id: application-${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 开启自动刷新
refresh: true
controller层增加@RefreshScope注解
以上配置完以后,改动Nacos配置文件无需重启服务,就可读取最新的配置内容。