網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
文章目錄
- SpringCloud服務(wù)拆分初探
- 1.1.服務(wù)拆分原則
- 1.2 服務(wù)拆分案例準(zhǔn)備
- 1.2.1 數(shù)據(jù)庫(kù)準(zhǔn)備
- 1.2.2 項(xiàng)目準(zhǔn)備
- 1.2.3 項(xiàng)目導(dǎo)入指南
- 1.3 實(shí)現(xiàn)遠(yuǎn)程調(diào)用案例
- 1.3.1.案例需求:
- 1.3.2.注冊(cè)RestTemplate
- 1.3.3.實(shí)現(xiàn)遠(yuǎn)程調(diào)用
- 1.4. 案例模型總結(jié):提供者與消費(fèi)者
SpringCloud服務(wù)拆分初探
1.1.服務(wù)拆分原則
這里我總結(jié)了微服務(wù)拆分時(shí)的幾個(gè)原則:
- 不同微服務(wù),不要重復(fù)開(kāi)發(fā)相同業(yè)務(wù)
- 微服務(wù)數(shù)據(jù)獨(dú)立,不要訪問(wèn)其它微服務(wù)的數(shù)據(jù)庫(kù)
- 微服務(wù)可以將自己的業(yè)務(wù)暴露為接口,供其它微服務(wù)調(diào)用
1.2 服務(wù)拆分案例準(zhǔn)備
1.2.1 數(shù)據(jù)庫(kù)準(zhǔn)備
cloud-order.sql
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 '商品名稱(chēng)',
`price` bigint(20) NOT NULL COMMENT '商品價(jià)格',
`num` int(10) NULL DEFAULT 0 COMMENT '商品數(shù)量',
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 蘋(píng)果 iPhone 12 ', 699900, 1);
INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新國(guó)標(biāo)電動(dòng)車(chē)', 209900, 1);
INSERT INTO `tb_order` VALUES (103, 3, '駱駝(CAMEL)休閑運(yùn)動(dòng)鞋女', 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 人體工學(xué)電腦椅子', 79900, 1);
INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休閑男鞋', 31900, 1);
SET FOREIGN_KEY_CHECKS = 1;
cloud-user.sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
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;
-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, '柳巖', '湖南省衡陽(yáng)市');
INSERT INTO `tb_user` VALUES (2, '玉雪凝', '陜西省西安市');
INSERT INTO `tb_user` VALUES (3, '玉如夢(mèng)', '湖北省十堰市');
INSERT INTO `tb_user` VALUES (4, '曲華裳', '天津市');
INSERT INTO `tb_user` VALUES (5, '祝晴', '遼寧省沈陽(yáng)市大東區(qū)');
INSERT INTO `tb_user` VALUES (6, '扇輕羅', '山東省青島市');
SET FOREIGN_KEY_CHECKS = 1;
1.2.2 項(xiàng)目準(zhǔn)備
cloud-demo:父工程,管理依賴(lài)
- order-service:訂單微服務(wù),負(fù)責(zé)訂單相關(guān)業(yè)務(wù)
- user-service:用戶微服務(wù),負(fù)責(zé)用戶相關(guān)業(yè)務(wù)
要求:
- 訂單微服務(wù)和用戶微服務(wù)都必須有各自的數(shù)據(jù)庫(kù),相互獨(dú)立
- 訂單服務(wù)和用戶服務(wù)都對(duì)外暴露Restful的接口
- 訂單服務(wù)如果需要查詢用戶信息,只能調(diào)用用戶服務(wù)的Restful接口,不能查詢用戶數(shù)據(jù)庫(kù)
目錄結(jié)構(gòu):
初始項(xiàng)目鏈接:
https://download.csdn.net/download/weixin_45525272/86240297
1.2.3 項(xiàng)目導(dǎo)入指南
解壓,右鍵使用IDEA打開(kāi)(或者直接在idea中選擇打開(kāi)文件夾)
導(dǎo)入后,會(huì)在IDEA右下角出現(xiàn)彈窗:
點(diǎn)擊彈窗,然后按下圖選擇:
會(huì)出現(xiàn)這樣的菜單:
配置下項(xiàng)目使用的JDK:
1.3 實(shí)現(xiàn)遠(yuǎn)程調(diào)用案例
在order-service服務(wù)中,有一個(gè)根據(jù)id查詢訂單的接口:
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根據(jù)id查詢訂單并返回
return orderService.queryOrderById(orderId);
}
}
根據(jù)id查詢訂單,返回值是Order對(duì)象,請(qǐng)求測(cè)試結(jié)果如圖:
其中的user為null
在user-service中有一個(gè)根據(jù)id查詢用戶的接口:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 路徑: /user/110
*
* @param id 用戶id
* @return 用戶
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
查詢的結(jié)果如圖:
1.3.1.案例需求:
修改order-service中的根據(jù)id查詢訂單業(yè)務(wù),要求在查詢訂單的同時(shí),根據(jù)訂單中包含的userId查詢出用戶信息,一起返回。
因此,我們需要在order-service中 向user-service發(fā)起一個(gè)http的請(qǐng)求,調(diào)用http://localhost:8081/user/{userId}
這個(gè)接口。
大概的步驟是這樣的:
- 注冊(cè)一個(gè)RestTemplate的實(shí)例到Spring容器
- 修改order-service服務(wù)中的OrderService類(lèi)中的queryOrderById方法,根據(jù)Order對(duì)象中的userId查詢User
- 將查詢的User填充到Order對(duì)象,一起返回
1.3.2.注冊(cè)RestTemplate
首先,我們?cè)趏rder-service服務(wù)中的OrderApplication啟動(dòng)類(lèi)中,注冊(cè)RestTemplate實(shí)例:
package com.yyl.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("com.yyl.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
1.3.3.實(shí)現(xiàn)遠(yuǎn)程調(diào)用
修改order-service服務(wù)中的com.yyl.order.service包下的OrderService類(lèi)中的queryOrderById方法:
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查詢訂單
Order order = orderMapper.findById(orderId);
// 遠(yuǎn)程查詢用戶詳細(xì)信息
// 2.url地址
String url = "http://localhost:8081/user/"+order.getUserId();
// 3.發(fā)起遠(yuǎn)程調(diào)用
User user = restTemplate.getForObject(url, User.class);
// 4.存入order
order.setUser(user);
// 5.返回
return order;
}
}
添加了如下代碼
重啟微服務(wù),再訪問(wèn)請(qǐng)求:
沒(méi)有問(wèn)題!
1.4. 案例模型總結(jié):提供者與消費(fèi)者
在服務(wù)調(diào)用關(guān)系中,會(huì)有兩個(gè)不同的角色:
服務(wù)提供者:一次業(yè)務(wù)中,被其它微服務(wù)調(diào)用的服務(wù)。(提供接口給其它微服務(wù))
服務(wù)消費(fèi)者:一次業(yè)務(wù)中,調(diào)用其它微服務(wù)的服務(wù)。(調(diào)用其它微服務(wù)提供的接口)
但是,服務(wù)提供者與服務(wù)消費(fèi)者的角色并不是絕對(duì)的,而是相對(duì)于業(yè)務(wù)而言。
如果服務(wù)A調(diào)用了服務(wù)B,而服務(wù)B又調(diào)用了服務(wù)C,服務(wù)B的角色是什么?
- 對(duì)于A調(diào)用B的業(yè)務(wù)而言:A是服務(wù)消費(fèi)者,B是服務(wù)提供者
- 對(duì)于B調(diào)用C的業(yè)務(wù)而言:B是服務(wù)消費(fèi)者,C是服務(wù)提供者
因此,服務(wù)B既可以是服務(wù)提供者,也可以是服務(wù)消費(fèi)者。
原文鏈接:https://blog.csdn.net/weixin_45525272/article/details/125844426
相關(guān)推薦
- 2022-04-28 Python的線程使用隊(duì)列Queue來(lái)改造轉(zhuǎn)賬場(chǎng)景_python
- 2022-03-20 C++?Qt繪制時(shí)鐘界面_C 語(yǔ)言
- 2022-08-10 .Net使用Cancellation?Framework取消并行任務(wù)_實(shí)用技巧
- 2022-07-08 Python中號(hào)稱(chēng)神仙的六個(gè)內(nèi)置函數(shù)詳解_python
- 2022-05-25 在Windows平臺(tái)安裝Jenkins_win服務(wù)器
- 2022-09-02 Docker下Redis集群(主從+哨兵)安裝配置的實(shí)現(xiàn)步驟_docker
- 2022-04-27 VSCode?IDE?配置環(huán)境過(guò)程解析_C 語(yǔ)言
- 2022-06-27 python結(jié)合shell自動(dòng)創(chuàng)建kafka的連接器實(shí)戰(zhàn)教程_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支