Nacos简介

官网:https://nacos.io/zh-cn/

Nacos文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

github地址:https://github.com/alibaba/nacos

安装运行

1.4.2版本下载:https://github.com/alibaba/nacos/releases/tag/1.4.2

Windows下载后打开目录

启动nacos

D:\nacos-server-1.4.2\nacos\bin>startup.cmd
"nacos is starting with cluster"

,--.
,--.'|
,--,: : | Nacos 1.4.2
,`--.'`| ' : ,---. Running in cluster mode, All function modules
| : : | | ' ,'\ .--.--. Port: 8848
: | \ | : ,--.--. ,---. / / | / / ' Pid: 16400
| : ' '; | / \ / \. ; ,. :| : /`./ Console: http://192.168.26.1:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'

如果启动报以下错误

java.io.IOException: java.lang.IllegalArgumentException: db.num is null

解决方案为修改startup.cmd,把set MODE="cluster"修改为set MODE="standalone"(默认集群启动,修改为单机启动)

命令运行成功后访问:http://localhost:8848/nacos

登陆账号密码为nacos/nacos

在父工程的pom.xml中添加如下依赖

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

完整父工程pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.springcloud</groupId>
<artifactId>MyProject</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencyManagement>
<dependencies>
<!-- springboot 2.2.2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springcloud cloud Hoxton.SR1 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springcloud cloud alibaba 2.1.0.RELEASE -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>

服务提供者注册nacos

参考文档:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_discovery

新建一个module,引入nacos依赖

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

可以发现nacos默认集成了ribbon,默认支持负载均衡

完整pom.xml如下

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>MyProject</artifactId>
<groupId>com.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>nacos-provider</artifactId>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</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>

</project>

application.yml内容如下

server:
port: 8081
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'

启动类添加@EnableDiscoveryClient注解

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvider {
public static void main(String[] args) {
SpringApplication.run(NacosProvider.class,args);
}
}

controller内容如下

@RestController
public class NacosProviderController {

@Value("${server.port}")
private String serverPort;

@GetMapping(value = "/nacos/{id}")
public String echo(@PathVariable("id") Integer id) {
return "Hello Nacos Discovery " + id+",serverPort:"+serverPort;
}

启动服务提供者,端口为:8081

在nacos服务列表中可以看到服务提供者已经注册进了nacos

测试controller,在浏览器访问:http://localhost:8081/nacos/1

页面输出如下:Hello Nacos Discovery 1,serverPort:8081

再新建一个module,内容和第一个一样,只是把端口改为:8082即可,来模拟负载均衡

服务消费者注册进nacos

新建module,引入nacos依赖

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

application.yml内容如下,服务消费者端口为:8083

server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumer {
public static void main(String[] args) {
SpringApplication.run(NacosConsumer.class,args);
}
}

配置restTemplate

@Configuration
public class ApplicationContextConfig {

@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}

写一个controller,去调用服务提供者的方法

@RestController
public class NacosConsumerController {

@Resource
private RestTemplate restTemplate;

private static final String SERVER_URL="http://nacos-provider";

@GetMapping(value = "/consumer/nacos/{id}")
public String echo(@PathVariable("id") Long id) {
return restTemplate.getForObject(SERVER_URL+"/nacos/"+id,String.class);
}

}

测试服务消费者调用服务提供者的方法:

浏览器输入:http://localhost:8083/consumer/nacos/1

浏览器交替输出:Hello Nacos Discovery 1,serverPort:8081和Hello Nacos Discovery 1,serverPort:8082

nacos支持AP和CP模式切换

服务配置中心

新建module,引入配置依赖

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

在resources目录下同时配置bootstrap.ymlapplication.yml,其中bootstrap.yml优先级高于application.yml

bootstrap.yml配置如下:端口为:3377

server:
port: 3377
spring:
application:
name: nacos-conf-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml

application.yml配置文件如下:

spring:
profiles:
active: dev
# active: uat
# active: prd

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConf {
public static void main(String[] args) {
SpringApplication.run(NacosConf.class,args);
}
}

controller,其中@RefreshScope支持nacos的动态刷新功能

@RestController
@RefreshScope
public class ConfigClientController {

@Value("${config.info}")
private String configInfo;

@GetMapping(value = "/config/info")
public String echo() {
return configInfo;
}
}

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

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

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

测试:浏览器输入:http://localhost:3377/config/info

浏览器页面输出:config info for dev

此时如果修改nacos-dev-client.yaml的配置内容,浏览器内容也将即时刷新。

分组

Data Id 相同但Group不同时,使用group来区分

application.yml中添加spring.cloud.nacos.config.group指定组来区分

server:
port: 3377
spring:
application:
name: nacos-conf-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: TEST_GROUP

命名空间

新建命名空间

在服务列表中可以看到对应的命名空间ID

在application.yml中指定spring.cloud.nacos.config.namespace

server:
port: 3377
spring:
application:
name: nacos-conf-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: DEV_GROUP
namespace: eef35622-7aa2-48ec-941f-1b51e2c7d0fb

nacos集群

参考文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

nacos默认自带的是嵌入式数据库derby

derby切换到