springcloud-服務拆分與遠程調用

一 微服務

1.1簡單了解?SpringCloud?

SpringCloud是目前國內使用最廣泛的微服務框架。官網地址:Spring Cloud。

SpringCloud集成了各種微服務功能組件,并基于SpringBoot實現了這些組件的自動裝配,從而提供了良好的開箱即用體驗:

1.2微服務中的常用組件(面試)

我們腦海中因該出現一幅圖:

  • 首先,我們肯定有無數個小的微服務.
  • 這無數個微服務之間是不是要進行一個相互調用,那么就會用到 OpenFeign 這樣的組件.
  • 這么多服務要相互調用,怎么去管理呢,這就需要用到 nacos 組件去做注冊中心,那么所有的服務就會去找注冊中心去注冊自己的服務.
  • 那么我拉取到的服務可能是一個列表,那么將來在遠程調用的時候就需要做負載均衡,就需要使用 LoadBalancer 這個組件.
  • 這么多服務將來要做統一配置的管理怎么辦,就需要引入 nacos 作為配置中心.
  • 這時候微服務集群就形成了,將來對外提供服務,是不是隨便什么人都能訪問呢?顯然不行,所有在微服務群前面就需要有 gateway 網關 作為入口.
  • 那么就算你可以訪問了,萬一流量激增,引起微服務雪崩,給我整個服務搞崩了,肯定不行,因此就需要 sentinel 來做限流、熔斷降級保護.
  • 還有一個問題,在分布式系統下,就會引發分布式事務問題,如何解決呢,這就需要 Seata 上場了.

實際上,微服務的組件遠不止于此,還有很多的組件,但是以上呢,就是我們最常用的幾個組件啦!

二 服務拆分與遠程調用

1 服務拆分

前面我們了解到微服務需要對一塊大的服務,拆分成多個小的微服務,那么這個拆分的粒度我們應該如何去把控呢?需要我們注意一下幾點:

1. 單一職責:不同微服務,不要重復開發相同業務
2. 數據獨立:不要訪問其它微服務的數據庫
3. 面向服務:將自己的業務暴露為接口,供其它微服務調用
例如:我們將一個大的服務拆分成了訂單模塊和用戶模塊,并且每一個微服務有自己的數據庫(訂單數據庫和用戶數據庫)。由于在不同的數據庫中,因此只能通過訂單 id 查詢訂單數據,或者通過用戶 id 查詢用戶數據,不能交叉訪問,如下圖

2 遠程調用

相同的服務,我們可以直接通過 mapper 調用其數據庫,不同的服務如何相互調用呢?辦法很簡單,就如上圖,用戶模塊提供公開的訪問接口("/user/{id}"),訂單模塊主動向用戶模塊發送 http 請求獲取數據,這樣就做到了跨服務之間的調用~

2.1注冊RestTemplate

package cn.itcast.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;import javax.management.MXBean;@MapperScan("cn.itcast.order.mapper")
@SpringBootApplicationpublic class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}/*** 創建RestTemplate并注入Spring容器 ,發送http請求的** @return*/@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}

2.2 Mapper調用

在訂單服務中,通過 RestTemplate 的 getForObject / postForObject 方法來構造get / post 請求(此處顯然使用 get 請求獲取用戶數據),請求中攜帶的參數便是訂單表中的 userId 數據,當用戶微服務接收到請求后,就可以根據 userId 獲取用戶數據,最后返回到訂單服務中,這樣就實現了跨服務調用

package cn.itcast.order.service;import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查詢訂單Order order = orderMapper.findById(orderId);//2. 利用RestTemplate發起http請求,查詢用戶//2.1url路徑String url = "http://localhost:8081/user/" + order.getUserId();// 2.2發送http請求,實現遠程調用--對應get請求User user = restTemplate.getForObject(url, User.class);//3.封裝user到orderorder.setUser(user);// 4.返回return order;}
}

2.3 效果圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18148.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu24.04LVM擴容問題

