根据版本说明中的推荐,我们这里选择SpringBoot的版本为2.4.2,SpringCloud Alibaba的版本则为2021.1,组件对应关系如下
内容主要基于三个微服务:用户服务UserService,订单服务OrderService,账单服务AccountService。
贯穿这3个项目模块,其他的还可以比如 支付 活动 库存的,但是先这3个,以及再加,在大项目面用到的组件有:
- 注册中心、配置中心 Nacos
- 限流 Sentinel
- 分布式事务 Seata
- 网关 SpringCloud Gateway
- 认证授权 Spring Cloud Oauth2
- docker、docker-compose
本篇内容就是使用Dokcer-compose部署Nacos,Sentinel,MySQL,作为后面的文章的基础环境
Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。(用来实现配置中心和服务注册中心)
官网:什么是 Nacos
1.在Docker中安装docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予权限
chmod +x /usr/local/bin/docker-compose
查看版本号
docker-compose --version
2.Mysql容器化
由于nacos需要依赖于MySQ作为资L源存储,所以在编写完整docker-compose之前我会先用docker启动临时的mysql容器,然后准备好nacos需要的数据库
创建临时容器
docker run --rm --name mysql -e MYSQL_ROOT_PASSWORD=root -v /app/cloud/mysql/data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
使用MySQL客户端链接,导入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.
*/
/******************************************/
/* 数据库全名 = 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');
停止容器,由于加了--rm参数,所以容器会自动删除
docker stop [容器ID|容器名称]
3.配置文件
创建/usr/local/docker/cloud-alibaba目录
cd /usr/local/docker/cloud-alibaba
在cloud-alibaba目录下创建docker-compose.yaml配置文件
vim docker-compose.yaml
文件内容
version: "3.8"
services:
mysql:
image: mysql:5.7
restart: always
ports:
- "3306:3306"
environment:
- "MYSQL_ROOT_PASSWORD=root"
volumes:
- /app/cloud/mysql/data:/var/lib/mysqlnacos:
image: nacos/nacos-server:1.4.1
container_name: nacos
hostname: nacos
restart: always
environment:
- MODE=standalone
- TZ=Asia/Shanghai
- NACOS_SERVER_PORT=8848
- JVM_XMS=256m
- JVM_XMX=256m
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=192.168.44.132
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=root
- PREFER_HOST_MODE=hostname
volumes:
- /app/cloud/nacos/logs:/home/nacos/logs
ports:
- "8848:8848"
rabbitmq:
hostname: rabbitmq
environment:
RABBITMQ_DEFAULT_VHOST: "root"
RABBITMQ_DEFAULT_USER: "root"
RABBITMQ_DEFAULT_PASS: "root"
image: "rabbitmq:3.9.14-management"
restart: always
volumes:
- "/usr/local/coin/rabbitmq/data:/var/lib/rabbitmq"
- "/usr/local/coin/rabbitmq/log:/var/lib/rabbitmq/log"
ports:
- "15672:15672"
- "4369:4369"
- "5672:5672"
- "25672:25672"sentinel:
image: bladex/sentinel-dashboard:1.8.0
container_name: sentinel
ports:
- "8858:8858"
restart: always
portainer:
image: portainer/portainer
container_name: portainer
restart: always
ports:
- "9000:9000"
volumes:
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sockseata-server:
image: seataio/seata-server:1.3.0
hostname: seata-server
ports:
- 8091:8091
environment:
- SEATA_PORT=8091
- STORE_MODE=file
expose:
- 8091
restart: always
nginx:
image: nginx:1.9.9
container_name: nginx199
ports:
- "80:80"
restart: always
redis-server:
image: redis:4.0.0
container_name: redis4.0
ports:
- "6379:6379"
volumes:
- /usr/local/redis/conf/redis.conf:/redis.conf
- /usr/local/redis/data:/data
restart: always
zookeeper-server:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
restart: alwaysredis-server:
image: redis:4.0.0
container_name: redis4.0
ports:
- "6379:6379"
volumes:
- /usr/local/redis/conf/redis.conf:/redis.conf
- /usr/local/redis/data:/data
restart: always
- - MYSQL_SERVICE_HOST=192.168.44.132 修改成自己的主机IP地址
- - JVM_XMS=256m:表示JVM启动时分配的堆内存为256MB
- - JVM_XMX=256m :同时堆内存的最大限制也为256MB。可以避免JVM占用过多的系统资源
MySQL Service(mysql):
- 使用MySQL 5.7的官方镜像。
- 映射端口3306到主机,允许外部访问数据库。
- 设置了MySQL的root用户密码,并且将数据卷挂载到主机的
/app/cloud/mysql/data
目录。Nacos Service(nacos):
- 使用Nacos 1.4.1的官方镜像。
- 设置了Nacos的环境变量,包括使用的数据库、时区等配置。
- 映射端口8848到主机,允许外部访问Nacos服务。
- 将日志文件挂载到主机的
/app/cloud/nacos/logs
目录。RabbitMQ Service(rabbitmq):
- 使用RabbitMQ 3.9.14的官方镜像,并启用了管理插件。
- 设置了RabbitMQ的默认虚拟主机、用户和密码。
- 将数据卷挂载到主机的
/usr/local/coin/rabbitmq/data
和/usr/local/coin/rabbitmq/log
目录。- 映射了几个RabbitMQ相关的端口到主机,允许外部访问RabbitMQ服务和管理界面。
Sentinel Service(sentinel):
- 使用BladeX Sentinel Dashboard 1.8.0的镜像。
- 映射端口8858到主机,允许外部访问Sentinel服务。
Portainer Service(portainer):
- 使用Portainer的官方镜像。
- 映射端口9000到主机,允许外部访问Portainer管理界面。
- 将容器的数据挂载到主机的
./data
目录和Docker的Unix套接字。Seata Server Service(seata-server):
- 使用Seata 1.3.0的官方镜像。
- 映射端口8091到主机,允许外部访问Seata Server。
- 设置了Seata的环境变量,包括存储模式等配置。
Nginx Service(nginx):
- 使用Nginx 1.9.9的官方镜像。
- 映射端口80到主机,允许外部访问Nginx服务。
Redis Service(redis-server):
- 使用Redis 4.0.0的官方镜像。
- 映射端口6379到主机,允许外部访问Redis服务。
- 将Redis的配置文件和数据目录挂载到主机。
Zookeeper Service(zookeeper-server):
- 使用wurstmeister制作的Zookeeper镜像。
- 映射端口2181到主机,允许外部访问Zookeeper服务。
4.在cloud-alibaba目录下执行 docker-compose up -d 命令启动
docker-compose up -d
启动成功
关闭
docker-compose down
4.环境验证
nacos
Nacos是一个用于动态服务发现、配置管理和服务元数据的开源平台,由阿里巴巴集团开发并开源。它提供了服务注册与发现、配置管理和服务元数据管理等功能,帮助构建和管理云原生应用。
http://192.168.44.132:8848/nacos
账号:nacos
密码:nacos
在服务配置中添加一条数据
nacos安装成功!
sentinel
Sentinel是一款开源的分布式系统的流量防卫兵,由阿里巴巴集团开发并开源。它旨在解决分布式系统中流量控制、熔断降级、系统负载保护等问题,提供了实时的监控和保护机制。
http://192.168.44.132:8858/#/login
账号:sentinel
密码:sentinel
sentinel安装成功!
Portainer
Portainer是一个轻量级的容器管理工具,它提供了直观易用的用户界面,帮助用户更轻松地管理 Docker 环境。通过 Portainer,您可以方便地查看和管理 Docker 主机上的容器、镜像、卷和网络等资源,而无需熟悉复杂的命令行操作。
http://192.168.44.132:9000
账号:admin
密码:12345678
这里我们选择本地连接
RabbitMQ
RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP),可以作为消息中间件在分布式系统中进行消息传递。RabbitMQ由Erlang语言编写,具有高度可靠、高可用性、高扩展性和跨平台等特点,被广泛应用于企业级应用程序的消息传递和异步处理。
http://192.168.44.132:15672
账号:root
密码:root
内网穿透
在C:\Windows\System32\drivers\etc\host文件中添加"192.168.44.132 microservice"的作用是将microservice这个主机名指向IP地址为192.168.44.132的虚拟机。这样,当在本地计算机上访问microservice时,会直接使用指定的IP地址进行通信,而不需要通过DNS服务器进行解析。这种方式可以在一定程度上加快访问速度,同时也方便了开发和测试过程中对不同主机名和IP地址的管理和配置。
通常情况下,我们可以将一些测试用的服务发布在内网环境下,通过将其对应的域名或主机名映射到对应的IP地址,使得本地计算机可以直接访问内网中的服务
去文件夹中修改host
C:\Windows\System32\drivers\etc\host
端口开放
如果进不去可能是端口没有开放
查询有哪些端口是开启的:
firewall-cmd --list-port
开启端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --zone=public --add-port=8858/tcp --permanent
firewall-cmd --zone=public --add-port=8019/tcp --permanent
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --zone=public --add-port=2181/tcp --permanent
重启防火墙
firewall-cmd --reload