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就是微服务的实例。