Spring Cloud Nacos

简介

Nacos:前四个字母分别为NamingConfiguration的前两个字母,最后s为Service

Nacos(Dynamic Naming and Configuration Service)是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos就是注册中心 + 配置中心的组合, Nacos = Eureka + Config + Bus

Spring Cloud Alibaba文档

安装

下载地址 帮助文档 从官网下载Nacos,解压压缩包,进入bin目录运行start.cmdlinux环境则运行sh startup.sh -m standalone

命令运行成功后直接访问http://localhost:8848/nacos,默认的账号密码都是nacos

nacos-01

nacos-02

看到上述页面则表示安装成功。

服务提供者

新建项目nacos-provider,引入服务发现及alibaba依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<!--pom.xml-->
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>cn.midkuro.com</groupId>
<artifactId>nacos-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>nacos-provider</name>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>

<properties>
<maven-jar-plugin.version>2.6</maven-jar-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>

<spring.cloud.version>Hoxton.SR1</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

</dependencies>

<dependencyManagement>
<dependencies>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</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>
</dependencies>
</dependencyManagement>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#application.yml
server:
port: 8081

spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

management:
endpoints:
web:
exposure:
include: '*'
1
2
3
4
5
6
7
8
9
10
@RestController
public class TestController {
@Value("${server.port}")
private String port;

@GetMapping("/port")
public String port() {
return "My Port : " + port;
}
}
1
2
3
4
5
6
7
8
@EnableDiscoveryClient
@SpringBootApplication
public class NacosProdiverApplication {

public static void main(String[] args) {
SpringApplication.run(NacosProdiverApplication.class, args);
}
}

通过引入springCloudalibaba依赖,并编写相关配置文件,并在启动类上增加注解@EnableDiscoveryClient,启动即可注册到nacos中。

nacos-03

nacos天生支持负载均衡,因为nacos集成了netfilxribbon依赖。

在启动多个相同实例时,如下:

nacos-04

服务消费者

新建nacos-consumer项目,pom.xml与上文nacos-provider项目相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#application.yml
server:
port: 8083

spring:
application:
name: nacos-cunsumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