目錄 一、 開機前設置:擴展 二、 開機后設置:分區管理 通過gparted管理分區有效做法。 一、 開機前設置:擴展 虛擬機關機。打開虛擬機設置。 掛起狀態是不能擴容的 這里選擇擴容到40G 二、 開機后設置:分區管理 使用gpar…

【Java基礎】IO流(2) —— 字符流

【Java基礎】IO流(1) —— 簡介 【Java基礎】IO流(2) —— 字符流 【Java基礎】IO流(3) —— 字節流 【Java基礎】IO流(4) —— 轉換流、打印流 【Java基礎】IO流(5) —— 序列流、內存流 【Java基礎】IO流(6) —— 隨機訪問文件流、數據流 字符流 文件流 文件輸出流 FileW…

英語學習筆記20——Look at them!

Look at them! 看看他們! 詞匯 Vocabulary big a. 大的(尺寸,年齡,音量……) 搭配:big cheese 大人物    big mouth 大嘴巴(傳話的人)    big talker 吹牛的人 例句&#xf…

【jest - 禁止自動跑test】

最近使用vscode,保存文件時,默認會觸發自動跑test,很煩人,記錄下配置如何配置關閉禁止自動跑jest測試。 打開setting.json,加上下面這句話,即可關閉自動跑 {"jest.runMode": "on-demand&q…

STL源碼刨析:序列式容器之list

目錄 1.前言 2.list的節點定義和結構 3.list的迭代器定義和結構 4.list的定義和結構 5.list的內存管理 6.list的元素操作 前言 在刨析了vector容器的源碼后,list容器相比與vector容器,其元素的插入和刪除較快,不需要對原本容器中的元…

[9] CUDA性能測量與錯誤處理

CUDA性能測量與錯誤處理 討論如何通過CUDA事件來測量它的性能如何通過CUDA代碼進行調試 1.測量CUDA程序的性能 1.1 CUDA事件 CPU端的計時器可能無法給出正確的內核執行時間CUDA事件等于是在你的CUDA應用運行的特定時刻被記錄的時間戳,通過使用CUDA事件API&#…

UVa1466/LA4849 String Phone

UVa1466/LA4849 String Phone 題目鏈接題意分析AC 代碼 題目鏈接 本題是2010年icpc亞洲區域賽大田賽區的G題 題意 平面網格上有n(n≤3000)個單元格,各代表一個重要的建筑物。為了保證建筑物的安全,警察署給每個建筑物派了一名警察…

MFC 用Imm類庫實現輸入法修改輸入模式

1.導入Imm類庫&#xff0c;電腦里都有 #include <Imm.h> #pragma comment(lib, "imm32.lib")2.在想要的地方增加代碼 HIMC himc ImmGetContext(m_hWnd);if (himc ! NULL) {ImmSetOpenStatus(himc, TRUE);ImmNotifyIME(himc, NI_COMPOSITIONSTR, CPS_CANCEL,…

時代終結,微軟宣布淘汰VBScript;Flink漏洞被廣泛利用;Grandoreiro銀行木馬強勢回歸,1500多家銀行成攻擊目標 | 安全周報0524

揭秘SolarMarker惡意軟件&#xff1a;多層次基礎設施讓清除工作陷入困境 Recorded Future的新發現表明&#xff0c;SolarMarker信息竊取惡意軟件背后的持續威脅行為者已經建立了一個多層次的基礎設施&#xff0c;以使執法部門的清除工作變得復雜。 該公司在上周發布的一份報告…

SwiftUI中AppStorage的介紹使用

在Swift中&#xff0c;AppStorage是SwiftUI中引入的一個屬性包裝器&#xff0c;在這之前我們要存儲一些輕量級的數據采用UserDefaults進行存取。而AppStorage用于從UserDefaults中讀取值&#xff0c;當值改變時&#xff0c;它會自動重新調用視圖的body屬性。也就是說&#xff0…

React@16.x(11)ref

目錄 1&#xff0c;介紹1.1&#xff0c;得到的結果 2&#xff0c;參數類型2.1&#xff0c;字符串&#xff08;不再推薦&#xff09;2.2&#xff0c;對象2.3&#xff0c;函數函數調用時機 3&#xff0c;注意點 1&#xff0c;介紹 reference 引用。和 vue 中的 refs 類似&#x…

IEC60870-5-104通信規約 | 報文解析 | 組織報文與解析報文(C++)

文章目錄 一、IEC60870-5-104通信規約1.IEC104的報文結構2.IEC104的報文格式--I/U/S格式2.1 I幀2.2 U幀2.3 S幀 3.應用服務數據單元ASDU 二、IEC60870-5-104規約通信過程報文幀解析三、組織報文與解析報文&#xff08;C&#xff09; 一、IEC60870-5-104通信規約 IEC60870-5-104…

golang 守護進程管理

添加守護進程 vim /etc/systemd/system/xxx.service [Unit] DescriptionGo Socket Service Afternetwork.target[Service] Typesimple ExecStart/data/quwan/quwan_ws WorkingDirectory/data/quwan # 停止前發送信號 ExecStop/bin/kill -SIGTERM $MAINPID # 如果超過20s 進程…

筆記-Python lambda

在學習python的過程中&#xff0c;lambda的語法時常會使人感到困惑&#xff0c;lambda是什么&#xff0c;為什么要使用lambda&#xff0c;是不是必須使用lambda&#xff1f; 下面就上面的問題進行一下解答。 1、lambda是什么&#xff1f; 看個例子&#xff1a; 1 g lambda…

什么是GPT-4o,推薦GPT-4o的獲取使用方法,使用GPT4o模型的最新方法教程(2024年5月16更新)

2024年5月最新GPT-4o模型使用教程和簡介 2024年5月最新GPT-4o模型使用教程和簡介 2024 年 5 月 13 日&#xff0c;openai 發布了最新的模型 GPT4o。 很多同學還不知道如何訪問GPT-4、GPT-4 Turbo和GPT-4o等模型&#xff0c;這篇文章介紹如何在ChatGPT中訪問GPT-4o&#xff0…

milvus索引

Milvus是一個開源的向量數據庫引擎&#xff0c;旨在支持大規模向量相似度搜索和分析。索引在Milvus中扮演著非常重要的角色&#xff0c;它們用于加速向量數據的檢索。下面詳細介紹一下Milvus中的索引&#xff1a; 1. 索引類型 Milvus支持多種索引類型&#xff0c;每種類型都適…

無人機偵察:雷達系統概述

一、雷達基本原理 無人機偵察中的雷達系統主要基于無線電波的傳播和反射原理。雷達發射機產生特定頻率的電磁波&#xff0c;并通過天線以定向波束形式向空間發射。當這些電磁波遇到目標時&#xff0c;部分能量會被反射回來&#xff0c;被雷達接收機捕獲。通過測量發射和接收電…

基于SpringBoot+Vue+Redis+Mybatis的商城購物系統 【系統實現+系統源碼+答辯PPT】

前言 該系統采用SpringBootVue前后端分離開發&#xff0c;前端是一個單獨的項目&#xff0c;后端是一個單獨的項目。 ??技術棧&#xff1a;SpringBootVueMybatisRedisMysql ??開發工具&#xff1a;IDEA、Vscode ??瀏覽器&#xff1a;Chrome ??開發環境&#xff1a;JDK1…

Pytorch 筆記

執行下面這段代碼后&#xff0c;為什么返回的是 2 &#xff1f; vector torch.tensor([7, 7]) vector.shape為什么返回的是 torch.Size([2])&#xff1f; 當你創建一個PyTorch張量時&#xff0c;它會記住張量中元素的數量和每個維度的大小。在你的代碼中&#xff0c;torch.t…

通過 js 調起微信官方的微信支付api

通過 js 調起微信官方的微信支付api function onBridgeReady() {WeixinJSBridge.invoke(getBrandWCPayRequest, { "appId": "wx2421b1c4370ec43b", // 公眾號ID&#xff0c;由商戶傳入 "timeStamp": "1395712654", // 時間戳&quo…