一、Nacos 简介
1、Nacos 是什么
Nacos:前四个字母分别为 Naming
和 Configuration
的前两个字母,最后的s
为 Service
Nacos 是阿里巴巴推出来的一个开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
Nacos 是阿里巴巴研发的一个集注册中心与配置中心于一体的管理平台
Nacos 可以替代 Eureka 做服务注册中心,替代 Config 做服务配置中心
2、Nacos 提供四大功能
Nacos 使服务更容易注册自己并通过 DNS 或 HTTP 接口发现其他服务。Nacos 还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos 消除了在更新配置时重新部署应用程序和服务的需要,这使配置更改更加高效和灵活。
动态 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
| <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>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <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> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <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>
|
③ 创建 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: 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> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
<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>
|
② 创建 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
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 包之外,剩下的工作就是完善配置文件了,例如 mysql
、redis
、security
相关的配置。除了项目运行的基础配置之外,还有一些配置是与我们业务有关系的,比如说七牛存储、短信相关、邮件相关,或者一些业务上的开关。
对于一些简单的项目来说,我们一般都是直接把相关配置放在单独的配置文件中,以 properties
或者yml
的格式出现,更省事儿的方式是直接放到 application.properties
或 application.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> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <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
| server: port: 3377
spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml
|
③ 配置 application.yml 文件
1 2 3 4 5
| spring: profiles: active: dev
|
④ 配置启动类
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
@RefreshScope public class ConfigClientController {
@Value("${config.info}") private String configInfo;
@GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
|
⑥ 在 Nacos 中添加配置信息
Nacos
中 Data 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