Nacos 是 Alibaba 开发的用于微服务管理的平台,核心功能:服务注册与发现和集中配置管理。
为什么叫 Nacos?Naming 与 Configuration 的前两个字母的组合,最后的 s 代表 service 。从其命名也能看出其核心功能。
首先去 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 服务发现:
<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.0modelVersion>
<modules>
<module>ordermodule>
<module>gatewaymodule>
modules>
<groupId>com.woniugroupId>
<artifactId>alibabaartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>alibabaname>
<description>Demo project for Spring Bootdescription>
<packaging>pompackaging>
<properties>
<java.version>1.8java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASEspring.cloud.alibaba.version>
<spring.boot.version>2.3.11.RELEASEspring.boot.version>
<spring.cloud.version>Hoxton.SR8spring.cloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring.cloud.alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>${spring.boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
plugins>
build>
project>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
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
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.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
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
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
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 的数据是存储在它自带的内嵌 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数据库里面
拷贝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