網站首頁 編程語言 正文
文章目錄
- SpringCloud服務拆分初探
- 1.1.服務拆分原則
- 1.2 服務拆分案例準備
- 1.2.1 數據庫準備
- 1.2.2 項目準備
- 1.2.3 項目導入指南
- 1.3 實現遠程調用案例
- 1.3.1.案例需求:
- 1.3.2.注冊RestTemplate
- 1.3.3.實現遠程調用
- 1.4. 案例模型總結:提供者與消費者
SpringCloud服務拆分初探
1.1.服務拆分原則
這里我總結了微服務拆分時的幾個原則:
- 不同微服務,不要重復開發相同業務
- 微服務數據獨立,不要訪問其它微服務的數據庫
- 微服務可以將自己的業務暴露為接口,供其它微服務調用
1.2 服務拆分案例準備
1.2.1 數據庫準備
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 '商品名稱',
`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;
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, '柳巖', '湖南省衡陽市');
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;
1.2.2 項目準備
cloud-demo:父工程,管理依賴
- order-service:訂單微服務,負責訂單相關業務
- user-service:用戶微服務,負責用戶相關業務
要求:
- 訂單微服務和用戶微服務都必須有各自的數據庫,相互獨立
- 訂單服務和用戶服務都對外暴露Restful的接口
- 訂單服務如果需要查詢用戶信息,只能調用用戶服務的Restful接口,不能查詢用戶數據庫
目錄結構:
初始項目鏈接:
https://download.csdn.net/download/weixin_45525272/86240297
1.2.3 項目導入指南
解壓,右鍵使用IDEA打開(或者直接在idea中選擇打開文件夾)
導入后,會在IDEA右下角出現彈窗:
點擊彈窗,然后按下圖選擇:
會出現這樣的菜單:
配置下項目使用的JDK:
1.3 實現遠程調用案例
在order-service服務中,有一個根據id查詢訂單的接口:
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根據id查詢訂單并返回
return orderService.queryOrderById(orderId);
}
}
根據id查詢訂單,返回值是Order對象,請求測試結果如圖:
其中的user為null
在user-service中有一個根據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);
}
}
查詢的結果如圖:
1.3.1.案例需求:
修改order-service中的根據id查詢訂單業務,要求在查詢訂單的同時,根據訂單中包含的userId查詢出用戶信息,一起返回。
因此,我們需要在order-service中 向user-service發起一個http的請求,調用http://localhost:8081/user/{userId}
這個接口。
大概的步驟是這樣的:
- 注冊一個RestTemplate的實例到Spring容器
- 修改order-service服務中的OrderService類中的queryOrderById方法,根據Order對象中的userId查詢User
- 將查詢的User填充到Order對象,一起返回
1.3.2.注冊RestTemplate
首先,我們在order-service服務中的OrderApplication啟動類中,注冊RestTemplate實例:
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.實現遠程調用
修改order-service服務中的com.yyl.order.service包下的OrderService類中的queryOrderById方法:
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查詢訂單
Order order = orderMapper.findById(orderId);
// 遠程查詢用戶詳細信息
// 2.url地址
String url = "http://localhost:8081/user/"+order.getUserId();
// 3.發起遠程調用
User user = restTemplate.getForObject(url, User.class);
// 4.存入order
order.setUser(user);
// 5.返回
return order;
}
}
添加了如下代碼
重啟微服務,再訪問請求:
沒有問題!
1.4. 案例模型總結:提供者與消費者
在服務調用關系中,會有兩個不同的角色:
服務提供者:一次業務中,被其它微服務調用的服務。(提供接口給其它微服務)
服務消費者:一次業務中,調用其它微服務的服務。(調用其它微服務提供的接口)
但是,服務提供者與服務消費者的角色并不是絕對的,而是相對于業務而言。
如果服務A調用了服務B,而服務B又調用了服務C,服務B的角色是什么?
- 對于A調用B的業務而言:A是服務消費者,B是服務提供者
- 對于B調用C的業務而言:B是服務消費者,C是服務提供者
因此,服務B既可以是服務提供者,也可以是服務消費者。
原文鏈接:https://blog.csdn.net/weixin_45525272/article/details/125844426
相關推薦
- 2022-08-29 教你nginx跳轉配置的四種方式_nginx
- 2022-12-11 Go?map發生內存泄漏解決方法_Golang
- 2022-07-23 SQL?Server中的邏輯函數介紹_MsSql
- 2023-07-05 parcel運行終端報錯Uncaught ReferenceError: parcelRequire
- 2022-08-23 使用Python腳本提取基因組指定位置序列_python
- 2022-09-15 Linux添加Python?path方法及修改環境變量的三種方法_python
- 2022-12-13 Docker鏡像的制作與使用淺析_docker
- 2022-07-22 實現自定義HTTP服務器
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支