关于Nacos
Nacos是阿里巴巴最新开源的项目,核心定位是“一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”
为什么叫Nacos
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
Nacos能做什么
Nacos核心提供两个功能:服务注册与发现,动态配置管理。
-
服务注册与发现
Nacos提供基于DNS和基于RPC的服务发现,即能被用来支持https/http的服务注册与发现,也支持RPC如dubbo的服务注册与发现。
与Dubbo使用的zookeeper相比而言,两者差异还是比较大的,zookeeper是一种分布式的协调服务,它天生是作为分布式数据一致性场景下的解决方案,所以zookeeper是CP的,它牺牲了可用性来保证一致性,在极端情况下(master选举期间)服务会对外停止,对于服务可用性要求比较高的系统是难以接受的。Nacos是一种去中心化的架构,属于CAP理论里的AP架构,支持最终一致性,在分布式服务发现与注册场景下具有很不错的性能。目前dubbo官方也支持使用Nacos代替zookeeper。
-
动态配置服务
与SpringCloud config 和 SpringCloud Bus类似,Nacos的动态配置服务更加灵活与简便,不需要重启服务可以做到配置实时生效,非常适合“配置优先”的服务开发。
Nacos就是注册中心+配置中心的组合
Nacos 生态
Nacos 无缝支持一些主流的开源生态,如下图:
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易,它能很方便的和SpringCloud、K8S、Dubbo、gRPC、lstio一起使用。
安装Nacos
官方地址
- 官网
- 官方仓库
- 官方文档
安装方法
Nacos 支持三种部署模式:单机模式、集群模式和多集群模式,Nacos默认将数据存储在自带的嵌入式数据库
derby
里面,支持mysql
数据库,如果部署集群的话必须要使用mysql
来保存数据,以保证统一的数据源。因为主要为了测试Nacos的注册中心和配置中心的功能,我这边部署单机模式并使用derby数据库。
前提环境
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- Maven 3.2.x+;下载 & 配置。
方式一 源码安装
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
方式二 发行包安装
官方仓库提供了发行包下载,可以从 版本库中下载nacos-server-$version.zip
/nacos-server-$version.tar.gz
包,解压后,在包目录下的bin文件夹中有可执行脚本运行即可。
方式三 Docker安装
除了以上两种方式安装docker以外,还可以使用docker的方式安装
docker run -tid --env MODE=standalone --name nacos -p 8848:8848 nacos/nacos-server
MODE
是指定运行模式,有cluster模式/standalone模式
安装完成之后,访问http://localhost:8848/nacos/index.html即可打开nacos的web管理界面
Nacos作为注册中心
根项目配置
使用SpringCloud alibaba 需要在
dependencyManagement
中添加相应配置,因为我这里是多模块开发,所以将dependencyManagement
添加到根pom文件中。
org.springframework.boot
spring-boot-dependencies
2.2.2.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR1
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
服务生产者
依赖
...
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
...
配置文件
我们将项目端口配置为
9001
,并配置nacos注册中心地址,以及暴露端点。
server:
port: 9001
spring:
application:
name: nacos-provide-userinfo
cloud:
# nacos 配置
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 配置nacos地址
#暴露端点
management:
endpoints:
web:
exposure:
include: '*'
测试接口
@RestController
public class EchoController {
@Value("${server.port}")
String serverPort;
@GetMapping("/echo")
public String echo(){
return "Hello serverPort : "+serverPort+" uuid :"+ UUID.randomUUID().toString();
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvideUserInfo9001 {
public static void main(String[] args) {
SpringApplication.run(NacosProvideUserInfo9001.class,args);
}
}
启动后,再次打开nacos管理界面中
服务管理
下的服务列表
我们已经可以看到服务已经注册成功了。我们以上面这个服务为模板,再建立一个端口为9002
的服务
服务消费者
依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
配置文件
server:
port: 9091
spring:
application:
name: nacos-consume-useradmin
cloud:
# nacos 配置
nacos:
discovery:
server-addr: 127.0.0.1:8848
RestTemplate注入
Nacos集成了Ribbon,RestTemplate需要添加
@LoadBalanced
开启负载均衡功能。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced // 没有加这个的话没有办法使用服务名来调用接口
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
测试接口
@RestController
@RequestMapping("/consume")
public class UserAdminController {
@Resource
RestTemplate restTemplate;
String URL_PREFIX = "http://nacos-provide-userinfo";
@GetMapping("/echo")
public String getUser(){
return restTemplate.getForObject(URL_PREFIX+"/echo", String.class);
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumeUserAdmin9091 {
public static void main(String[] args) {
SpringApplication.run(NacosConsumeUserAdmin9091.class,args);
}
}
启动后查看管理界面,可以看到消费者服务也已经注册进入的注册中心了。
请求消费者
/consume/echo
的时候,消费者会去调用生产者的服务,因为nacos集成了ribbon
,所以自带负载均衡功能,会根据一定算法来选择注册中心上的服务实例。
作为配置中心
依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
配置文件
注意,这里是创建
bootstrap.yml
,这个配置⽂件的作⽤是,先到配置中⼼加载配置,然后加载到application.yml
中。
application.yml
是用户级的资源配置项。
bootstrap.yml
是系统级的,优先级比application.yml
更高。
-
Bootstrap.yml
server: port: 99 spring: application: name: nacos-config-client # 这个名称涉及到远程配置文件的名称 cloud: # nacos 配置 nacos: discovery: server-addr: 127.0.0.1:8848 #注册中心地址 config: server-addr: 127.0.0.1:8848 # nacos 作为配置中心地址 file-extension: yaml # 指定配置文件的格式
-
Application.yml
spring: profiles: active: dev # 表示开发环境
测试接口
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return configInfo;
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClient99 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClient99.class,args);
}
}
管理平台配置
新建配置文件
打开Nacos管理界面,选择 配置管理
-->配置列表
,点击列表右上角的 ➕
的图标
nacos规定了Data ID的设定规则,让服务能更加方便的去寻找自己的配置,默认的Data ID的规则是:
${prefix}-${spring.profile.active}.${file-extension}
- prefix
默认就是当前服务的服务名称(spring.application.name)
也可以通过spring.cloud.necos.config.prefix
配置- spring.profile.active
就是我们在application.yml中指定的,当前是开发环境还是测试等环境
这个可以不配置,如果不配置,那么前⾯的 - 也会没有- file-extension
就是当前⽂件的格式(后缀),⽬前只⽀持yml和propertie
上面我们配置的应用名称是nacos-config-client
,环境配置的是dev
,文件格式是 yaml,所以Data ID是nacos-config-client-dev.yaml
,注意是yaml
,而不是yml
。
添加完成之后我们可以看到配置文件已经创建成功了。
配置完成后,我们启动服务,服务如果启动成功说明配置正确了,测试下:
➜ ~ curl http://localhost:99/getConfigInfo
Here is dev,version=1.0% ➜ ~
修改配置
我们测试下更新配置文件是否会马上生效,所以我们修改配置文件
配置文件可以查看 历史版本 ,每次修改也会给出对比图。
不要重启nacos-config-client 服务,再次测试接口
➜ ~ curl http://localhost:99/getConfigInfo
Here is dev,version=2.0% ➜ ~
我们发现更新配置无需手动动态刷新配置,相比较起springcloud config 和 bus的配合动态刷新来说,nacos更加的灵活、方便。
数据隔离
Nacos作为配置中心的时候,我们看到了可以感觉服务的环境来选择不同的配置文件,在Nacos的设计中,我们也可以通过Namespace、Group来做数据的隔离,这里不做赘述,总之,在微服务这些框架里面,Nacos绝对是非常好用的。