重生之我在暑假学习微服务第七天《微服务之服务治理篇》
- 个人主页:VON
- 文章所属专栏:微服务
微服务系列文章专栏
重生之我在暑假学习微服务第一天《MybatisPlus-上篇》 重生之我在暑假学习微服务第二天《MybatisPlus-下篇》 重生之我在暑假学习微服务第三天《Docker-上篇》 重生之我在暑假学习微服务第四天《Docker-下篇》 重生之我在暑假学习微服务第五天《Docker部署项目篇》 重生之我在暑假学习微服务第六天《微服务之拆分项目篇》 未完待续
特别声明:本系列所涉及资料皆为黑马程序员课程中的资料
目录
一、解决昨天的遗留问题
二、拆分购物车服务
1、创建cart-service模块
2、开始改造
3、测试
4、远程调用
三、nacos应用
1、部署Nacos注册中心
(1)创建nacos数据库
(2)在docker中部署nacos
2、服务注册
(1)修改pom/yaml文件
(2)再启动一个相同的
3、服务发现
(1)配置cart-service模块
(2)修改service层代码
结语
一、解决昨天的遗留问题
昨天测试的时候失败了,我已经找到为什么失败了。
昨天失败是因为数据库的连接问题,今天我又连接一遍成功了
我这里改成了我的虚拟机ip地址
能查询到数据就表示成功了
二、拆分购物车服务
今天也是出师不利,因为昨天电脑关机了所以所有都要重新启动,启动了半小时才启动成功。
不知道为什么ip地址莫名其妙改变了。
昨天用的133,今天变成134了
不管那么多了继续今天的学习
1、创建cart-service模块
和昨天的类似
2、开始改造
pom文件和昨天的一样
<dependencies><!--common--><dependency><groupId>com.heima</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-rsa</artifactId><version>1.0.9.RELEASE</version></dependency><!--数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
和上一个拆分方法类似
修改完成后的目录大致是这样的
service层有两处不同需要注意一下
3、测试
查询成功,可以看到查询到的数据就是数据库中的数据
这里又报错了,还是昨天的那个错误,不过不影响
4、远程调用
刚才拆分的时候我们注释了相关用户的功能
在拆分的时候用到了不同的数据库, 这里就需要调用其他的数据库了
这里的代码修改的有点复杂,我好像有点懵逼了😵
就是查询商品这里通过RestTemplate发送Http请求,实现远程调用
// 2.查询商品ResponseEntity<List<ItemDTO>> response = restTemplate.exchange( "http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>(){},Map.of("ids", CollUtil.join(itemIds, ",")));//List<ItemDTO> items = itemService.queryItemByIds(itemIds);//解析响应if(!response.getStatusCode().is2xxSuccessful()){return;}List<ItemDTO> items = response.getBody();
restTemplate.exchange()
方法发起GET请求,参数如下:
- URL模板:
"http://localhost:8081/items?ids={ids}"
,其中{ids}
为路径参数占位符 - HTTP方法:
HttpMethod.GET
- 请求体:
null
(GET请求无请求体) - 响应类型:
ParameterizedTypeReference<List<ItemDTO>>
用于指定泛型返回类型 - URL参数:
Map.of("ids", CollUtil.join(itemIds, ","))
将商品ID列表用逗号拼接
这里出现数据就表示成功了
可以看到8081端口请求到了一条数据
三、nacos应用
原理如下:
1、部署Nacos注册中心
(1)创建nacos数据库
直接运行即可
-- --------------------------------------------------------
-- 主机: 192.168.150.101
-- 服务器版本: 8.0.27 - MySQL Community Server - GPL
-- 服务器操作系统: Linux
-- HeidiSQL 版本: 12.2.0.6576
-- --------------------------------------------------------/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;-- 导出 nacos 的数据库结构
DROP DATABASE IF EXISTS `nacos`;
CREATE DATABASE IF NOT EXISTS `nacos` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `nacos`;-- 导出 表 nacos.config_info 结构
DROP TABLE IF EXISTS `config_info`;
CREATE TABLE IF NOT EXISTS `config_info` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin DEFAULT NULL,`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',`md5` varchar(32) COLLATE utf8_bin 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 COLLATE utf8_bin COMMENT 'source user',`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',`c_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL,`c_use` varchar(64) COLLATE utf8_bin DEFAULT NULL,`effect` varchar(64) COLLATE utf8_bin DEFAULT NULL,`type` varchar(64) COLLATE utf8_bin DEFAULT NULL,`c_schema` text COLLATE utf8_bin,`encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_info';-- 正在导出表 nacos.config_info 的数据:~0 rows (大约)
DELETE FROM `config_info`;-- 导出 表 nacos.config_info_aggr 结构
DROP TABLE IF EXISTS `config_info_aggr`;
CREATE TABLE IF NOT EXISTS `config_info_aggr` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`datum_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'datum_id',`content` longtext COLLATE utf8_bin NOT NULL COMMENT '内容',`gmt_modified` datetime NOT NULL COMMENT '修改时间',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='增加租户字段';-- 正在导出表 nacos.config_info_aggr 的数据:~0 rows (大约)
DELETE FROM `config_info_aggr`;-- 导出 表 nacos.config_info_beta 结构
DROP TABLE IF EXISTS `config_info_beta`;
CREATE TABLE IF NOT EXISTS `config_info_beta` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',`beta_ips` varchar(1024) COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) COLLATE utf8_bin 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 COLLATE utf8_bin COMMENT 'source user',`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_info_beta';-- 正在导出表 nacos.config_info_beta 的数据:~0 rows (大约)
DELETE FROM `config_info_beta`;-- 导出 表 nacos.config_info_tag 结构
DROP TABLE IF EXISTS `config_info_tag`;
CREATE TABLE IF NOT EXISTS `config_info_tag` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_id',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',`md5` varchar(32) COLLATE utf8_bin 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 COLLATE utf8_bin COMMENT 'source user',`src_ip` varchar(50) COLLATE utf8_bin 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=utf8mb3 COLLATE=utf8_bin COMMENT='config_info_tag';-- 正在导出表 nacos.config_info_tag 的数据:~0 rows (大约)
DELETE FROM `config_info_tag`;-- 导出 表 nacos.config_tags_relation 结构
DROP TABLE IF EXISTS `config_tags_relation`;
CREATE TABLE IF NOT EXISTS `config_tags_relation` (`id` bigint NOT NULL COMMENT 'id',`tag_name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',`nid` bigint 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=utf8mb3 COLLATE=utf8_bin COMMENT='config_tag_relation';-- 正在导出表 nacos.config_tags_relation 的数据:~0 rows (大约)
DELETE FROM `config_tags_relation`;-- 导出 表 nacos.group_capacity 结构
DROP TABLE IF EXISTS `group_capacity`;
CREATE TABLE IF NOT EXISTS `group_capacity` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`group_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int 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=utf8mb3 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';-- 正在导出表 nacos.group_capacity 的数据:~0 rows (大约)
DELETE FROM `group_capacity`;-- 导出 表 nacos.his_config_info 结构
DROP TABLE IF EXISTS `his_config_info`;
CREATE TABLE IF NOT EXISTS `his_config_info` (`id` bigint unsigned NOT NULL,`nid` bigint unsigned NOT NULL AUTO_INCREMENT,`data_id` varchar(255) COLLATE utf8_bin NOT NULL,`group_id` varchar(128) COLLATE utf8_bin NOT NULL,`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',`content` longtext COLLATE utf8_bin NOT NULL,`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL,`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`src_user` text COLLATE utf8_bin,`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL,`op_type` char(10) COLLATE utf8_bin DEFAULT NULL,`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text COLLATE utf8_bin NOT NULL 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=utf8mb3 COLLATE=utf8_bin COMMENT='多租户改造';-- 正在导出表 nacos.his_config_info 的数据:~0 rows (大约)
DELETE FROM `his_config_info`;-- 导出 表 nacos.permissions 结构
DROP TABLE IF EXISTS `permissions`;
CREATE TABLE IF NOT EXISTS `permissions` (`role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`resource` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,`action` varchar(8) COLLATE utf8mb4_general_ci NOT NULL,UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 正在导出表 nacos.permissions 的数据:~0 rows (大约)
DELETE FROM `permissions`;-- 导出 表 nacos.roles 结构
DROP TABLE IF EXISTS `roles`;
CREATE TABLE IF NOT EXISTS `roles` (`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,UNIQUE KEY `idx_user_role` (`username`,`role`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 正在导出表 nacos.roles 的数据:~1 rows (大约)
DELETE FROM `roles`;
INSERT INTO `roles` (`username`, `role`) VALUES('nacos', 'ROLE_ADMIN');-- 导出 表 nacos.tenant_capacity 结构
DROP TABLE IF EXISTS `tenant_capacity`;
CREATE TABLE IF NOT EXISTS `tenant_capacity` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`tenant_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int 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=utf8mb3 COLLATE=utf8_bin COMMENT='租户容量信息表';-- 正在导出表 nacos.tenant_capacity 的数据:~0 rows (大约)
DELETE FROM `tenant_capacity`;-- 导出 表 nacos.tenant_info 结构
DROP TABLE IF EXISTS `tenant_info`;
CREATE TABLE IF NOT EXISTS `tenant_info` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'kp',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',`tenant_name` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name',`tenant_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint NOT NULL COMMENT '创建时间',`gmt_modified` bigint 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=utf8mb3 COLLATE=utf8_bin COMMENT='tenant_info';-- 正在导出表 nacos.tenant_info 的数据:~0 rows (大约)
DELETE FROM `tenant_info`;-- 导出 表 nacos.users 结构
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`password` varchar(500) COLLATE utf8mb4_general_ci NOT NULL,`enabled` tinyint(1) NOT NULL,PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 正在导出表 nacos.users 的数据:~1 rows (大约)
DELETE FROM `users`;
INSERT INTO `users` (`username`, `password`, `enabled`) VALUES('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;
(2)在docker中部署nacos
将这两个文件拷贝到虚拟机中
下载一下镜像
启动容器
docker run -d --name nacos --env-file ./nacos/custom.env -p 8848:8848 -p 9848:9848 -p 9849:9849 --restart=always nacos/nacos-server:v2.1.0-slim
显示这样就没什么问题了
可以运行docker logs nacos查看下日志,可以看到success代表成功了
登录一下nacos,这里的账号密码默认都是nacos
2、服务注册
(1)修改pom/yaml文件
在pom文件中加入nacos依赖
<!--nacos服务注册--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
修改完后就可以启动了
这样就是成功了
(2)再启动一个相同的
在这里配置一个端口就行了
可以看到我这里又启动了一个8083端口的服务
变成2个了
可以点击详情来进行查看
3、服务发现
(1)配置cart-service模块
先把cart-service中的也配置一下
(2)修改service层代码
这里说一下我个人的理解,大概就是将原来固定的改为现在动态的,就算有一个服务挂了还能访问另外一个。
来测试一下
将8081挂掉
可以看到还能访问到
这里已经将8081挂掉了
可以看到8082的后台还是正常查询
结语
主要内容包括:1. 解决前一天的数据库连接问题;2. 拆分购物车服务模块,创建cart-service并改造pom文件;3. 实现服务间远程调用,使用RestTemplate发起HTTP请求;4. 部署Nacos注册中心,包括创建数据库和在Docker中运行Nacos;5. 实现服务注册与发现功能,通过动态服务地址实现高可用。文章详细记录了开发过程中遇到的问题和解决方法,包括IP变更、服务调用切换等实际操作细节。
本篇文章历时4小时,希望大家支持!