Nacos是阿里巴巴最新开源的项目,核心定位是“一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”,项目地址:https://nacos.io/zh-cn/ Nacos核心提供两个功能:服务注册与发现,动态配置管理。
Nacos核心提供两个功能:服务注册与发现,动态配置管理。
Nacos提供基于DNS和基于RPC的服务发现,即能被用来支持https/http的服务注册与发现,也支持RPC如dubbo的服务注册与发现。
与Dubbo使用的zookeeper相比而言,两者差异还是比较大的,zookeeper是一种分布式的协调服务,它天生是作为分布式数据一致性场景下的解决方案,所以zookeeper是CP的,它牺牲了可用性来保证一致性,在极端情况下(master选举期间)服务会对外停止,对于服务可用性要求比较高的系统是难以接受的。Nacos是一种去中心化的架构,属于CAP理论里的AP架构,支持最终一致性,在分布式服务发现与注册场景下具有很不错的性能。目前dubbo官方也支持使用Nacos代替zookeeper。
动态修改配置并实时生效对于服务端的同学而已并不陌生,这种服务能够让我们的服务拥有更多的灵活性,不需要重启服务即可做到配置实时生效,非常适合于“配置优先”的服务开发。
Nacos是2018年阿里开源的分布式配置中心和注册中心,我们是有必要去了解去使用的现代化技术。能够成为现在流行的技术组件,也有其很多优点,比如对于Apollo、Eureka、Consul等注册中心相比,Nacos在性能上更优,轻量级的实现。Nacos整个生态圈是比较完善的,只是提供的配置及其他方面没有那么完整。其实,对于一个企业来说,具体项目中使用根据实际场景去选型最优为基准,尽量折中去选。
准备环境:JDK1.8、Maven(其实这个可以省咧)、Linux/Mac
首先先下载好安装包: nacos-server-1.1.4.tar.gz(通常使用1.1.4版本及以上)
然后,上传到云服务器或其他服务器。
#解压nacos安装包
tar -zxvf nacos-server-1.1.4.tar.gz
#由于没有配置集群,非集群启动,即单机片启动
./startup.sh -m standalone
#通过该命令能够确认nacos是否启动成功
netstat -antp #查看所有端口,可以看到8848默认端口运行中
#浏览器访问
http:ip:8848/nacos
安装好了,我们进行下面的操作~
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
spring:
application:
name: nacos-config
cloud:
nacos:
config:
#配置中心地址
server-addr: 39.108.146.20:8848
#配置方式yml,目前仅支持properties/yaml
file-extension: yml
#默认开启自动刷新
refresh-enabled: true
#不同组可以有相同的属性
group: dev
#可以根据配置环境不同相互隔离
# namespace: pro
main:
allow-bean-definition-overriding: true
1、dataId(唯一标识): p r e f i x − {prefix}- prefix−{spring.profile.active}.${file-extension}
prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active
为空时,对应的连接符 -
也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。2、group(配置组):在不同组中可以有相同的dataId
3、namespace(命名空间):可以隔离区分不同的环境配置文件,如:dev、test、pro、uat等环境
4、配置格式:暂时仅支持yaml、properties格式文件
5、配置内容:也就是你要配置的一些数据库敏感信息,能够实现动态获取配置。
通过客户端动态获取配置信息:
在springboot启动类中加上@RefreshScope注解,实现动态刷新获取配置,代码如下:
package com.ht.nacos;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@RefreshScope
public class NacosDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDemoApplication.class, args);
}
@Value("${test.name}")
private String name;
@Value("${test.age}")
private Integer age;
/**
* 测试配置
* @return
*/
@GetMapping("test")
public String testConfig(){
return name+" : "+age;
}
}
在这里通过@Value注解就能够动态获取到nacos配置信息:
可以看到获取成功了!然后我们在nacos中修改一下配置文件信息是否会动态刷新~
如下图:
从上面能够看出来确实实现了动态刷新与访问,到这里简单的动态获取配置信息就完成了。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
application:
name: nacos-config
cloud:
nacos:
config:
#配置中心地址
server-addr: 39.108.146.20:8848
#配置方式yml,目前仅支持properties/yaml
file-extension: yml
#默认开启自动刷新
refresh-enabled: true
#不同组可以有相同的属性
group: dev
#可以根据配置环境不同相互隔离
discovery:
server-addr: 39.108.146.20:8848
# username: nacos
# password: $2a$10$pxs77T/88cjff7zFKQlIheFQaVFDKBzQafrBgE.GnQ/EYKO0MMpgC
register-enabled: true
enabled: true
watch:
enabled: true
watch-delay: 30000
heart-beat-interval: 3000
heart-beat-timeout: 30000
group: dev
service: ${
spring.application.name}
weight: 1
secure: false
# namespace: pro
main:
allow-bean-definition-overriding: true
在项目启动类中加上@EnableDiscoveryClient注解,否则启动会报错!!!
配置完成以后,启动项目,如下图:
此时服务列表多了一个服务,到这里服务的注册与发现就简单的实现了。
最后,附上完整代码地址:
码云:https://gitee.com/liao_hanlin/ProjectDirectory/tree/dev/nacos-demo
github: https://github.com/mbql/ProjectDirectory/tree/dev/nacos-demo