Nacos
Nacos简介与下载
是什么?
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos(Dynamic Naming and Configuration Service)就是注册中心+配置中心的组合
Nacos = Eureka + Config + Bus 替代Eureka做服务注册中心,替代Config+Bus做服务配置中心
下载
github地址: https://github.com/alibaba/Nacos
Nacos 地址: https://nacos.io/zh-cn/
安装并运行Nacos
windows安装
本地Java8+Maven环境已经OK
先从官网下载Nacos
解压安装包,直接运行bin目录下的startup.cmd
命令运行成功后直接访问http://localhost:8848/nacos
docker安装
#拉取镜像
docker pull docker.io/nacos/nacos-server#启动,通过MODE来设置使用单机模式;注意如果是多网卡的话需要配置NACOS_SERVER_IP参数来指定IP,否则可能会导致外网无法访问
docker run -d --name nacos -p 8848:8848 --env MODE=standalone --env NACOS_SERVER_IP=192.168.254.132 nacos/nacos-server
安装成功后访问http://192.168.254.132:8848/nacos
初始账号密码均为nacos
Nacos作为服务注册中心
官方文档
基于Nacos的服务提供者
新建cloudalibaba-provider-payment9001模块
pom文件
加入父pom的dependencyManagement
<!--spring cloud alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version><type>pom</type><scope>import</scope></dependency>
该模块pom
<artifactId>cloudalibaba-provider-payment9001</artifactId><dependencies><!--SpringCloud ailibaba nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringBoot整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.mzr.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency></dependencies>
yml文件
server:port: 9001spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: 192.168.254.132:8848 #配置Nacos地址management:endpoints:web:exposure:include: '*'
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001
{public static void main(String[] args) {SpringApplication.run(PaymentMain9001.class, args);}
}
业务类
controller
@RestController
public class PaymentController
{@Value("${server.port}")private String serverPort;@GetMapping(value = "/payment/nacos/{id}")public String getPayment(@PathVariable("id") Integer id){return "nacos registry, serverPort: "+ serverPort+"\t id"+id;}
}
启动微服务
可以看到nacos-payment-provider已经注册进了nacos
访问http://localhost:9001/payment/nacos/1正常
创建cloudalibaba-provider-payment9002模块(克隆9001即可)
启动,可以看到cloudalibaba-provider-payment9002已经注册进nacos
基于Nacos的服务消费者
新建cloudalibaba-customer-nacos-order83模块
pom文件
<artifactId>cloudalibaba-customer-nacos-order83</artifactId><dependencies><!--SpringCloud ailibaba nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.mzr.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><!-- SpringBoot整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies>
yml文件
server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: 192.168.254.132:8848#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:nacos-user-service: http://nacos-payment-provider
主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83
{public static void main(String[] args){SpringApplication.run(OrderNacosMain83.class,args);}
}
config
@Configuration
public class ApplicationContextConfig
{@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
controller
@RestController
@Slf4j
public class OrderNacosController
{@Resourceprivate RestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String serverURL;//这是之前的写法,现在写法的好处:使得配置信息与业务得以分离//public static final String PAYMENT_URL = "http://cloud-provider-payment";@GetMapping(value = "/consumer/payment/nacos/{id}")public String paymentInfo(@PathVariable("id") Long id){return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);}
}
启动,可以看到9001/9002/83均已注册进nacos
多次访问http://localhost:83/consumer/payment/nacos/1可以发现9001/9002是交替出现的
why
因为nacos自带负载均衡
,当我们引入nacos-discovery依赖,其实已经包含ribbon了
还记得ribbon默认的策略是轮询吗?
服务注册中心对比
Nacos与其他注册中心特性对比
Nacos支持AP和CP模式的切换
C是所有节点在同一时间看到的数据是一致的(数据一致性),而A的定义是所有的请求都会收到响应(高可用)
何时选择使用何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-cient注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud 和Dubbo服务都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
post请求 curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
Nacos作为服务配置中心
基础配置
新建cloudalibaba-config-nacos-client3377模块
POM
<artifactId>cloudalibaba-config-nacos-client3377</artifactId><dependencies><!--nacos-config--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--nacos-discovery--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--web + actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.mzr.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency></dependencies>
YML
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
共性的配置放在bootstrap,微服务特殊配置放在application
bootstrap.yml
# nacos配置
server:port: 3377spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置
application.yml
spring:profiles:active: dev # 表示开发环境#active: test # 表示测试环境#active: info
主启动
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377
{public static void main(String[] args) {SpringApplication.run(NacosConfigClientMain3377.class, args);}
}
业务类
@RestController
@RefreshScope //通过Spring Cloud原生注解@RefreshScope实现配置自动更新
public class ConfigClientController
{@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}
}
在Nacos中添加配置信息
Nacos中的配置规则
Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
说明:之所以需要配置spring.application.name
,是因为它是构成Nacos配置管理dataId字段的一部分。
在Nacos Spring Cloud 中,dataid 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。
spring.profile.active
即为当前环境对应的profile
,详情可以参考Spring Boot文档。
注意:当spring.profile.active
为空时,对应的连接符-
也将不存在,datald的拼接格式变成 ${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.extension
来配置。目前只支持properties
和yaml
类型。
按照公式:dataid为nacos-config-client-dev.yaml
启动3377,访问http://localhost:3377/config/info可以发现已经读取到nacos配置中心的内容了
自带动态刷新
此时,我们修改nacos配置中心的内容,将version = 1改为 version = 2
再次访问http://localhost:3377/config/info,可以看到已经读取到最新内容了(简直比Config好用太多!)
分类配置
当前问题
问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生产环境
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:
一个大型分布式微服务系统会有很多微服务子项目
每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…
那怎么对这些微服务配置进行管理呢?
首先我们看一下nacos图形化页面
Namespace+Group+Data lD三者关系?为什么这么设计?
类似Java里面的package名和类名
最外层的namespace是可以用于区分部署环境的,Group和DatalD逻辑上区分两个目标对象。
默认情况:
Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT
-
Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。 -
Group可以把不同的微服务划分到同一个分组里面去
-
Sevice就是微服务,一个Service可以包含多个Cluster (集群)
-
Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ) ,给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。 -
Instance,就是微服务的实例。
三种方案加载配置解决开头的两个问题
- dataid方案
指定spring.profile.active和配置文件的DatalD来使不同环境下读取不同的配置
默认空间+默认分组+新建dev和test两个DatalD
通过spring.profile.active属性就能进行多环境下配置文件的读取
spring:profiles:#active: dev # 表示开发环境active: test # 表示测试环境
- Group方案
通过Group实现环境区分,新建Group
在nacos图形界面控制台上面新建配置文件DatalD
bootstrap+application
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: 192.168.254.132:8848 #Nacos服务注册中心地址config:server-addr: 192.168.254.132:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置group: DEV_GROUP
spring:profiles:#active: dev # 表示开发环境#active: test # 表示测试环境active: info
- Namespace方案
新建dev/test的Namespace
回到服务管理-服务列表查看
YML
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: 192.168.254.132:8848 #Nacos服务注册中心地址config:server-addr: 192.168.254.132:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置#group: DEFAULT_GROUP#根据namespace流水号进行区分namespace: 15c318d8-e529-41d0-ac08-7641543752f2
Nacos集群及持久化配置(重要)
架构说明
官网:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。)为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储
。
Nacos支持三种部署模式
- 单机模式–用于测试和单机试用。
- 集群模式–用于生产环境,确保高可用。
- 多集群模式–用于多数据中心场景。
Windows
cmd startup.cmd或者双击startup.cmd文件
单机模式支持mysql
在0.7版本之前,在单机模式时nacos使用嵌入式数据库derby实现数据的存储,不方便观察数据存储的基本情况。
0.7版本增加了支持mysql数据源能力,derby到mysql切换具体的操作步骤:
- 1.安装数据库,版本要求:5.6.5+
- 2.初始化mysql数据库,数据库初始化文件: nacos/conf/nacos-mysql.sql,根据该脚本文件创建数据库nacos_devtest
- 3.修改nacos/conf/application.properties文件,增加支持mysql数据源配置,添加mysql数据源的url、用户名和密码
# 切换数据库
spring.datasource.platform=mysqldb.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
再以单机模式启动nacos(重启),可以看到是个全新的空记录界面,nacos所有写嵌入式数据库的数据都写到了mysql,以前是记录进derby
Linux版Nacos+ MySQL生产环境配置
预备环境准备
需要配置1个Nginx+3个nacos注册中心+1个mysql
请确保是在环境中安装使用:
64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
64 bit JDK 1.8+;下载.配置。
Maven 3.2.x+;下载.配置。
3个或3个以上Nacos节点才能构成集群。
集群的搭建
可以参考这篇文章:https://blog.csdn.net/qq_33807380/article/details/128378649
使用docker搭建mysql(使用192.168.254.130虚拟机)
拉取镜像
#拉取镜像
docker pull mysql:8.0.27
#查看镜像
docker images
启动镜像
#启动容器
docker run \
-p 3306:3306 \
--name mysql \
--privileged=true \
--restart unless-stopped \
-v /home/mysql8.0.27/mysql-files:/var/lib/mysql-files \
-v /home/mysql8.0.27/mysql:/etc/mysql \
-v /home/mysql8.0.27/logs:/logs \
-v /home/mysql8.0.27/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.27#查看容器是否运行
docker ps#进入容器内部
docker exec -it mysql bash#登录mysql,执行玩以下命令会提示输入密码
mysql -u root -p#查看此账号下所有数据库,正常展示表示mysql已经启动成功
show databases;
使用navicat连接,此时已正常连接
创建nacos数据库及表
/** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
CREATE DATABASE nacos_config;
USE nacos_config;
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(255) DEFAULT NULL,`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL,`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',`c_desc` varchar(256) DEFAULT NULL,`c_use` varchar(64) DEFAULT NULL,`effect` varchar(64) DEFAULT NULL,`type` varchar(64) DEFAULT NULL,`c_schema` text,PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(255) NOT NULL COMMENT 'group_id',`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',`content` longtext NOT NULL COMMENT '内容',`gmt_modified` datetime NOT NULL COMMENT '修改时间',`app_name` varchar(128) DEFAULT NULL,`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (`id` bigint(20) NOT NULL COMMENT 'id',`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`nid` bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`nid`),UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`group_id` varchar(128) 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 NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = 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) NOT NULL,`group_id` varchar(128) NOT NULL,`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL,`md5` varchar(32) DEFAULT NULL,`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`src_user` text,`src_ip` varchar(50) DEFAULT NULL,`op_type` char(10) DEFAULT NULL,`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',PRIMARY KEY (`nid`),KEY `idx_gmt_create` (`gmt_create`),KEY `idx_gmt_modified` (`gmt_modified`),KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`tenant_id` varchar(128) 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 NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';CREATE TABLE `tenant_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) NOT NULL COMMENT 'kp',`tenant_id` varchar(128) default '' COMMENT 'tenant_id',`tenant_name` varchar(128) default '' COMMENT 'tenant_name',`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';CREATE TABLE `users` (`username` varchar(50) NOT NULL PRIMARY KEY,`password` varchar(500) NOT NULL,`enabled` boolean NOT NULL
);CREATE TABLE `roles` (`username` varchar(50) NOT NULL,`role` varchar(50) NOT NULL,UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);CREATE TABLE `permissions` (`role` varchar(50) NOT NULL,`resource` varchar(255) NOT NULL,`action` varchar(8) NOT NULL,UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
搭建nacos集群(使用192.168.254.100、192.168.254.101、192.168.254.102搭建)
# 拉取镜像
docker pull nacos/nacos-server
# 启动nacos
# 192.168.254.100上执行
docker run -itd \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_SERVERS="192.168.254.100:8848 192.168.254.101:8848 192.168.254.102:8848" \
-e NACOS_SERVICE_IP=192.168.254.100 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.254.130 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=256m \
-p 8848:8848 \
--name nacos \
--privileged=true \
--restart=always \
nacos/nacos-server# 192.168.254.101上执行
docker run -itd \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_SERVERS="192.168.254.100:8848 192.168.254.101:8848 192.168.254.102:8848" \
-e NACOS_SERVICE_IP=192.168.254.101 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.254.130 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=256m \
-p 8848:8848 \
--name nacos \
--privileged=true \
--restart=always \
nacos/nacos-server# 192.168.254.102上执行
docker run -itd \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_SERVERS="192.168.254.100:8848 192.168.254.101:8848 192.168.254.102:8848" \
-e NACOS_SERVICE_IP=192.168.254.102 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.254.130 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=256m \
-p 8848:8848 \
--name nacos \
--privileged=true \
--restart=always \
nacos/nacos-server
配置nginx(使用192.168.254.130虚拟机)
#拉取镜像
docker pull nginx#启动镜像
docker run --name nginx -p 80:80 -d nginx
mkdir -p /home/nginx/datas/{conf,logs,html}docker logs --tail 50 --follow --timestamps nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/datas/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/datas/conf/
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html/ /home/nginx/datas/
# 将容器中的logs文件夹复制到宿主机
docker cp nginx:/var/log/nginx/ /home/nginx/datas/logs/
#删除临时容器
docker rm -f nginx
#正式启动容器
docker run --name nginx -p 80:80 \-v /home/nginx/datas/conf/nginx.conf:/etc/nginx/nginx.conf \-v /home/nginx/datas/conf/conf.d:/etc/nginx/conf.d \-v /home/nginx/datas/html:/usr/share/nginx/html \-v /home/nginx/datas/logs:/var/log/nginx \--privileged=true \--restart=always \-d nginx
修改default.conf
upstream nacosList {server 192.168.254.100:8848;server 192.168.254.101:8848;server 192.168.254.102:8848;
}server {listen 80;listen [::]:80;server_name localhost;location / {root /usr/share/nginx/html;index index.html index.htm;}location /nacos {proxy_pass http://nacosList;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
重启容器
docker restart nginx
访问http://192.168.254.130/nacos可以看到集群已经存在
创建一个配置列表
查看数据库,信息已成功入库
若微服务需要注册进nacos
之前单机版配置为
spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: 192.168.254.132:8848 #配置Nacos地址
现在只需修改地址为
spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: 192.168.254.130:80#配置Nacos集群访问地址
至此,Nacos集群及持久化配置已经完成~