一、Nacos 简介

1、Nacos 是什么

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

Nacos 是阿里巴巴推出来的一个开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

Nacos 是阿里巴巴研发的一个集注册中心与配置中心于一体的管理平台

Nacos 可以替代 Eureka 做服务注册中心,替代 Config 做服务配置中心

2、Nacos 提供四大功能

  • 服务发现和服务健康检查

Nacos 使服务更容易注册自己并通过 DNS 或 HTTP 接口发现其他服务。Nacos 还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。

  • 动态配置管理

动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos 消除了在更新配置时重新部署应用程序和服务的需要,这使配置更改更加高效和灵活。

  • 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。动态 DNS 服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

  • 服务和元数据管理

Nacos 提供易于使用的服务仪表板,可帮助您管理服务元数据,配置

3、Nacos 地址

官方下载地址:https://nacos.io/zh-cn/index.html

官方文档:https://nacos.io/zh-cn/docs/quick-start.html

请求地址:http://localhost:8848/nacos

用户名和密码都是:nacos

二、基于 Nacos 的负载均衡

1、服务提供者

① 创建父工程

创建父工程cloud-alibaba

pom 文件添加依赖

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
68
<!-- 统一管理jar包版本 -->
<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>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
</properties>

<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 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>
<!--spring 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>
<!--spring 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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>

② 创建第一个提供者

创建项目 cloudalibaba-provider-payment9001

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
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>

③ 创建 application.yml 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 9001
spring:
application:
# 应用名称
name: nacos-payment-provider
cloud:
nacos:
discovery:
# 配置Nacos的注册中心地址
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
# 开启监控
include: '*'

④ 创建启动类 PaymentMain9001

1
2
3
4
5
6
7
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}

⑤ 创建 PaymentController

1
2
3
4
5
6
7
8
9
10
11
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;

@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "serverPort: "+ serverPort+" id---"+id;
}
}

运行启动类,请求地址: http://localhost:9001/payment/nacos/2

进入注册中心 http://localhost:8848/nacos

⑥ 创建第二个提供者

创建项目 cloudalibaba-provider-payment9002

方式与上面相同

2、创建消费者

nacos自带负载均衡功能

创建项目 cloudalibaba-consumer-nacos-order83

① 添加 pom 文件

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
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>

② 创建 application.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider

③ 创建启动类

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}

④ 创建配置类

1
2
3
4
5
6
7
8
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

⑤ 创建 OrderNacosController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
@Slf4j
public class OrderNacosController {
@Autowired
private RestTemplate restTemplate;

@Value("${service-url.nacos-user-service}")
private String serverURL;

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

运行启动类,请求地址:http://localhost:83/consumer/payment/nacos/13

查看负载均衡效果

三、nacos 配置中心

配置文件是我们再熟悉不过的了,尤其是 Spring Boot 项目,除了引入相应的 maven 包之外,剩下的工作就是完善配置文件了,例如 mysqlredissecurity 相关的配置。除了项目运行的基础配置之外,还有一些配置是与我们业务有关系的,比如说七牛存储、短信相关、邮件相关,或者一些业务上的开关。

对于一些简单的项目来说,我们一般都是直接把相关配置放在单独的配置文件中,以 properties 或者yml 的格式出现,更省事儿的方式是直接放到 application.propertiesapplication.yml 中。但是这样的方式有个明显的问题,分布式系统中,由于服务数量非常多,配置文件分散在不同微服务项目中,管理极其不方便。为了方便配置文件集中管理,需要分布式配置中心组件。

1、bootstrap 与 application 区别

  • 加载顺序

    这里主要是说明 application 和 bootstrap 的加载顺序。

    bootstrap.yml(bootstrap.properties)先加载

    application.yml(application.properties)后加载

  • 配置区别

    bootstrap.yml 和 application.yml 都可以用来配置参数。

    bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。可以理解加载共性的配置。

    application.yml 可以用来定义应用级别的,可以理解成加载特性的配置。

2、创建配置中心项目

创建项目 cloudalibaba-config-nacos-client3377

① 添加 pom 文件

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
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</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>

② 配置 bootstrap.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# nacos配置
server:
port: 3377

spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置 , 从nacos配置中心读取yaml配置文件

③ 配置 application.yml 文件

1
2
3
4
5
spring:
profiles:
active: dev # 表示开发环境
#active: test # 表示测试环境
#active: product # 表示生产环境

④ 配置启动类

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}

⑤ 配置 ConfigClientController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
// 支持Nacos的动态刷新功能。
@RefreshScope
public class ConfigClientController {

// 获取配置中心的配置数据
@Value("${config.info}")
private String configInfo;

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

⑥ 在 Nacos 中添加配置信息

NacosData ID 的匹配规则

${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
Data ID = 应用的名字-环境-后缀
nacos-config-client-dev.yaml

在 nacos 配置列表页面新建配置

运行启动类,请求地址:http://localhost:3377/config/info

3、多环境多项目管理

实际开发中 , 通常一个系统会准备

  • dev 开发环境
  • test 测试环境
  • prod 生产环境

如何保证指定环境启动时服务能正确读取到 nacos 上相应环境的配置文件呢?

Nacos 的图形化管理界面新建配置

修改 application.yml 配置文件

运行启动类,请求地址:http://localhost:3377/config/info