前言:
Nacos是阿里巴巴开发的配置中心和注册中心,在Nacos之前,其实还有很多相同的产品,比如注册中心:Eureka,Consul, zookeaper;配置中心:Config、apollo等,他们的功能都是单一的,要不是注册中心要不是配置中心,而Nacos不同,他同时兼有配置和注册两种服务功能
一、Nacos介绍
官网走你
要介绍Nacos首先肯定是要介绍注册中心、配置中心是什么了
配置中心:
系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。这个回答有点官方哈,其实就是当微服务较多时,管理每个服务的配置信息比较困难,尤其是当我们想要在服务启动过程中将新的配置信息生效时更加困难了,这时候就有了配置中心的概念,将每个服务的管理配置文件的功能抽离出来,专门交给一个服务去管理,这个服务呢就是配置中心啦
注册中心
注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。
举个现实生活中的例子,比如说,我们手机中的通讯录的两个使用场景:
当我想给张三打电话时,那我需要在通讯录中按照名字找到张三,然后就可以找到他的手机号拨打电话。
李四办了手机号,那么他把手机号告诉我,我把李四的号码存进通讯录,后续,我就可以从通讯录找到他。
这就是注册中心的两个重要概念,服务注册和服务发现
下面看一下Nacos官方地图,看地图不迷路
功能还是很多的,主要也是集中在注册中心和配置中心
二、Nacos安装
这部分,按理说是要写到博客中的,但是一是Nacos安装非常简单,二是网上太多描述的案例,我就不重复造轮子了,请看传送门
Nacos1.4.0 Windows单机模式启动和集群启动
我感觉这篇博客写的还是很不错的,当然也可以直接官方文档走起
三、Nacos之配置中心
1.快速Demo
-
提供本地Nacos服务,当然是以单机standalone的模式启动
-
在http://127.0.0.1:8848/nacos的nacos ui页面中创建一条配置信息
-
创建一个springboot项目
-
引入maven依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.1</version>
</dependency>
- 创建一个web访问获取配置的请求
/**
* @program: nacos-demo
* @description: 获取Nacos中的配置信息
* @create: 2020-11-29 10:47
**/
@RestController
@RequestMapping("config")
public class GetConfigMessage {
@GetMapping("get")
public Object getConfigMessage() throws NacosException {
String serverAddr = "127.0.0.1:8848";
String dataId = "nacos-simple-demo";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId,group,2000);
return content;
}
}
这里的serverAddr、dataId 、group 都和当时在nacos ui中创建的配置信息保持一致即可,例如下图
这样就可以了,当我们启动项目的时候,就可以通过访问相关请求获取在nacos中创建的配置信息了
2.配置模型
在nacos ui界面我们可以看到这个
这个是nacos默认的namespace——public,也就是说像上面的快速demo,使用的就是默认的namespace,但是我们也可以创建更多的namespace,那么namespace是什么?goupId、dataId又是什么?
通过下图我们可以更加直接的了解他们三个级别在项目的中管理
这下子很清晰了吧,我是这样简单的认为的namespace就是项目中的不同环境,而group就是一个项目,dataId就是具体的单体工程了
3. Namespace创建
关于GroupId、DataId的创建,通过快速Demo肯定是知道了,但是Namespace是如何创建的呢?这个也很简单的,接下来我们就简单的介绍一下nacos ui界面
可以看到上图中的红色的框框了,在这里就可以直接创建了,这里不得不感慨一下,如果国内的软件发展起来了,至少以后使用这些开发工具不用为英语发愁了。还需要努力啊,共勉
记住这个命名空间ID,请求配置信息的时候需要用到,之前请求时没有用到是因为它默认的就是public,在配置列表这里切换namespace
切换对应的namespace即可了。
如果我们想在快速demo那里获取test的配置信息的话,那么需要修改一下demo,如下
@RestController
@RequestMapping("config")
public class GetConfigMessage {
@GetMapping("get")
public Object getConfigMessage() throws NacosException {
String serverAddr = "127.0.0.1:8848";
String dataId = "nacos-simple-demo";
String group = "DEFAULT_GROUP";
String namespace = "c1f1507f-bb5a-401d-967c-780fb00f9e81"; //命名空间ID
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId,group,2000);
return content;
}
}
需要添加对namespace的设置,大概就这样
4. Nacos ui界面介绍
主要看一下圈上的部分,服务管理和集群管理的话,等一下再说!下面就是介绍一下功能点吧,具体的自己尝试一下就了解了
-
配置管理中配置列表是我们刚刚接触过的,里边可以添加、查询、导出、导入配置信息;
-
配置管理中的历史版本类似于git上的版本管理,其实就是记录30天内修改配置信息的记录,然后如果有需要的话,可以回退到任何版本;
-
监听查询:这个是当配置信息改变的时候,我们不可能重启服务再此加载配置信息,这个时候在程序中建立一个监听,就可以时刻获取到新修改的配置信息了;
-
权限控制下是对访问ui界面的用户权限做出的修改,可以在里边创建用户、修改用户密码、权限等。其实就是一个用户、角色、权限这三者的基本信息的设置页面
-
命名空间:这个刚刚有提到,就是创建新的命名空间的
具体的自己操作一下,理解更加深刻 -
nacos ui界面的密码其实是Dcrypt加密的,我们也可以直接修改数据库进行密码修改
四、Nacos与springCloud配置获取
这个其实就是在一个SpringCloud项目中如何获取Nacos的配置中心的配置信息,这个直接看Demo就好了,目前我写的博客感觉不涉及高深的东西,都是常规的使用,多说一句,所谓的高深也就是涉及多种个人不理解的方面,所以才高深
Demo
- 依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nacos</groupId>
<artifactId>nacos-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-demo</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<modules>
<module>provider</module>
</modules>
<properties>
<java.version>1.8</java.version>
</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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- bootstrap.yml配置文件
spring:
application:
name: nacos-simple-demo
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml # dataId = spring.application.name+file-extension A
namespace: c1f1507f-bb5a-401d-967c-780fb00f9e81 # 定位namespace
group: DEFAULT_GROUP # 定位group
# 上边这边指定配置文件的方式,只能指定一个配置文件,下面介绍两种指定多种配置文件的方式
# 方法一 C
# shared-dataids: test1.yaml,test2.yaml
# 方法二 B
ext-config[0]:
data-id: test1.yaml
ext-config[1]:
data-id: test2.yaml
group-id: DEFAULT_GROUP
ext-config[2]:
data-id: test3.yaml
group-id: DEFAULT_GROUP # 组名,在方法一中是不可以指定组名的,所以只能使用默认组名DEFAULT_GROUP
refresh: true # 设置配置热启动,可以动态刷新,当然在需要的类上边需要加上@RefreshScope
# 关于配置多个配置文件,它们的优先级问题
# 原则上讲 A>B>C ,也就是说当多个配置文件中它们的配置内容相同时,以优先级别高的配置文件为准,在B中以ext-config[n]的n越高的为准
- 获取配置测试请求类
/**
* @program: nacos-demo
* @description: 获取Nacos中的配置信息
* @create: 2020-11-29 10:47
**/
@RestController
@RequestMapping("config")
@RefreshScope
public class GetConfigMessage {
@Value("${message:我是默认信息}")
private String message;
@Value("${test1.value:我是默认信息}")
private String value1;
@Value("${test2.value:我是默认信息}")
private String value2;
@Value("${test3.value:我是默认信息}")
private String value3;
@GetMapping("get/java")
public Object getConfigMessage() throws NacosException {
String serverAddr = "127.0.0.1:8848";
String dataId = "nacos-simple-demo.yaml";
String group = "DEFAULT_GROUP";
String namespace = "c1f1507f-bb5a-401d-967c-780fb00f9e81"; //命名空间ID
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId,group,2000);
return content;
}
@GetMapping("get/springCloud")
public Object getSpringCloudMessage(){
return "message:"+this.message+"\t test1:"+this.value1+"\t test2:"+this.value2+"\t test3:"+this.value3;
}
}
这里边其实没有什么讲解的,因为在配置文件中已经有相应的解释了,@RefreshScope只有加上这个注解,才可以让配置信息动态加载,就这样
五、Nacos集群部署
这里不讲了,其实上就是我推荐的那个安装Nacos的博客中已经介绍了Nacos的集群部署,这里介绍了集群部署,那么如果在项目中用到集群部署呢,其实就是当写bootstrap.yml的时候,直接将多个Nacos服务都配置到server-addr中就可以了,这时候当其中一个Nacos服务挂掉了,是不影响项目正常运行的。
spring:
application:
name: nacos-simple-demo
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
举例如上,因为是在本地启动的,所以是一个伪集群,只是端口号不同而已
六、Nacos注册中心
本来想分为两个分别写一下Nacos配置中心和注册中心,可是忽然发现基础使用真的涉及的东西很少,下面以一个Demo的形式来展开
其实只要引入这个依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
再在配置文件中加入这个
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
这样就可以注册到注册中心了,其他的一些参数就看官网吧,中文的。。。。
我简单画了一下我这个demo的流程图(真的是本人画的,以前都是网络互相借鉴,哈哈,大半夜突然有点嗨)
两分钟后。。。太晚了,画图工具到期了,就不续了,直接画图来搞了,主要是Demo流程也比较简单,其实就是一个Gatewa网关,所有的请求都经过Gateway去路由转发,可以路由到Provider或者Consumer,请求到Consumer后,Consumer需要调用Provider完成请求的逻辑,这里使用的调用模板是Feign,中间使用的注册中心是Nacos,不太理解的话,看一下相关组件的讲解视频就知道了,下面看一下Demo
就贴一下关键代码把,如果有兴趣的话,可以看一下我的GitHub项目,里边有完整Demo代码
Gateway
- properties.yml
spring:
application:
name: gateway-simple
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #注册到nacos中
gateway: # 根据服务名转发路由
discovery:
locator:
enabled: true
lower-case-service-id: true # 将服务名改为小写,默认都是大写的
server:
port: 80
# 配置 路由追踪日志打印
logging:
level:
root: info
org.springframework.web.servlet.DispatcherServlet: debug
org.springframework.cloud.sleuth: debug
- pom 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
provider
- pom 依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.1</version>
</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
里边夹杂了一些测试配置中心的依赖
- properties.yml
spring:
application:
name: nacos-simple-demo
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml # dataId = spring.application.name+file-extension A
namespace: c1f1507f-bb5a-401d-967c-780fb00f9e81 # 定位namespace
group: DEFAULT_GROUP # 定位group
# 上边这边指定配置文件的方式,只能指定一个配置文件,下面介绍两种指定多种配置文件的方式
# 方法一 C
# shared-dataids: test1.yaml,test2.yaml
# 方法二 B
ext-config[0]:
data-id: test1.yaml
ext-config[1]:
data-id: test2.yaml
group-id: DEFAULT_GROUP
ext-config[2]:
data-id: test3.yaml
group-id: DEFAULT_GROUP # 组名,在方法一中是不可以指定组名的,所以只能使用默认组名DEFAULT_GROUP
refresh: true # 设置配置热启动,可以动态刷新,当然在需要的类上边需要加上@RefreshScope
# 关于配置多个配置文件,它们的优先级问题
# 原则上讲 A>B>C ,也就是说当多个配置文件中它们的配置内容相同时,以优先级别高的配置文件为准,在B中以ext-config[n]的n越高的为准
discovery:
server-addr: 127.0.0.1:8848
- 对外提供的接口
/**
* @program: nacos-demo
* @description: 对外提供的接口
* @create: 2020-12-01 23:38
**/
@RestController
@RequestMapping("provider")
public class ProviderController {
@PostMapping("get/message")
public String getMessage(@RequestBody String name){
return "Success , param is "+name;
}
}
- 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
Consumer
- pom依赖
<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.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- properties.yml
server:
port: 9510
spring:
application:
name: consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ApiimplApplication {
public static void main(String[] args) {
SpringApplication.run(ApiimplApplication.class, args);
}
}
- 对外接口
/**
* @author heshuai
* @description: 调用接口
* @create: 2020-12-01 23:41
**/
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private ProviderFeign providerFeign;
@GetMapping("get/{name}")
public Object getMessage(@PathVariable("name") String name){
return providerFeign.getMessage(name);
}
}
- Feign调用模板
/**
* Feign 调用 第三方项目
*/
@FeignClient("nacos-simple-demo")
public interface ProviderFeign {
@PostMapping("provider/get/message")
String getMessage(@RequestBody String name);
}
就是几行代码,是不是很简单。。。睡了睡了
结语
Nacos就是一个服务治理的一个工具,就使用层面来说的话,是非常简单人性化的,深入挖的话,必是满满的技术点,但是现在的我还不适合,我还需要在加强基础才有希望加深进去,所以睡了睡了,梦里啥都有