1.Nacos简介
1.1.什么是Nacos
Nacos 是阿里巴巴的新开源项目,其核心定位是 “一个更易于帮助构建云原生应用的集注册中心与配置中心于一体的管理平台”。
1.2.Nacos安装与启动
1.2.1. 下载
下载地址:https://github.com/alibaba/nacos/tags
1.2.2. 安装
解压安装包:
[root@localhost ~]# cd /usr/upload
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
1.2.3. 启动与关闭
启动:
[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
... ...
nacos is starting with standalone
nacos is starting,you can check the /usr/java/nacos/logs/start.out
关闭:
[root@localhost bin]# ./shutdown.sh
The nacosServer(3543) is running...
Send shutdown request to nacosServer(3543) OK
[root@localhost bin]
2.Nacos注册中心(存放服务的ip和port)
2.1.什么是Nacos注册中心
注册中心主要有三部分组成:
- Nacos-Server:注册中心
提供服务的注册和发现。 - Nacos-Provider:服务提供方
把自身的服务实例注册到 Nacos Server 中 - Nacos-Consumer:服务调用方
通过 Nacos Server 获取服务列表,消费服务。
2.2.Nacos注册中心入门
2.2.1.创建服务提供者:nacos_provider
- pom.xml: 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
- application.yml: 添加配置信息
server:
port: 8090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.126.132:8848 #注册中心的地址
application:
name: nacos-provider #注册到naocs的服务名
- controller: 编写控制层
@RestController
@RequestMapping("/provider")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
- service: 编写服务层
// 接口
public interface UserService {
User getUserById(Integer id);
}
//实现类
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id, "小高高", 18);
}
}
- NacosProviderApp: 编写启动器
@SpringBootApplication
@EnableDiscoveryClient //注册自己并发现其他服务
public class NacosProviderApp {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApp.class, args);
}
}
2.2.2.创建服务提供者:nacos_consumer
- pom.xml: 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
- application.yml: 添加配置信息
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.126.132:8848 #注册中心的地址
application:
name: nacos-consumer #注册到naocs的服务名
- config: 编写配置类
@Configuration
public class BeanConfig {
// RestTemplate: 是spring提供的一个工具类,作用是发送restful请求
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- controller: 编写控制层
@RestController
@RequestMapping("/provider")
public class UserController {
@Autowired
private RestTemplate restTemplate;
// springcloud提供的工具类,作用是发现服务
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
// 获取所有的服务名
List<String> serviceList = discoveryClient.getServices();
for (String serviceName : serviceList) {
System.out.println(serviceName);
}
//调用nacos_provider服务
//缺点:1、ip和port硬编码 2、不能实现负载均衡
// String url = "http://127.0.0.1:8090/provider/getUserById/" + id;
// 缺点:1、不能实现负载均衡
ServiceInstance service = discoveryClient.getInstances("nacos-provider").get(0);
String url = "http://" + service.getHost() + ":" + service.getPort() + "/provider/getUserById/" + id;
return restTemplate.getForObject(url, User.class);
}
}
- NacosProviderApp: 编写启动器
@SpringBootApplication
@EnableDiscoveryClient //注册自己并发现其他服务
public class NacosConsumerApp {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class, args);
}
}
2.2.3. 测试
3.Nacos配置中心
3.1.什么是Nacos配置中心
首先我们来看一下,微服务架构下关于配置文件的一些问题:
- 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
- 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
- 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要配置中心的加入来解决这些问题,配置中心的思路是:
- 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
- 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
- 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
3.2.Nacos配置中心入门
3.2.1. 创建nacos_config
- pom.xml: 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
</dependencies>
- bootstrap.yml: 添加配置信息
客户端配置文件的名称必须为
bootstrap.yml
bootstrap.yml
比application.yml
优先加载,应用于系统级别参数配置,一般不会变动application.yml
应用与SpringBoot项目的自动化配置
spring:
cloud:
nacos:
config:
server-addr: 192.168.126.132:8848
file-extension: yaml #后缀名
prefix: nacos-config #文件名
- config: 编写配置类
@Configuration
public class BeanConfig {
// RestTemplate: 是spring提供的一个工具类,作用是发送restful请求
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- controller: 编写控制层
@RestController
@RequestMapping("/config")
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
public class ConfigController {
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@GetMapping("/info")
public String info(){
return username + "---" + password;
}
}
- NacosProviderApp: 编写启动器
@SpringBootApplication
@EnableDiscoveryClient //注册自己并发现其他服务
public class NacosConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApp.class, args);
}
}
3.2.2. 在nacos中新建配置文件
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.126.132:8848
application:
name: nacos-config
datasource:
username: root
password: 1111
3.2.3. 测试
- 启动时加载配置文件
- 修改配置文件后nacos监听到MD5有变化则推送消息给客户端,客户端收到消息后会拉取最新配置(参考
配置管理->监听查询
菜单)
- 浏览器访问:http://127.0.0.1:8081/config/info
3.3.配置隔离
3.3.1.Nacos配置管理模型
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
Namespace Group DataId介绍:
Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等
Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
获取配置集需要指定:
nacos服务地址,必须指定
namespace,如不指定默认public
group,如不指定默认 DEFAULT_GROUP
dataId,必须指定
3.3.2.namespace隔离
前面已经介绍过,命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。
(1).新建namespace
新建namespace
建立好所有namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace的选项卡,如下图:
(2).克隆配置文件
- 点击左下角
克隆
按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace。
(3).读取配置文件
spring:
cloud:
nacos:
config:
server-addr: 192.168.126.132:8848
file-extension: yaml
prefix: nacos-config
namespace: tets #开发环境
3.3.3.group隔离
(1).新建配置文件
- 新建配置文件并修改Group名
- 不同的配置分组下可以有相同的配置
(2).读取配置文件
spring:
cloud:
nacos:
config:
server-addr: 192.168.126.132:8848
file-extension: yaml
prefix: nacos-config
namespace: test
group: NACOS_GROUP #nacos项目