Nacos 服务注册配置中心(AP、CP)

Posted by Beyonderwei on 2021-01-12
Words 1.5k and Reading Time 6 Minutes
Viewed Times

全称:NamingConfigurationService

一、Docker 安装 Nacos

注:nacos 对内存的要求比较大,如果内存不够,可能会导致start不起来。

  • 拉取镜像后运行(单机版)

    1
    docker run -d -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname --restart always --name my-nacos nacos/nacos-server
  • 访问 http://ip地址:8848/nacos/ 进入Nacos界面,默认用户名和密码均为 nacos (密码可进入后在右上角更改)

  • 当前使用的:用户名 nacos 密码:通用

二、注册到 Nacos

1. 微服务提供方

  • pom依赖(当前2.2.1版本)

    1
    2
    3
    4
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  • yaml配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    spring:
    application:
    name: xxxx
    cloud:
    nacos:
    discovery:
    server-addr: nacosIP地址:8848 #配置Nacos地址
    # 暴露端点
    management:
    endpoints:
    web:
    exposure:
    include: '*'
  • 启动类 照常需要 @EnableDiscoveryClient

2.微服务调用方

由于Nacos实质上包含了Ribbin,因此自带了负载均衡。

  • pom依赖

    1
    2
    3
    4
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  • 配置文件yaml:

    1
    2
    3
    4
    5
    6
    7
    spring:
    application:
    name: xxx
    cloud:
    nacos:
    discovery:
    server-addr: nacosIP地址:8848 #配置Nacos地址
  • 配置类(RestTemplate) 需要加 @Loadbalance

    1
    2
    3
    4
    5
    6
    7
    8
    @Configuration
    public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
    return new RestTemplate();
    }
    }
  • 启动类:加 @EnableDiscoveryClient

  • controller直接注入依赖使用

    1
    2
    @Resource
    private RestTemplate restTemplate;

三、AP、CP模式切换

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

四、Nacos 作为配置中心

微服务从配置中心加载配置

  • pom依赖

    1
    2
    3
    4
    5
    <!--nacos-config-->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  • yaml配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # bootstrap 配置
    spring:
    application:
    name: 微服务名
    cloud:
    nacos:
    discovery:
    server-addr: Nacos IP:8848 #服务注册中心地址
    config:
    server-addr: Nacos IP:8848 #配置中心地址
    file-extension: yaml #指定yaml格式的配置
    1
    2
    3
    4
    # application.yaml
    spring:
    profiles:
    active: dev
  • 启动类添加 @EnableDiscoveryClient 注解

  • controller:添加注解 @RefreshScope 用于配置刷新。

五、在Nacos上添加配置

1. Data ID 命名规则

${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

  • prefix默认为spring.application.name的值
  • spring.profile.active既为当前环境对应的profile,可以通过配置项spring.profile.active 来配置
  • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension配置
  • 举例:xxx-dev.yaml

2. 添加配置

配置管理 -> 配置列表 -> Data ID -> YAML

注:要使用默认的Group,否则需要配置才行,不然无法加载。

3. Nacos 自带动态刷新

  • 修改Nacos 上的配置后会自动刷新。

六、Nacos 的NameSpace、Group、DataId

一个大型的微服务系统,通常包括开发、测试、生产环境。而每个大的微服务系统还有很多子项目,每个子项目又都会有相应的开发测试生产环境。

  • NameSpace:进行开发、测试、生产环境的隔离
  • Group:用于区分大型微服务的每个子项目
  • Data Id:用于区分每个子项目的开发、测试和生产环境。

1. NameSpace

  • 在Nacos上创建命名空间,如dev,将得到命名空间ID

  • 将命名空间加入配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    spring:
    application:
    name: xxx
    cloud:
    nacos:
    discovery:
    server-addr: IP:8848 #服务注册中心地址
    config:
    server-addr: IP:8848 #配置中心地址
    file-extension: yaml #指定yaml格式的配置
    group: XXX_GROUP
    namespace: namespace ID

    此时工程将加载 namespace ID 的 XXX_GROUP 的 xxx-dev.yaml 配置文件(若DataID按照3中的配置)。

2. Group

通过在配置中指定不同的Group来加载不同分组下的配置

1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: xxx
cloud:
nacos:
discovery:
server-addr: Nacos IP:8848 #服务注册中心地址
config:
server-addr: Nacos IP:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
group: XXX_GROUP

3. Data ID

通过指定如下配置加载不同环境下的配置(dev、test、prod)

1
2
3
spring:
profiles:
active: dev

七、Nacos 的数据持久化

Nacos默认使用内嵌的 Derby 数据库,但这样无法保证集群情况下的数据一致性,的0.7版本之后,支持了MySQL的配置数据持久化。

路径:请求 -> Nginx集群 -> Nacos集群 -> MySQL集群

1. Nacos 切换到MySQL数据库

注:nacos 1.3.1版本之后支持MySQL8。

  • 找到SQL脚本,直接到数据库执行(下载nacos-server-1.4.1.zip 解压后 打开nacos/conf/nacos-myysql.sql)

  • 给sql脚本添加下面两句后直接在数据库执行。

    1
    2
    CREATE DATABASE nacos_config;
    USE nacos_config;
  • 配置Nacos,复制官网配置,使用MySQL数据库,根据自己的数据库信息修改放到对应文件后重启Nacos,即可切换。

    docker exec -it 容器ID bash /home/nacos/conf/application.propertise

    1
    2
    3
    4
    5
    6
    spring.datasource.platform=mysql

    db.num=1
    db.url.0=jdbc:mysql://IP:3307/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=xxxxxxxx
  • 重启容器,此时Nacos的数据库便替换为了MySQL。

八、Nacos集群

1. Nacos 服务集群

  • 按照一(Docker 安装 Nacos) 方式在三台服务器启动三个Nacos服务,

  • 在 /home/nacos/conf/ 下新建 cluster.conf

  • 输入以下内容(各个Nacos容器的IP和端口)

    1
    2
    3
    42.192.52.xxx:8848
    47.102.130.xxx:8848
    47.104.220.xxx:8848
  • 添加后重启三个服务。

2. Nginx 配置(集群)

路径:请求 -> Nginx集群 -> Nacos集群 -> MySQL集群

​ 通常Nginx也集群配置(这里没有采用集群)

  • Docker启动Nginx容器前,Nginx的default.conf 配置如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    location / {
    proxy_pass http://cluster;
    }
    location /api {
    proxy_pass http://cluster;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  • Docker启动Nginx容器前,Nginx的 nginx.conf 配置如下

    1
    2
    3
    4
    5
    6
    7
    http {
    upstream cluster {
    server 42.192.52.xxx:8848;
    server 47.102.130.xxx:8848;
    server 47.104.220.xx:8848;
    }
    }
  • 访问:http://ip:8848/nacos/#/login 即可访问到Nacos,均衡轮询访问Nacos集群。

九、微服务注册到Nacos集群

  • yaml配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    spring:
    application:
    name: 微服务名
    cloud:
    nacos:
    discovery:
    server-addr: nginx IP:8848 #配置Nacos地址

    management:
    endpoints:
    web:
    exposure:
    include: '*'
  • 启动类添加常用注解 @EnableDiscoveryClient

  • 可在服务列表看到注册的微服务。


本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00