【微服务专题】深入理解与实践微服务架构(五)之整合Nacos注册中心

703 阅读17分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第5篇文章,点击查看活动详情

首先需要下载和安装Nacos组件的二进制包,才能正常使用Nacos作为注册中心。

Nacos一共有三种启动方式,分别为:单机、集群和持久化配置到Mysql的启动

准备环境

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行 Nacos,还需要为此配置 Maven 环境,请确保是在以下版本环境中安装使用:

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+ (下载 & 配置);
  • Maven 3.2.x+ (下载 & 配置);

必须具备上面的环境要求,比如:arm64就不支持nacos最新版本(测试的是nacos 1.1.4),需要手动编译

下载Nacos

详细步骤(初学者建议来一遍):

官网下载地址:github.com/alibaba/nac…

选择一个最新的稳定版本:

image-20220423160022829

其中zip是Windows版本,tar.gz是Linux版本。

安装Nacos

下载完成之后,解压,进入目录,如下所示:

image-20220423160254765

进入/bin文件夹下点击startup.cmd启动:

image-20220423160411817

启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

image-20220423160918449

说明:

[1] startup是启动脚本,shutdown是关闭脚本。 [2] windows下使用cmd脚本,在Linux下使用sh脚本。

[3] 配置文件在/conf目录下,默认启动端口是8848.

快速下载安装步骤

  1. 下载nacos-server:github.com/alibaba/nac…
  2. 安装:解压缩后,进入到bin文件夹中,在cmd中执行如下命令可以进行启动:
startup -m standalone

启动Nacos

将这个命令写成cmd运行的脚本startup-standalone.cmd,内容为上面的命令(推荐)。

或者 将bin/startup.cmd 里面set MODE="cluster" 修改为set MODE="standalone"

  1. 启动cmd文件,访问 http://localhost:8848/nacos/
  2. 使用默认的nacos/nacos登陆。

image-20220423161621104

注册为Windows服务

安装的确完成了,但是在windows上每次启动都需要弹出cmd窗口,占用桌面空间。我们可以将nacos注册为windows服务,运行在后台,这样就看不到cmd窗口了,结束服务就可以kill掉nacos进程。

我们有三种方式注册windwos服务,分别是:修改注册表、cmd命令注册和第三方工具快速注册。这里我们直接采用开源工具一键注册windows服务,更加的快速方便(这种轮子可以不用去造)。、

下载 Windows Service Wrapper工具

这是利用xml配置文件将cmd一键注册为windows系统服务的,像这种工具还有 nssm

下载地址:github.com/winsw/winsw…

编写nacos-service.xml配置文件

  • 将WinSW-X64.exe(或WinSW.NET4.exe)重命名为nacos-service.exe并放在nacos的bin目录下;

  • 创建配置文件nacos-service.xml,并添加服务配置(注意: 服务名称不要为中文):

    <?xml version="1.0" encoding="UTF-8" ?>
    <service>
      <!-- 唯一服务ID-->
      <id>nacos</id>
      <!-- 显示服务的名称 -->
      <name>Nacos Service</name>
      <!-- 服务描述 -->
      <description>Nacos服务</description>
      <!-- 日志路径 -->
      <logpath>D:\DevCenter\Spring Cloud Alibaba\Nacos\Nacos 1.4.1\nacos\bin\logs</logpath>
      <!-- 日志模式 -->
      <logmode>roll</logmode>
      <!-- 可执行文件的命令 -->
      <executable>D:\DevCenter\Spring Cloud Alibaba\Nacos\Nacos 1.4.1\nacos\bin\startup-standalone.cmd</executable>
      <!-- 停止可执行文件的命令 -->
      <stopexecutable>D:\DevCenter\Spring Cloud Alibaba\Nacos\Nacos 1.4.1\nacos\bin\shutdown.cmd</stopexecutable>
    </service>
    

