本文档中的Nacos为Alibaba Nacos
目录
application.yml和bootstrap.yml的区别
1.Nacos基本概念
Nacos是阿里巴巴推出来的一个新开源项目,致力于帮助发现,配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助快速实现动态服务发现,服务配置,服务元数据,及流量管理
Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现,配置和管理,Nacos主要提供以下四个功能:
- 服务发现和服务健康检测
- 动态配置服务
- 动态DNS服务
- 服务及其元数据管理
nacos服务客户端(要注册到nacos的服务)启动时会每隔一段时间(默认5秒)向nacos发生心跳包,nacos注册中心15秒内没有检测到心跳包会默认认为nacos处于一种不健康的状态,30秒还没收到则认为这个服务已不可用。
2.Nacos安装
将文件夹直接拷贝到指定盘(路径不能有中文),随后修改bin目录下的startup.cmd文件,集群模式改为单机模式
set MODE="cluster"修改为set MODE="standalone"
保存后单击此文件运行即可
启动后,直接在浏览器访问 localhost:8848/nacos,账号密码都是nacos
3.Nacos集成SpringBoot实现服务注册与发现
3.1 在pom中添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.2 在application.yml中配置如下信息
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 因部分本机可能安装了VMware虚拟机,因此可能不止一个网卡,所以需指定ip,如果没有则不需指定
ip: 127.0.0.1
3.3 将RestTemplate注册到Ioc容器中
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
3.4 配置服务提供者和消费者
服务提供者:
package com.bdqn.qianmo.user.controller;
import com.bdqn.beans.User;
import com.bdqn.qianmo.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@Value("${server.port}")
int port;
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
System.out.println("port: "+port);
return userService.getById(id);
}
}
服务消费者:
package com.bdqn.qianmo.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bdqn.beans.Order;
import com.bdqn.beans.User;
import com.bdqn.qianmo.order.service.OrderService;
import com.bdqn.qianmo.order.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
/**
*
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
implements OrderService {
@Autowired
RestTemplate restTemplate;
@Override
public Order selectById(Long id) {
Order order = this.getBaseMapper().selectById(id);
User forObject = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);
order.setUser(forObject);
return order;
}
}
注:服务提供者和服务消费者为两个分开运行的SpringBoot项目中,项目启动后效果如图
领域模型:
4.Nacos实现统一配置管理
4.1基础概念及配置
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。而Nacos一方面可以将配置集中配置,另一方面可以在配置变更时,及时通知微服务,实现配置的热更新
那么,如何在Nacos中配置管理呢,步骤如下
4.1.1⬇️ 在项目中添加依赖
在pom文件中添加nacos-config依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
4.1.2⬇️ 在配置文件中添加config相关属性
需要注意的是,此处的文件名应该为bootstrap.yml文件
spring:
cloud:
nacos:
config:
#nacos配置中心的地址
server-addr: localhost:8848
#文件后缀
file-extension: yml
#共享的配置文件列表
shared-configs:
- application-common.yml
#微服务名称
application:
name: user-service
application.yml和bootstrap.yml的区别
在SpringCloud的官方文档中有描述两个文件的区别
原文经过翻译后,大致意思如下:
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
因此,对比application文件,bootstrap配置文件有以下几个特性
- bootstrap由父ApplicationContext记载,优先级比application高
- bootstrap中的属性不能被application中的相同属性覆盖
bootstrap/application的应用场景:
application主要用于SpringBoot项目的自动配置
bootstrap配置文件则有以下几个应用场景:
- 使用SpringCloud Config配置中心时,需要在bootstrap中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性
- 一些加密/解密的场景
总结:
优先级为:bootstrap.properties>bootstrap.yml>application.properties>application.yml
bootstrap为系统级别,application为应用级别
4.1.3⬇️ 在Nacos配置中心添加配置文件
需要注意的是,此处的Data ID必须要和项目中配置的微服务名称和文件后缀一样,比如在4.2中配置的是user-service的微服务名称,后缀为yml,那么此处的Data ID就必须为"user-service.yml"
4.1.4▶️ 在Nacos中的配置文件中添加属性
添加完后,即可正常启动项目了
启动流程如下:
4.1.5 热更新
Nacos中的配置文件更新时,如何在项目不重新启动的情况下也能做到热更新呢,其实很简单,只需要在Controller中添加@RefreshScope注解修饰类即可
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
@Autowired
UserService userService;
@Value("${server.port}")
int port;
@Value("${activeTest}")
String activeTest;
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
System.out.println("port: "+port);
return userService.getById(id);
}
@GetMapping("/getTest")
public String get() {
return activeTest;
}
}
这样,当配置文件中的属性被修改时,则可以在不重启项目的情况下进行属性值的更新
@RefreshScope: 经过@RefreshScope注解修饰的Bean,将被RefreshScope进行代理,当配置变更时可以在不重启jvm的前提下刷新Bean中相关的属性值和Bean的热更新。
4.2.6 配置文件的切换
在实际应用场景中,运行的环境可能分为测试环境和dev环境或本地环境,预发布环境,线上环境,那如何在不修改微服务名称的情况下,进行配置文件的切换呢?只需要在bootstrap中添加一个属性即可
profiles.active的规则:
active的值,直接影响项目在nacos中寻找配置文件:微服务名称+"-"+"."+文件类型,例如:
- 此处的active值若为test,则项目在Nacos配置列表中查找的就是user-service-test.yml的配置文件
- 此处的active值若为dev,则项目在Nacos配置列表中查找的就是user-service-dev.yml的配置文件
4.2.7 配置数据库
在Nacos单机模式中,nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况,因此需要配置mysql数据库,可视化的查看数据的存储情况,步骤如下:
4.2.7.1⬇️ 添加Mysql数据库
先创建一个空的数据库
4.2.7.2⬇️ 转储sql文件
在nacos的安装路径下,找到conf文件夹下的nacos-mysql.sql文件
转储此文件,效果如下:
4.2.7.3▶️ 修改配置文件
在nacos的安装路径下,找到conf文件夹下的application.properties文件
修改后如下:
4.2 Nacos集群模式
为了避免在实际项目中会产生的单点故障,Nacos的运行模式要从单机转为集群
以下操作,所有nacos都需要进行,有一个没有修改则无法运行集群模式
4.2.1⬇️ 模拟集群环境
安装三个nacos来模拟集群环境
然后检查启动器(安装路径下bin目录的startup.cmd文件)的运行模式:
4.2.2⬇️修改配置文件
a. 修改nacos安装路径下config文件夹中的application.properties文件,修改端口号
注意的是,三个nacos的端口号都应该避免重复,以避免端口号占用
b. 同样的文件,修改ip号(如果本机没有安装虚拟机,且只有一个网卡则无需配置)
c. 复制一个安装路径下conf文件夹下的cluster.conf.example文件,并删除.example后缀
d.修改cluster.conf文件,将三个修改后的nacos端口号添加进去
4.2.3▶️运行即可
依次启动三个nacos,效果如图:
微服务项目中的配置如图: