Spring Cloud Alibaba Nacos实战笔记

概述

Nacos,一款服务发现、配置管理工具,诞生于微服务尤其是Spring Cloud微服务框架大行其道时,相当于Spring Cloud Eureka + Spring Cloud Config。无论是单机版还是集群版,都推荐使用MySQL作为存储。MySQL安装请看:CentOS 8安装MySQL8记录

Nacos支持三种部署模式

  • 单机模式:用于测试和单机试用
  • 集群模式:用于生产环境,确保高可用
  • 多集群模式:用于多数据中心场景

安装

单机版

Windows版本

GitHub Release页面可以获知当前最新发布版本,并下载安装包。Nacos配置信息等数据默认存储到内嵌数据库Derby中。实战中一般会使用其他数据库。本地MySQL版本是5.5.57,在创建数据表config_info时报错:Invalid default value for 'gmt_create'
在这里插入图片描述
猜测是版本兼容问题。在控制台console下执行如下SQL语句报错:
在这里插入图片描述
确实是版本兼容问题。Nacos1.4.1,默认支持MySQL 8版本,不向下兼容低版本MySQL。由于并不知道nacos哪个版本默认支持MySQL5,或Nacos版本发布日志找起来很麻烦。另一方面也推荐开发环境使用较新版本的工具。升级MySQL版本。

MySQL下载地址下载安装8.0即可。

编辑文件,
Ctrl + R,全文搜索替换
CREATE TABLE替换为CREATE TABLE IF NOT EXISTS

use nacos;

12张数据表;

application.properties配置数据库

编辑startup.cmd文件,找到MODE,更新如下:

rem set MODE="cluster"
set MODE="standalone"

双击startup.cmd文件启动,打开http://localhost:8848/nacos/,默认的用户名密码为 nacos/nacos,

如果双击cmd文件,控制台输出报错信息:

Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up
com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed

大意是连接失败,MySQL服务已经启动,重试解决问题。

问题:如何安装为服务?

Linux安装

参考
wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz

http://192.168.20.145:8848/nacos

https://www.freesion.com/article/4748443321/

cd /root
tar zxvf nacos-server-1.4.1.tar.gz
mv nacos /usr/local/nacos

编写开机启动文件:
vim /lib/systemd/system/nacos.service
文件内容:

