我报名参加金石计划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…
选择一个最新的稳定版本:
其中zip是Windows版本,tar.gz是Linux版本。
安装Nacos
下载完成之后,解压,进入目录,如下所示:
进入/bin
文件夹下点击startup.cmd
启动:
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
说明:
[1] startup是启动脚本,shutdown是关闭脚本。 [2] windows下使用cmd脚本,在Linux下使用sh脚本。
[3] 配置文件在/conf目录下,默认启动端口是8848.
快速下载安装步骤:
- 下载nacos-server:github.com/alibaba/nac…
- 安装:解压缩后,进入到bin文件夹中,在cmd中执行如下命令可以进行启动:
startup -m standalone
启动Nacos
将这个命令写成cmd运行的脚本startup-standalone.cmd,内容为上面的命令(推荐)。
或者 将bin/startup.cmd 里面set MODE="cluster" 修改为set MODE="standalone"
- 启动cmd文件,访问 http://localhost:8848/nacos/
- 使用默认的nacos/nacos登陆。
注册为Windows服务
安装的确完成了,但是在windows上每次启动都需要弹出cmd窗口,占用桌面空间。我们可以将nacos注册为windows服务,运行在后台,这样就看不到cmd窗口了,结束服务就可以kill掉nacos进程。
我们有三种方式注册windwos服务,分别是:修改注册表、cmd命令注册和第三方工具快速注册。这里我们直接采用开源工具一键注册windows服务,更加的快速方便(这种轮子可以不用去造)。、
下载 Windows Service Wrapper工具
这是利用xml配置文件将cmd一键注册为windows系统服务的,像这种工具还有 nssm 。
编写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"
- 启动cmd文件,访问 http://localhost:8848/nacos/
- 使用默认的nacos/nacos登陆。
测试使用
打开地址 http://localhost:8848/nacos ,输入nacos/nacos登录,然后点击命名空间
-> 创建命名空间
:
然后,因为前面配置连接了mysql8.0数据库服务器,所以启动nacos后是会直接建立起mysql数据库的连接的。
然后,可以看到配置成功写到了mysql数据库中。
数据库有没有配置信息是检验配置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:
注意:这里如果子模块名字写错误想改,可以尝试:子模块右键重命名 => 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>-->
<!-- <!–配置中心–>-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<!-- <!–2021以上版本需要引入该jar才能使bootstrap配置文件生效–>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-bootstrap</artifactId>-->
<!-- </dependency>-->
<!-- <!–RPC框架 - 远程过程调用 –>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!-- </dependency>-->
<!-- <!–spring监控–>-->
<!-- <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结构配置。
打开Nacos控制台,查看服务是否注册成功,地址为:http://localhost:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=&pageSize=&pageNo=
可以看到,服务已经注册成功!
但是这里没有配置动态刷新配置(@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配置中心。
欢迎点赞,谢谢大佬ヾ(◍°∇°◍)ノ゙