service:
provider-url: http://nacos-provider/
1
2
3
4
5
6
7
8
9
@Configuration
public class ApplicationContextConfig {

@Bean
@LoadBalanced //注意必须配置负载均衡注解
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class TestController {
@Value("${service.provider-url}")
private String serviceURL;

@Autowired
private RestTemplate restTemplate;

@GetMapping("/consumer/port")
public String port() {
return restTemplate.getForObject(serviceURL + "/port", String.class);
}
}

这时候启动nacos-consumer项目,并且运行两个nacos-provider项目,用以测试负载均衡。

nacos-05

通过使用RestTemplate以及@LoadBalanced请求访问nacos-provider服务,达到负载均衡的目的。

nacos-06

nacos-07

配置中心

新建nacos-config-client项目,并且新建两个配置文件application.ymlbootstrap.yml

NacosSpring-cloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

SpringBoot中配置文件的加载是存在优先顺序的,bootstrap优先级高于application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#bootstrap.yaml
server:
port: 3377

spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848 #配置中心地址
file-extension: yaml #指定配置文件后缀

将主体配置放在bootstrap.yml中。

1
2
3
4
#application.yml
spring:
profiles:
active: dev #表示开发环境

环境配置放在application.yml中。

Nacos Spring Cloud 中,dataId 的完整格式如下:

1
${prefix}-${spring.profile.active}.${file-extension}

prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

也就是说,默认情况是:

1
${spring.application.name}-${spring.profile.active}.${file-extension}

例如上述的nacos-config-client的配置文件,则产生的对应的dataId则为:nacos-config-client-dev.yaml

nacos-09

切记nacos只支持yaml后缀格式,暂不兼容yml,所以在编写的过程中需要注意不要写错。

spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。

1
2
3
4
5
6
7
8
9
10
11
@RestController
@RefreshScope // 支持nasos的动态刷新工能
public class TestController {
@Value("${config.info}")
private String configInfo;

@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}

nacos-08

通过在nacos界面上新建配置,新建``nacos-config-client-dev.yamldataId`。

nacos-10

点击右下角的发布保存之后就能够在列表中看到:

nacos-11

通过访问之前编写的Controller能够看到获取得到配置:

nacos-12

自动刷新

通过在nacos界面上进行调整编辑配置文件,将version = 1改成version = 2,在不重启mtex-config-client的情况下,能够看到配置已经刷新。

nacos-13

命名空间

nacos-14

命名空间类似于java里面的package名和类名,最外层的namespace是可以用于区分部署环境的,GroupDataID逻辑上区分两个目标对象。

nacos-15

默认情况下:

1
2
3
Namespace=public
Group=DEFAULT_GROUP
Cluster=DEFAULT

Nacos默认的命名空间是publicNamespace主要用来实现隔离。比方说现在有三个环境:开发、测试、生产环境,我们可以创建三个Namespace,不同的Namespace之间是隔离的。

Group默认是DEFAULT_GROUPGroup可以把不同的微服务划分到同一个分组里面去。

Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认ClusterDEFAULTCluster是对指定微服务的一个虚拟划分。

比放说为了容灾,将Service微服务分别部署在杭州机房和广州机房,这时候就可以给杭州机房的Service微服务起一个集群名称,给广州机房的Service微服务起另一个集群名称,还可以尽量让同一个机房的微服务互相调用,以提升性能。

最后Instance,指的是微服务的实例。

DataID

nacos-16

通过在同个分组里,编写不同的运行环境后缀的配置文件

1
2
3
4
5
spring: 
profiles:
#表示开发环境
active: dev
#active:pro

并通过修改application.yml的相关配置切换环境。

Group

nacos-17

通过新建同名称的文件,所属不同分组,以切换分组的形式切换相关配置运行环境。

nacos-18

1
2
3
spring: 
profiles:
active: info

NameSpace

nacos-19

新建命名空间,会生成一个唯一的命名空间ID。

nacos-20

nacos-21

点击切换命名空间,并且在bootstrap.ymlnamespace属性配置相关的命名空间ID。

nacos-22

持久化

默认Nacos使用嵌入式数据库实现数据的存储,所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的,为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持Mysql的存储

Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

单机模式支持mysql

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

1.安装数据库,版本要求:5.6.5+

2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql拷贝文件内容到mysql中执行

3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。

1
2
3
4
5
6
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

再以单机模式启动nacosnacos所有写嵌入式数据库的数据都写到了mysql

集群

启动模式

单机模式

1
sh startup.sh -m standalone

集群模式

使用内嵌数据源

1
sh startup.sh -p embedded

使用外置数据源

1
sh startup.sh

如果启动失败,可以查看和bin目录同级的logs文件夹中的start.out日志,看看是否是由于无法识别到JAVA_HOME导致的,如果是,则编辑startup.sh,在第一行中增加JAVA_HOME配置

1
JAVA_HOME=/home/local/java/jdk1.8.0_191

Cluster配置

linux环境为例,在已经配置好mysql作为持久化的前提下,拷贝cluster.conf.example文件,将新文件重命名为cluster.conf

并编辑文件配置集群IP和端口

1
2
3
192.168.1.131:3333
192.168.1.131:4444
192.168.1.131:5555

这个IP必须是linux命令hostname -i能够识别到的IP

动态端口

nacos V1.3.0及以上版本中,支持了内嵌式关系型分布式数据库,其默认的startup.sh部分内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while getopts ":m:f:s:c:p:" opt
do
case $opt in
m)
MODE=$OPTARG;;
f)
FUNCTION_MODE=$OPTARG;;
s)
SERVER=$OPTARG;;
c)
MEMBER_LIST=$OPTARG;;
p)
EMBEDDED_STORAGE=$OPTARG;;
?)
echo "Unknown parameter"
exit 1;;
esac
done
1
2
3
echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
nohup $JAVA ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"

可以看到相比之前版本,新增了-p参数,用来提供集群部署时可以不依赖Mysql,以便降低中小用户的集群运维部署成本(大客户,生产环境依然建议依赖Mysql,以便有更高的性能)。

备份startup.sh,并修改startup.sh,达到通过启动命令参数配置启动端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#增加 o: 选择
while getopts ":m:f:s:c:p:o:" opt
do
case $opt in
m)
MODE=$OPTARG;;
f)
FUNCTION_MODE=$OPTARG;;
s)
SERVER=$OPTARG;;
c)
MEMBER_LIST=$OPTARG;;
p)
EMBEDDED_STORAGE=$OPTARG;;
#增加 o参数配置
o)
PORT=$OPTARG;;
?)
echo "Unknown parameter"
exit 1;;
esac
done
1
2
3
4
echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
#增加 启动端口参数传递
nohup $JAVA -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"

则可以通过在sh startup.sh命令后面增加-o端口参数,如下:

1
sh startup.sh -o 8848 -m standalone

集群启动

1
2
3
sh startup.sh -o 3333 -p embedded
sh startup.sh -o 4444 -p embedded
sh startup.sh -o 5555 -p embedded

启动成功后,需要通过配置Nginx负载均衡三台nacos,并且在各个微服务的配置文件中改成Nginx的负载均衡端口即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#Nginx.conf部分配置
upstream cluster{
server 192.168.1.131:3333;
server 192.168.1.131:4444;
server 192.168.1.131:5555;
}

server{
listen 1111;
server_name localhost;
location /{
proxy_pass http://cluster;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server:
port: 3377

spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.1.131:1111
config:
#配置中心地址
server-addr: 192.168.1.131:1111
#指定配置文件后缀
file-extension: yaml

最后更新: 2020年11月17日 20:01

原始链接: https://midkuro.gitee.io/2020/06/28/springcloud-nacos/

× 请我吃糖~
打赏二维码