Nacos注册中心和配置中心
Nacos 是 Alibaba 开发的用于微服务管理的平台,核心功能:服务注册与发现和集中配置管理。
- Nacos 作为服务注册发现组件,可以替换Spring Cloud 应用中传统的服务注册于发现组件,如:Eureka、Consul 等,支持服务的健康检查。SVN git(配置人员)
- Nacos 作为服务配置中心,可以替换 Spring Cloud Config、Apollo(阿波罗的分布式配置中心) 等。
为什么叫 Nacos?Naming 与 Configuration 的前两个字母的组合,最后的 s 代表 service 。从其命名也能看出其核心功能。
Nacos 的下载和安装
首先去 nacos 的 github 地址下载 release 安装包。下载地址
进入到 nacos/bin 目录下面,startup 命令用于启动 nacos ,shutdown 命令用于停掉 nacos 。
单模式启动一
-
windows 系统
执行 startup.cmd -m standalone 启动,单模式启动
-
linux/unix 系统
执行 startup.sh -m standalone 启动。
-
docker
编写docker-compose.yml文件 启动该文件 命令: docker-compose up
nacos: image: nacos/nacos-server:latest container_name: nacos-standalone-8848 environment: - PREFER_HOST_MODE=hostname - MODE=standalone #单机模式启动 volumes: - ./8848/logs/:/home/nacos/logs #前面是宿主机名 后面是容器目录名 - ./8848/init.d/custom.properties:/home/nacos/init.d/custom.properties ports: - "8848:8848"
单模式启动二
1、修改startup.cmd文件
2、启动
-
windows 系统
执行 startup.cmd启动,单模式启动
-
linux/unix 系统
执行 startup.sh 启动。
运行界面
nacos 的默认服务端口是 8848 ,启动完成之后通过浏览器访问 nacos:http://192.168.1.44:8848/nacos/index.html。
看到如下界面,需要登陆,默认的用户名密码都是 nacos ,登陆之后看到如下界面:
nacos 的单机 standalone 模式是开发环境中使用的启动方式,它对用户而言非常友好,几乎不需要的更多的操作就可以搭建 nacos 单节点。另外,standalone 模式安装默认是使用了 nacos 本身的嵌入式数据库 apache derby(Derby是一个Open source的产品,是一个小型的数据库) 。
注册中心
虽然 Eureka Server 会被我们用 Nacos 替换掉,但是我们仍会使用 Ribbon、OpenFeign 作为远程调用的基础组件。
微服务整合 nacos 服务发现:
- spring-cloud-starter-alibaba-nacos-discovery 是 spring-cloud-alibaba-dependencies 子项目。所以它们的版本号都不需要我们手动维护,继承自父项目 dependencyManagement 中的定义。
- 因为我们之前使用了 eureka ,所以用 nacos 的spring-cloud-starter-alibaba-nacos-discovery 将spring-cloud-starter-netflix-eureka-client 在 pom 文件中替换掉。
- spring-cloud-starter-alibaba-nacos-discovery 也默认包含了 spring-cloud-starter-netflix-ribbon ,不需要单独引入 ribbon 。我们之前学习的所有的 ribbion 和 openfeign 相关的负载均衡、远程服务调用的知识在 nacos 下依然适用。
父POM文件
- spring cloud alibaba version:2.2.5.RELEASE
- spring boot version :2.3.11.RELEASE
- spring cloud version:Hoxton.SR8
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>order</module>
<module>gateway</module>
</modules>
<groupId>com.woniu</groupId>
<artifactId>alibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>alibaba</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.11.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--Spring Cloud alibaba的版本管理, 通过dependency完成继承-->
<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>
<!--Spring Cloud的版本管理-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot的版本管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
模块POM
<dependency> <!-- 自动引入 Ribbon -->
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在 application.yml(或 bootstrap.yml)中加入必要的服务注册中心信息配置(替换掉 eureka 相关配置):
spring:
application:
name: spring-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
username: nacos
password: nacos
加上 @EnableDiscoveryClient 注解(去掉 @EnableEurekaClient 注解),开启 Spring Cloud 的服务注册与发现功能。spring cloud alibaba 遵守 spring cloud 规范,因此 @EnableDiscoveryClient 注解能激活、启用 nacos 的服务发现功能。
@SpringBootApplication
@EnableDiscoveryClient
public class SpringProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringProviderApplication.class, args);
}
}
访问 Nacos 服务,通过 服务管理
-> 服务列表
,看到我们注册的服务已经在列表中
zuul网关启动的时候,把springcloud-alibaba的版本升级到 2.2.5
服务注册中心相关概念和配置
微服务 group 分组
Nacos 的微服务分组概念,有两层含义:
- 不同分组的微服务,彼此之间不能发现对方,也就不能进行远程服务调用。逻辑上,不同的分组意味着这是两个不同的独立项目。即微服务从配置中拉取到的注册表是微服务所在组的注册表。
- 将微服务分组,方便我们查看,以及方便配置管理分类。
可以通过如下属性对微服务所属分组进行配置:
spring:
cloud:
nacos:
discovery:
group: public_group
由于多个项目可能、可以使用同一个 nacos 作为注册中心,这种情况下,group
就是区分你我的标识,每个微服务从 nacos 上拉取的只有本组的注册表。 如果微服务没有指定组,默认分组是 default_group
示例:
spring:
application:
name: spring-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
username: nacos
password: nacos
group: public_group
配置中心
Nacos 作为配置管理中心,实现的核心功能就是配置的统一管理。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
连接和使用配置中心
新建配置文件 bootstrap.yml ,新增 spring.cloud.nacos.config 节点配置,将服务指向正确的 nacos 服务端。
该配置文件中只保留 nacos 相关的配置即可,其他的配置放到 nacos 中统一管理。
注意,和 Spring Cloud Config 一样,连接配置中心的配置信息『必须』写在 bootstrap.yml 配置文件中,而不是 application 配置文件中。bootstrap 优先级高于apllication
server:
port: 8180
spring:
application:
name: spring-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
username: nacos
password: nacos
group: public_group
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yaml # nacos 配置文件后缀。注意是 yaml,不是 yml
group: public_group # 配置分组。未配置时,默认分组是 DEFAULT_GROUP
通过配置列表右侧的 +
按钮添加配置文件:
点击+之后
Data ID
是该配置文件在 Nacos 系统内的唯一标识。
在 Nacos Spring Cloud 中,dataId 的完整格式语法如下:
${prefix}-${spring.profile.active}.${file-extension}
-
prefix 的值默认与
spring.application.name
(即服务名)的值相同。也可以通过配置项 spring.cloud.nacos.config.prefix 来手动配置,指定一个与 spring.application.name 不一样的值,不过一般不会动它。 -
spring.profile.active 即为当前环境对应的 profile ,如:
xxx-service-dev.yml
中的dev
就是指开发环境。**注意:**当 spring.profile.active 为空时,对应的环境定义字符部分将不存在,即为 xxx-service.yml,而不是 xxx-service-.yml 。
-
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。
注意,我们使用的『是 yaml 类型,不是 yml』。虽然二者是一个意思,但是『nacos 只认 yaml』。
Group
的值同 spring.cloud.nacos.config.group 的配置,界面填写的内容与项目中的配置二者『一定要统一』,否则无法正确读取配置,Group 起到配置『隔离』的作用。
入门案例
核心pom
<!--nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
创建application.yml
servername: provider
创建bootstrap.yml
server:
port: 8180
spring:
application:
name: spring-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
username: nacos
password: nacos
group: public_group
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yaml # nacos 配置文件后缀。注意是 yaml,不是 yml
group: public_group # 配置分组。未配置时,默认分组是 DEFAULT_GROUP
controller类
@RestController
@RefreshScope
public class ProviderController {
@Value("${server.port}")
private String port;
@Value("${servername}")
private String servername;
@RequestMapping(value = "/provider/{id}")
public String provider(@PathVariable String id){
if(id.equals("1")){
throw new RuntimeException("异常");
}
return "provider id = " + id + "port = " + port + " servername = " + servername;
}
}
验证和动态刷新
执行以下代码进行验证:
如果想要实现动态刷新功能,那么在 @Value 所在的 @Component(@Controller、@Service、@Repository)上加上 @RefreshScope 即可实现动态刷新。
Nacos 的数据存储
Nacos 的数据是存储在它自带的内嵌 derby 数据库中的,数据文件就在 Nacos 的解压目录下的 data
文件夹中。
你也可以通过修改配置,让 Nacos 将它的数据存储在你指定的 mysql 数据库中。
Nacos 在它的 conf
目录下已经为你准备好了建表脚本:nacos-mysql.sql
。不过脚本中没有建库语句,为了后续配置简单起见,建议创建的库命名为 nacos 。
创建一个nacos数据库,然后在nacos的bin目录下找到nacos-mysql.sql文件,把该文件的建表语句拷贝mysql客户端下执行,注意要使用你刚才创建的nacos数据库下
create database nacos
DEFAULT CHARACTER SET utf8mb4 -- 乱码问题
DEFAULT COLLATE utf8mb4_bin -- 英文大小写不敏感问题
;
在 conf 文件夹下的 application.properties
配置文件。从 31 行开始的一段配置就是数据库连接相关配置。把如下行数前面的注释去掉
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
修改完 application.properties
配置文件之后,重启 Nacos,你会发现 Nacos 重新编程了一个『干净』的环境。
测试:登陆localhost:8848/nacos,在配置中心上新建一个配置,如:spring-provider.yaml,发现这个配置保存到了我们自己创建的nacos数据库里面
nacos集群配置
拷贝cluster.conf.example文件,并改名为cluster.conf
192.168.31.203:8848
192.168.31.203:8849
192.168.31.203:8850
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
192.168.174.1:8848
直接双击启动启动脚本
微服务配置:
server-addr: 192.168.31.203:8848,192.168.31.203:8849,192.168.31.203:8850
spring:
application:
name: spring-provider
cloud:
nacos:
discovery:
server-addr: 192.168.31.203:8848,192.168.31.203:8849,192.168.31.203:8850
namespace: public
username: nacos
password: nacos
group: public_group
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yaml # nacos 配置文件后缀。注意是 yaml,不是 yml
group: public_group # 配置分组。未配置时,默认分组是 DEFAULT_GROUP