[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
# -m standalone表示作为单机启动,不加表示集群启动
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

使用内置数据库安装:
sh startup.sh -p embedded

MySQL导入nacos-mysql.sql脚本:

create database nacos;
use nacos;
source /usr/local/nacos/conf/nacos-mysql.sql;

先进行文件生效配置
systemctl daemon-reload
设置为开机启动:
systemctl enable nacos.service
启动nacos服务:systemctl start nacos.service
如果启动报错:
Job for nacos.service failed because the control process exited with error code. See "systemctl status nacos.service" and "journalctl -xe" for details.
执行命令:journalctl -xe
输出关键信息:which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
执行命令:whereis javac
输出:javac: /usr/local/java/bin/javac
创建软链接:ln -s /usr/local/java/bin/javac /usr/bin/javac

启动成功后进行查看:
systemctl status nacos.service
停止服务:
systemctl stop nacos.service

集群版

集群模式和扩容是一样的,可通过Nginx转发到多个节点,最前面挂一个域名即可:
在这里插入图片描述
可以只安装并创建一个数据库,三台Nacos节点都指向同一个MySQL库(注),三个节点全部编辑

vim /lib/systemd/system/nacos.service
[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
# -m standalone表示作为单机启动,不加表示集群启动
ExecStart=/usr/local/nacos/bin/startup.sh
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

配置application.properties文件:

# 指定数据源为MySQL
spring.datasource.platform=mysql
# 数据库实例数量
db.num=1
db.url.0=jdbc:mysql://<ip>:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=<password>

网上说,针对application.properties文件,需要对三台机器都是相同的更改?但实际安装下来,只在安装有MySQL那台机器的节点更改此配置。

三台机器全部配置cluster.conf文件:
切换到目录:cd /usr/local/nacos/conf/
复制:cp cluster.conf.example cluster.conf
编辑:vim cluster.conf

# 不代表安装过程中的真实IP
192.168.12.203:8848
192.168.12.204:8848
192.168.12.205:8848

切换到bin目录:cd /usr/local/nacos/bin/

执行启动脚本,默认就是集群模式,不需要加任何参数:sh startup.sh
或者./startup.sh

查看安装日志:
cat /usr/local/nacos/logs/start.out
在这里插入图片描述
成功一半。下面配置Nginx:

切换目录:cd /etc/nginx/conf.d
新建文件:vim nacos.conf
添加如下配置信息:

upstream nacos {
  server centos170:8848;
  server centos203:8848;
  server centos113:8848;
}

server {
  listen 80;
  server_name  centos170;
  location /nacos/ {
    proxy_pass http://nacos/nacos/;
  }
}

集群搭建成功后,可以通过:http://centos170/nacos访问。

拓展

上面提到3台Nacos指向同一个MySQL节点。可以假想一下:如果三台节点都安装并MySQL数据库,然后每个Nacos节点分别指向本机的MySQL节点,有什么优势和劣势

MySQL的高可用,高可用MySQL搭建方案有很多,不同方案搭建方式不同:

服务发现Discovery

引入依赖:

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

即注册中心,Nacos的服务发现,有主动拉取和推送两种模式。拉模型:

List<Instance> getAllInstances(String serviceName) throws NacosException;
List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;
Instance selectOneHealthyInstance(String serviceName) throws NacosException;

Nacos 提供三个同步拉取服务的方法:

  1. 查询所有注册的实例
  2. 只查询健康且上线的实例
  3. 获取一个健康且上线的实例。

一般情况下,订阅端并不关心不健康的实例或权重设为 0 的实例,但是也不排除一些场景下,有一些运维或者管理的场景需要拿到所有的实例。上述 Nacos 实例中有一个 weight 字段,便是作用在此处的selectOneHealthyInstance接口上,按照权重返回一个健康的实例。一般的 RPC 框架都有自身配套的负载均衡策略,很少会由注册中心提供此功能。

除了主动查询实例列表,Nacos还提供订阅模式来感知服务下实例列表的变化,包括服务配置或者实例配置的变化。可以使用下面的接口来进行订阅或者取消订阅:

void subscribe(String serviceName, EventListener listener) throws NacosException;
void unsubscribe(String serviceName, EventListener listener) throws NacosException;

在实际的服务发现中,订阅接口尤为重要。消费者启动时,一般会同步获取一次服务信息用于初始化,紧接着订阅服务,实现服务发现。

配置中心Config

引入依赖:

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置文件优先级(由高到低):bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

在Nacos后台管理页面新增一个配置文件时,Data ID的完整格式如下:${prefix}-${spring.profiles.active}.${file-extension}

  • prefix默认为spring.application.name的值,可通过配置项spring.cloud.nacos.config.prefix来配置;
  • spring.profiles.active即为当前环境对应profile,注意当spring.profiles.active为空时,对应的连接符-也将不存在,Data ID拼接格式变成${prefix}.${file-extension}
  • file-exetension为配置内容的数据格式,可通过配置项spring.cloud.nacos.config.file-extension来配置,目前只支持 properties 和 yaml 类型。

几个概念:

  • 命名空间:Namespace,用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间;
  • 配置分组:Group,用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
  • 配置集:Data ID,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集

配置动态刷新

在使用Nacos后,如果不能实现配置的热更新,而必须要重启应用程序才能生效,那引入Nacos就会感觉不是很必要。

使Nacos支持配置热更新的方式:
Bean类上增加@RefreshScope注解+@Value("${my.nacos.config: johnny}")

配置共享

当配置越来越多时,就会发现有很多配置是重复的,此时即可考虑将公共配置文件提取出来。即所谓的配置共享。根据是否隶属于一个微服务的配置信息,又包括如下两种:

同一个微服务的不同环境之间共享配置

新增一个没有profile的配置文件,然后把所有环境的公共配置键值对放到此配置文件中,其他环境的配置文件将会继承此文件,再追加每个环境不一样的配置信息即可。

不同微服务中间共享配置

配置越来越多后,会发现不同微服务之间也有一些配置信息是重复的。此时可以新增一个all-service.yaml文件,然后修改bootstrap.yaml

spring:
  cloud:
    nacos:
      config:
        shared-dataids: all-service.yaml # 配置要引入的配置
		refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置

多环境配置

Nacos提供Namespace、Group、Data ID来确定一个配置文件。因此,实现多环境配置的方案也有三种:

  1. 用命名空间来区分不同的环境,一个命名空间对应一个环境;
  2. 用配置组来区分不同的环境,命名空间用默认的public即可,一个组对应一种环境;
  3. 用配置集ID名称来区分不同的环境,命名空间和组用默认的即可,通过文件命名来区分;

利用 Namespace 区分环境

启动参数:-Dspring.cloud.nacos.config.namespace=

利用 Group 来区分环境

命名空间用默认的public,启动参数:-Dspring.cloud.nacos.config.group=

利用 Data ID 命名 来区分环境

利用Data ID命名来区分环境,命名空间和组默认即可。启动参数:-Dspring.profiles.active=dev

总结:

  1. 用 Data ID 区分环境,简单,但是每个项目要创建4个配置文件,随着项目的增多,都在一个命名空间下回显得很混乱,查找起来也不是很方便,而且不利于做权限控制
  2. 用Group区分,问题也是一样的
  3. 最好用Namespace区分环境,且有利于做权限控制

参考

posted @ 2021-05-26 23:14  johnny233  阅读(66)  评论(0编辑  收藏  举报  来源