日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

SpringCloud服務(wù)拆分初探與案例解析

作者:流楚丶格念 更新時(shí)間: 2022-07-19 編程語(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

欄目分類(lèi)
最近更新