xml 配置参数列表:

  • id:用于标识Windows内服务的ID,这个值在系统中安装的所有服务中必须是唯一的,并且应完全由字母数字字符组成。
  • name:服务的显示名称,可以包含空格和其他字符,不过名称不宜太长。
  • description:服务的介绍描述,它会将显示在Windows服务管理器中。
  • executable:指定要启动的可执行文件,文件路径可以是绝对路径,也可以只指定可执行文件名称并从中搜索PATH
  • startmode:该元素指定Windows服务的启动模式,默认值是Automatic,它可以是以下值之一:Boot,System,Automatic或Manual。
  • delayedAutoStart:如果Automatic定义了启动模式,则此布尔选项启用延迟启动模式。请注意,此启动模式将不适用于早于Windows 7和Windows Server 2008的旧Windows版本。
  • depend:指定此服务依赖的其他服务的ID,可以使用多个元素来指定多个依赖项。比如:<depend>Eventlog</depend><depend>W32Time</depend>
  • logging:此项是可选的,可用于设置日志路径, 比如:<logpath>日志路径</logpath>
  • argument:指定要传递给可执行文件的参数,Winsw会在必要时用引号将每个引号引起来,因此请勿在引号中加引号,以避免产生双引号。
  • stopargument/stopexecutable:用于指定停止参数和停止时执行的操作。

注册Nacos服务

nacos-service.exe install

查看Windows服务

win + R打开运行,输入以下命令打开windows服务列表进行查看:

services.msc

卸载Nacos服务

除了注册服务,另外还有对应的卸载服务:

nacos-service.exe uninstall

到此,服务注册完成。

配置Mysql数据库

配置数据库其实是将Derby数据库切换到Mysql数据库,也可以称为配置持久化操作。

可以不配置数据库吗?

可以的。 在nacos 0.7版本之前,在单机模式时nacos使用嵌入式数据库 Apache Derby 来存储数据(内嵌的数据库会随着 Nacos 一起启动,无需额外安装),因此配置Mysql数据库一般是用于部署情况下(官方文档也是在部署情况下的配置)。

为什么要使用mysql数据库呢?

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  • 1.安装数据库,版本要求:5.6.5+

  • 2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql

  • 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。

    # nacos数据库连接配置(row-33)
    #*************** Config Module Related Configurations ***************#
    ### If use MySQL as datasource:
    spring.datasource.platform=mysql
    ​
    ### Count of DB:
    db.num=1### Connect URL of DB:
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&serverTimezone=UTC
    db.user.0=root
    db.password.0=123456
    

注意:默认情况下,Nacos 连接 MySQL 5.6.5+ 版本,如果使用 MySQL 8.X 版本,则需要下载对应的新版本的 JDBC 驱动。Nacos 提供插件机制,允许我们无需修改源码,直接可以支持,操作步骤如下:

# 在Nacos安装目录下,创建插件目录
# mkdir -p plugins/mysql
mkdir plugins && cd plugins && mkdir mysql
​
# 下载 MySQL 8.X JDBC 驱动
cd plugins/mysql
# wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar
curl -O https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar

如果出现启动Nacos后出现数据库连接不上的情况,大概是springboot配置文件加载顺序的问题!

解决方法

将nacos/conf下的application.properties改为bootstrap.properties ,因为springboot中bootstartp加载顺序优先于application。

事实是,上面的方法不管用

新方法直接下载Nacos 1.4.1项目Release,更改mysql依赖版本后,重新进行编译

curl -O https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.zip

然后下载依赖,在父模块中执行mvn clean和mvn compile,最后执行打包命令:

mvn -Prelease-nacos -Dmaven.test.skip=true -Dcheckstyle.skip=true -Drat.skip=true -Dpmd.skip=true clean install -U

生成的target包在distribution模块中。

但是还是连接失败,并且查看nacos1.4.1源码中使用的mysql-connector-java依赖版本,发现是8.0.16,说明本身源码以及支持mysql8.0了

最后,发现是JDBC连接中加了useSSL=true参数的问题,导致连接失败。

最终解决:

# 不加useSSL=true或者useSSL=false
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&serverTimezone=UTC

另外,因此本身就不是依赖的问题,那么其实nacos安装目录下的plugins/mysql也可以删除了。

