微服务(二)服务拆分及远程调用

1. 服务拆分原则

    不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用

2. 服务拆分示例

微服务cloud-demo为例

cloud-demo:父工程,管理依赖

    order-service:订单微服务,负责订单相关业务 user-service:用户微服务,负责用户相关业务

2.1 导入Sql语句

create database cloud_user;
use cloud_user
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 收件人,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 地址,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;


INSERT INTO `tb_user` VALUES (1, 柳岩, 湖南省衡阳市);
INSERT INTO `tb_user` VALUES (2, 文二狗, 陕西省西安市);
INSERT INTO `tb_user` VALUES (3, 华沉鱼, 湖北省十堰市);
INSERT INTO `tb_user` VALUES (4, 张必沉, 天津市);
INSERT INTO `tb_user` VALUES (5, 郑爽爽, 辽宁省沈阳市大东区);
INSERT INTO `tb_user` VALUES (6, 范兵兵, 山东省青岛市);

SET FOREIGN_KEY_CHECKS = 1;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tb_order
-- ----------------------------
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 订单id,
  `user_id` bigint(20) NOT NULL COMMENT 用户id,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 商品名称,
  `price` bigint(20) NOT NULL COMMENT 商品价格,
  `num` int(10) NULL DEFAULT 0 COMMENT 商品数量,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of tb_order
-- ----------------------------
INSERT INTO `tb_order` VALUES (101, 1, Apple 苹果 iPhone 12 , 699900, 1);
INSERT INTO `tb_order` VALUES (102, 2, 雅迪 yadea 新国标电动车, 209900, 1);
INSERT INTO `tb_order` VALUES (103, 3, 骆驼(CAMEL)休闲运动鞋女, 43900, 1);
INSERT INTO `tb_order` VALUES (104, 4, 小米10 双模5G 骁龙865, 359900, 1);
INSERT INTO `tb_order` VALUES (105, 5, OPPO Reno3 Pro 双模5G 视频双防抖, 299900, 1);
INSERT INTO `tb_order` VALUES (106, 6, 美的(Midea) 新能效 冷静星II , 544900, 1);
INSERT INTO `tb_order` VALUES (107, 2, 西昊/SIHOO 人体工学电脑椅子, 79900, 1);
INSERT INTO `tb_order` VALUES (108, 3, 梵班(FAMDBANN)休闲男鞋, 31900, 1);

SET FOREIGN_KEY_CHECKS = 1;

2.2 导入项目

2.3 实现远程调用

在orderService中, 有一个根据id查询订单的接口:根据id查询订单,返回值是Order对象,其中User为null

在user-service中有一个根据id查询用户的接口:

那我们怎么在orderService中调用userService呢? 我们可以用RestTemplate

2.3.1 注册RestTemplate

我们可以直接在主启动类注入, 因为主启动类有 @SpringBootConfiguration 注解

2.3.2 实现远程调用

经验分享 程序员 微信小程序 职场和发展