Nacos注册配置中心
简介
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
安装
使用Docker Compose
docker-compose.yml文件
version: "3.8"
services:
nacos1:
hostname: nacos1
container_name: nacos1
image: 'nacos/nacos-server:latest'
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs
- ./config/nacos1/application.properties:/home/nacos/conf/application.properties
ports:
- "8848:8848"
- "9848:9848"
- "9555:9555"
env_file:
- ./env/nacos-hostname.env
nacos2:
hostname: nacos2
image: 'nacos/nacos-server:latest'
container_name: nacos2
volumes:
- ./cluster-logs/nacos2:/home/nacos/logs
- ./config/nacos2/application.properties:/home/nacos/conf/application.properties
ports:
- "8849:8848"
- "9849:9848"
env_file:
- ./env/nacos-hostname.env
nacos3:
hostname: nacos3
image: 'nacos/nacos-server:latest'
container_name: nacos3
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs
- ./config/nacos3/application.properties:/home/nacos/conf/application.properties
ports:
- "8850:8848"
- "9850:9848"
env_file:
- ./env/nacos-hostname.env
ENV配置文件
#nacos dev env
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=root
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
在application.yml中的配置
spring:
application:
name: cloud-service
cloud:
nacos:
discovery:
server-addr: nacos-server:8848
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 与主端口的偏移量 描述 9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 9849 1001 服务端gRPC请求服务端端口,用于服务间同步等 9848=8848+1000/9849=8848+1001
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。原文地址
在使用Nginx反代Nacos时,由于我使用了域名,但是在Nginx的Stream模块中貌似并不支持配置域名,于是换成了Nginx使用http2代理Nacos的8848端口,另外使用HaProxy来代理gRPC需要的端口,HaProxy配置如下:
frontend nacos_cluster1 bind :1080 mode tcp log global maxconn 8000 acl domain_nacos hdr_beg(host) -i nacos.com #-i指定匹配域名,如果匹配则分发给后端domain_nacos use_backend nacos_cluster_nodes if domain_nacos #设置每个后端使用哪个服务器集群 default_backend nacos_cluster_nodes backend nacos_cluster_nodes1 mode tcp server nacos-a nacos1:9848 check server nacos-b nacos2:9848 check server nacos-c nacos3:9848 check frontend nacos_cluster1 bind :1081 mode tcp log global maxconn 8000 acl domain_nacos hdr_beg(host) -i nacos.com #-i指定匹配域名,如果匹配则分发给后端domain_nacos use_backend nacos_cluster_nodes if domain_nacos #设置每个后端使用哪个服务器集群 default_backend nacos_cluster_nodes backend nacos_cluster_nodes2 mode tcp server nacos-a nacos1:9849 check server nacos-b nacos2:9849 check server nacos-c nacos3:9849 check
Nacos支持AP和CP模式的切换
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用AP还是CP?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并且能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如SpringCloud和Dubbo服务,都适合用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
Nacos作为服务配置中心
Nacos和SpringCloudConfig一样,在项目初始化的时候,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中的配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。
在
spring-cloud-alibaba
2021.0.1.0
版本之后,默认使用spring.config.import
来配置,取消了bootstrap.yml的支持,如果还想继续使用,可以在pom里面添加依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.1</version> </dependency>
使用
spring.config.import
:spring: profiles: active: dev application: name: cloud-service cloud: nacos: discovery: server-addr: nacos-server:8848 config: server-addr: ${spring.cloud.nacos.discovery.server-addr} file-extension: yml #指定配置文件为yml格式 prefix: ${spring.application.name} config: import: - nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
在bootstrap.yml中的配置
spring:
application:
name: cloud-service
cloud:
nacos:
discovery:
server-addr: nacos-server:8848
config:
server-addr: nacos-server:8848
file-extension: yaml #指定配置文件为yaml格式
为什么Nacos要设计NameSpace+Group+DataID
最外层的NameSpace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
NameSpace默认为public,Group默认为DFAULT_GROUP,Cluster默认是DEFAULT。
- Nacos默认的命名空间是public,Namespace主要用来实现隔离。比如现在有三个开发环境:开发、测试、生产,那么就可以创建三个Namespace,不同的Namespace之间是隔离的。
- Group默认是DFAULT_GROUP,Group可以把不同的服务划分到同一个分组里面去。
- Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是Default,Cluster是对指定微服务的虚拟划分。比如说为了容灾,将Service分别部署在两个不同的地区机房,这时就可以根据地区给集群划分名称,比如北京(Beijing)与上海(Shanghai),还可以尽量让同一个机房的微服务互相调用,以提升性能。
- Instance就是微服务的实例。