另外,电脑开机重启后发现nacos服务启动失败,出现mysql连接失败后可以在navicat中输入select version() from dual;来查询mysql-serer版本,然后下载合适的驱动作为nacos插件。一般重启nacos服务即可解决。

外部数据库启动Nacos

这种方式是配置了外部MySQL数据库作为Nacos配置存储数据库,而替换了内嵌数据库Derby的启动方式。

将bin/startup.cmd 里面set MODE="cluster" 修改为set MODE="standalone"

  1. 启动cmd文件,访问 http://localhost:8848/nacos/
  2. 使用默认的nacos/nacos登陆。

测试使用

打开地址 http://localhost:8848/nacos ,输入nacos/nacos登录,然后点击命名空间 -> 创建命名空间

image-20220427020234523

然后,因为前面配置连接了mysql8.0数据库服务器,所以启动nacos后是会直接建立起mysql数据库的连接的。

image-20220428203229434

然后,可以看到配置成功写到了mysql数据库中。

image-20220428203255323

数据库有没有配置信息是检验配置mysql是否成功的依据,如果mysql数据库写入了数据,则说明mysql成功连接;否则,则说明mysql连接失败。

如果启动nacos失败并且报mysql数据库连接的错误,则说明已经开启了mysql连接,但是mysql连接错误(可能是参数也可能是jar包依赖,需要去排查);如果正常启动nacos但是mysql数据库没有写入数据,则说明没有开启mysql连接,还是使用的默认的Derby数据库。

Docker-Compose方式启动

首先下载安装Docker和Docker-Compose,然后编写Nacos注册中心yaml配置文件:

nacos.yaml(或nacos-standalone-mysql.yaml)

version: "2"
services:
  nacos:
    image: nacos/nacos-server
    container_name: nacos
    environment:
      MODE: standalone
      PREFER_HOST_MODE: ip
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: 你的数据库地址
      MYSQL_SERVICE_DB_NAME: nacos_config(创建一个数据库,执行下面的数据库脚本添加数据库表)
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_USER: root
      MYSQL_SERVICE_PASSWORD: 你的数据库密码
      JVM_XMS: 256m
      JVM_XMX: 256m
    volumes:
      - ./logs/:/home/nacos/logs
    ports:
      - 18828:8848
    restart: always

然后在Linux下安装MySQL 5.7.x数据库,执行Nacos的config目录下的nacos-mysql.sql脚本,内容如下:

-- ----------------------------
-- Table structure for config_info
-- ----------------------------
DROP TABLE IF EXISTS `config_info`;
CREATE TABLE `config_info`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content',
  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `gmt_modified` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '修改时间',
  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user',
  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `c_use` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `effect` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `c_schema` text CHARACTER SET utf8 COLLATE utf8_bin NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uk_configinfo_datagrouptenant`(`data_id`, `group_id`, `tenant_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 93 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for config_info_aggr
-- ----------------------------
DROP TABLE IF EXISTS `config_info_aggr`;
CREATE TABLE `config_info_aggr`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'datum_id',
  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '内容',
  `gmt_modified` datetime(0) NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uk_configinfoaggr_datagrouptenantdatum`(`data_id`, `group_id`, `tenant_id`, `datum_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '增加租户字段' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for config_info_beta
-- ----------------------------
DROP TABLE IF EXISTS `config_info_beta`;
CREATE TABLE `config_info_beta`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name',
  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `gmt_modified` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '修改时间',
  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user',
  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uk_configinfobeta_datagrouptenant`(`data_id`, `group_id`, `tenant_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info_beta' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for config_info_tag
-- ----------------------------
DROP TABLE IF EXISTS `config_info_tag`;
CREATE TABLE `config_info_tag`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name',
  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content',
  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `gmt_modified` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '修改时间',
  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user',
  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uk_configinfotag_datagrouptenanttag`(`data_id`, `group_id`, `tenant_id`, `tag_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info_tag' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for config_tags_relation
-- ----------------------------
DROP TABLE IF EXISTS `config_tags_relation`;
CREATE TABLE `config_tags_relation`  (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`) USING BTREE,
  UNIQUE INDEX `uk_configtagrelation_configidtag`(`id`, `tag_name`, `tag_type`) USING BTREE,
  INDEX `idx_tenant_id`(`tenant_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_tag_relation' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for group_capacity
-- ----------------------------
DROP TABLE IF EXISTS `group_capacity`;
CREATE TABLE `group_capacity`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额,0表示使用默认值',
  `usage` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量',
  `max_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量',
  `gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `gmt_modified` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uk_group_id`(`group_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '集群、各Group容量信息表' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for his_config_info
-- ----------------------------
DROP TABLE IF EXISTS `his_config_info`;
CREATE TABLE `his_config_info`  (
  `id` bigint(64) UNSIGNED NOT NULL,
  `nid` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name',
  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `gmt_modified` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL,
  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `op_type` char(10) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`nid`) USING BTREE,
  INDEX `idx_gmt_create`(`gmt_create`) USING BTREE,
  INDEX `idx_gmt_modified`(`gmt_modified`) USING BTREE,
  INDEX `idx_did`(`data_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 107 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '多租户改造' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for permissions
-- ----------------------------
DROP TABLE IF EXISTS `permissions`;
CREATE TABLE `permissions`  (
  `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `resource` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `action` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  UNIQUE INDEX `uk_role_permission`(`role`, `resource`, `action`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles`  (
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  UNIQUE INDEX `idx_user_role`(`username`, `role`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for tenant_capacity
-- ----------------------------
DROP TABLE IF EXISTS `tenant_capacity`;
CREATE TABLE `tenant_capacity`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额,0表示使用默认值',
  `usage` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量',
  `max_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量',
  `gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `gmt_modified` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uk_tenant_id`(`tenant_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '租户容量信息表' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for tenant_info
-- ----------------------------
DROP TABLE IF EXISTS `tenant_info`;
CREATE TABLE `tenant_info`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `uk_tenant_info_kptenantid`(`kp`, `tenant_id`) USING BTREE,
  INDEX `idx_tenant_id`(`tenant_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'tenant_info' ROW_FORMAT = Compact;
​
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  PRIMARY KEY (`username`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
​
SET FOREIGN_KEY_CHECKS = 1;

然后执行Mysql下的Bash脚本,并且根据是集群还是单机情况修改Nacos启动模式:

export MODE="cluster" 修改为export MODE="standalone"

修改完成后,通过docker-compose启动:

注意:如果是ARM架构的服务器,记得在dockerfile的根目录下执行下面的命令进行编译后再启动:

docker build -t nacos:v1.4.1 .

使用docker-compose启动容器:

# 启动全部容器
docker-compose up -d
​
# 指定配置文件启动容器
docker-compose -f /home/nacos/nacos.yaml up -d
​
# 后台启动
docker-compose -f /home/nacos/nacos.yaml up -d &
​
#守护进程启动
nohup docker-compose -f /home/nacos/nacos.yaml up -d >/dev/null 2>&1 &

执行完成后,通过命令行可以看到Nacos已经启动成功。登录控制台,然后添加配置,去服务器select查询mysql或者Navicate等客户端工具查看配置数据库是否成功写入mysql即可。

Nacos的下载、安装与配置已经完成,下面进行Nacos的项目使用!

使用Nacos实现服务发现

因为我们通过Nacos进行服务发现,从而将服务作为Nacos的一个客户端注册到Nacos服务器。

我们这里创建一个子模块作为服务提供者,测试服务注册功能;然后再创建一个项目作为服务消费者,进行跨服务间远程调用接口来测试服务调用功能。

1. 创建服务提供者子模块

创建子模块service-provider-nacos:

image-20220430232104282

image-20220504032615218

注意:这里如果子模块名字写错误想改,可以尝试:子模块右键重命名 => pom文件内部改名 => Project Struct改名 => target和test文件夹改名 => 外部文件夹改名(前面完成了也不用这一步了)。

2. 添加Nacos依赖

修改pom.xml文件依赖配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-alibaba-starter</artifactId>
        <groupId>com.deepinsea</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
​
    <artifactId>service-provider-nacos</artifactId>
​
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
​
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos客户端-服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!--            <exclusions>-->
<!--                <exclusion>-->
<!--                    <groupId>com.netflix.ribbon</groupId>-->
<!--                    <artifactId>ribbon</artifactId>-->
<!--                </exclusion>-->
<!--            </exclusions>-->
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-LoadBalancer</artifactId>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;配置中心&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;2021以上版本需要引入该jar才能使bootstrap配置文件生效&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-bootstrap</artifactId>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;RPC框架 - 远程过程调用 &ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;spring监控&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-actuator</artifactId>-->
<!--        </dependency>-->
    </dependencies>
​
​
</project>

3. 主启动类服务发现声明

编写主启动类src/main/java/com/deepinsea/ServiceProviderNacosApplication.java

package com.deepinsea;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
​
/**
 * @author deepinsea
 * @date 2022/4/23
 * 服务提供者主启动类
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderNacosApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderNacosApplication.class, args);
    }
​
}

4. 编写服务提供者配置文件

关于properties和yaml,只能说:萝卜青菜,各有所爱吧,都是一样的实现效果。

人习惯阅读方式是从左到右,properties从左到右,而yml是从上到下。yaml格式对齐有严格有求,对齐错了会报错,properties则没有这种顾虑;并且,yml配置文件不支持@PropertySource注解,需要自定义实现。

当然,对于大量的配置而言,yml文件的层次感更强,树形结构的更方便查找配置项。

下面分别给出这两种配置文件的配置方式(选一种就行):

编写配置文件 src/main/resource/application.properties :

# 服务运行端口
server.port=9010
# 服务名称
spring.application.name=service-provider-nacos
# 服务注册地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# 延长超时时间为10s
spring.cloud.inetutils.timeout-seconds=10

编写配置文件 src/main/resource/application.yml:

server:
  # 服务运行端口
  port: 9010
spring:
  application:
    # 服务名称
    name: service-provider-nacos
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: localhost:8848
        # Nacos认证信息
        username: nacos
        password: nacos
        # 注册到 nacos 的指定 namespace,默认为 public
        namespace: public
    inetutils:
      # 延长超时时间为10s
      timeout-seconds: 10

5. 创建服务提供接口

package com.deepinsea.controller;
​
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
/**
 * @author deepinsea
 * @date 2022/4/23
 */
@RestController
@RequestMapping("/provider-nacos")
public class ServiceProviderController {
​
    @GetMapping("/hello")
    public String hello(){
        return "hi, this is service-provider-nacos!";
    }
}

6. 测试服务接口

先运行 startup.cmd -m standalone 编写的cmd文件,启动Nacos服务器;

然后点击"▶"启动 service-provider-nacos 子模块项目,可以看到项目正常启动起来了:

如果更改了子模块项目名,之前运行过(生成了target文件夹),重新运行需要执行mvn clean清空编译文件夹后再次编译。

否则会出现找不到主类的错误!

另外,在父模块的Project Module-> Modules中重新导入一下各子模块的pom.xml配置文件,刷新下xml结构配置。

image-20220501000737916

打开Nacos控制台,查看服务是否注册成功,地址为:http://localhost:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=&pageSize=&pageNo=

image-20220504045310586

可以看到,服务已经注册成功!

但是这里没有配置动态刷新配置(@RefreshScope),因此修改了application.properties配置文件,需要重启nacos服务才能刷新配置。

核心配置文件为bootstarp.properties,优先级最高。

其实这里可以简单测试一下服务调用,可以采用postman或者curl命令测试:

C:\Users\deepinsea>curl http://localhost:9010/provider-nacos/hello
hi, this is service-provider-nacos!

下面集成服务调用组件Spring Cloud OpenFeign,然后集成Nacos Config配置中心。

欢迎点赞,谢谢大佬ヾ(◍°∇°◍)ノ゙