SpringCloud原理-OpenFeign篇(一、Hello OpenFeign項目示例)

文章目錄

  • 前言
  • 正文
    • 一、項目結構
    • 二、服務調用鏈路說明
    • 三、Rpc調用鏈路說明
    • 四、項目代碼
      • 4.1 client 模塊中的feign接口
      • 4.2 client 中的rest接口
      • 4.3 client 中的啟動類
      • 4.4 server中的rest接口
      • 4.5 server中的配置文件
    • 五、調試
  • 附錄
    • 附1:本系列文章鏈接

前言

本篇是SpringCloud原理系列的 OpenFeign 模塊的第一篇。主要內容是搭建一個極簡的Spring Cloud OpenFeign 調用鏈路。

項目代碼倉庫地址:https://gitee.com/fengsoshuai/springcloud-openfeign-demo

正文

本次項目使用java 17,spring cloud 4.0.4,springboot 3.1.4。
maven 環境編譯,idea開發。

一、項目結構

本次項目分為3個模塊。
在這里插入圖片描述
在這里插入圖片描述

二、服務調用鏈路說明

在這里插入圖片描述

  1. 使用IDEA/Postman/Apifox等工具進行觸發client服務的接口
  2. client內部通過feign調用server接口
  3. server執行業務邏輯
  4. server返回執行結果到client
  5. client返回調用結果到觸發方

三、Rpc調用鏈路說明

兩個服務之間,使用遠程調用。
基本都是需要URL,請求頭,請求報文,請求方式(Get\Post 等)等基本信息的。
下圖簡單說明rpc調用時的鏈路。
在這里插入圖片描述
其中,調用方,相當于發起遠程調用的一方,對比本項目的話,相當于使用postman等工具觸發后,client模塊的操作。

只是特殊的一點在于,調用方中的紅色虛線框內的部分,被openFeign 封裝了,不再是我們手動去處理他們。而這也正是本系列研究的重點。

中間部分,就是形如 RestTemplate,WebClient的功能,只是發出請求,接受響應。

服務方,就是一個提供rest接口的普通應用。

四、項目代碼

本文全部代碼托管在gitte倉庫中,地址已經在文章開頭給出。
這里只粘貼出比較重要的幾個文件。

4.1 client 模塊中的feign接口

package org.feng.feigns;import org.feng.common.dto.HelloRequest;
import org.feng.common.dto.HelloResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;/*** hello-feign客戶端接口** @version v1.0* @author: fengjinsong* @date: 2023年11月20日 21時25分*/
@FeignClient(name = "helloFeignClient", url = "http://localhost:10080")
public interface HelloFeignClient {@PostMapping("/hello/post")HelloResponse postHello(@RequestBody HelloRequest helloRequest);
}

4.2 client 中的rest接口

package org.feng.controller;import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.feng.common.dto.HelloRequest;
import org.feng.common.dto.HelloResponse;
import org.feng.feigns.HelloFeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import java.time.LocalDateTime;
import java.util.Objects;/*** HelloFeignClientController** @version v1.0* @author: fengjinsong* @date: 2023年11月20日 21時45分*/
@Slf4j
@RestController
@RequestMapping("/helloclient")
public class HelloFeignClientController {@Resourceprivate HelloFeignClient helloFeignClient;@PostMapping("/postHello")public HelloResponse postHello(@RequestBody HelloRequest helloRequest) {if(Objects.isNull(helloRequest.getLocalDateTime())){helloRequest.setLocalDateTime(LocalDateTime.now());}ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();String localAddr = request.getLocalAddr();int serverPort = request.getServerPort();helloRequest.setHost(localAddr);helloRequest.setPort(serverPort);log.info("helloRequest  {}", helloRequest);return helloFeignClient.postHello(helloRequest);}
}

4.3 client 中的啟動類

指定掃描包為 org.feng.feigns

package org.feng;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@EnableFeignClients(basePackages = "org.feng.feigns")
@SpringBootApplication
public class ClientApplication {public static void main(String[] args) {SpringApplication.run(ClientApplication.class, args);}}

4.4 server中的rest接口

package org.feng.controller;import lombok.extern.slf4j.Slf4j;
import org.feng.common.dto.HelloRequest;
import org.feng.common.dto.HelloResponse;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** openfeign 控制器** @author feng*/
@Slf4j
@RequestMapping("/hello")
@RestController
public class HelloOpenFeignController {@PostMapping("/post")public HelloResponse postHello(@RequestBody HelloRequest helloRequest) {log.info("request:{}", helloRequest);HelloResponse response = new HelloResponse();response.setTitle(helloRequest.getTitle());response.setLocalDateTime(helloRequest.getLocalDateTime());response.setFromHost(helloRequest.getHost());response.setFromPort(helloRequest.getPort());log.info("response: {}", response);return response;}
}

4.5 server中的配置文件

spring.application.name=openserver
server.port=10080

五、調試

啟動server 和 client 服務。
在idea中觸發client 的服務:

POST http://localhost:8080/helloclient/postHello
Content-Type: application/json{"title": "托爾斯泰"
}

響應報文如下:

{"fromHost": "127.0.0.1","fromPort": 8080,"title": "托爾斯泰","localDateTime": "2023-11-21T14:07:18.537384"
}

server中的服務,打印出來的日志如下:
在這里插入圖片描述
以上就是通過onepfeign 進行rpc 調用的完整示例了。

可以看到,我們只在client中定義了接口,并沒有實現。但是在調用時,沒有報錯,同時也調用到了server服務。而這,就是spring cloud 中的 openfeign 封裝了遠程調用,幫我們處理的部分,也是我們后續研究其原理的核心部分。

附錄

附1:本系列文章鏈接

SpringCloud原理-OpenFeign篇(一、Hello OpenFeign項目示例)
SpringCloud原理-OpenFeign篇(二、OpenFeign包掃描和FeignClient的注冊原理)
SpringCloud原理-OpenFeign篇(三、FeignClient的動態代理原理)

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

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

相關文章

示波器探頭講解及案例分享

示波器探頭講解 示波器探頭 分為X1、X10檔: X1檔,表示被測量的信號沒有經過衰減進入示波器 X10檔,表示被測量的信號衰減10倍進入示波器(當示波器也設置為10X檔,直接讀數即可,但是當示波器設置為1X檔&…

vue 目錄樹的展開與關閉

目錄 1、翻頁方法中控制目錄樹節點的展開與關閉2、搜索目錄樹節點名稱控制節點的展開與關閉 <el-tree:data"data_option"ref"tree":props"defaultProps"node-click"handleNodeClick":default-expanded-keys"needExpandedKeys&…

1、開發工具介紹及軟件安裝

軟件安裝 百度網盤鏈接&#xff1a;https://pan.baidu.com/s/1J7sgXntt9eLNBhI1Dc6MsQ?pwd2023 提取碼&#xff1a;2023 # 一 Keil5安裝步驟&#xff1a; 激活&#xff1a; STC-ISP安裝步驟&#xff1a; STC-ISP.exe安裝即用 安裝CH340_CH341驅動程序 所有學習課程和資源…

【vue】ant-design-vue的樹結構實現節點增刪改查

根據業務需要&#xff0c;實現樹結構的節點新增編輯刪除功能&#xff0c;主要邏輯是利用樹節點的scopedSlots屬性對其進行自定義改造&#xff0c;監聽懸停事件在節點右側出現增刪改對應圖標&#xff0c;點擊圖標出現彈窗表單對內容進行修改&#xff0c;具體代碼如下&#xff1a…

藍橋杯每日一題2023.11.23

題目描述 題目分析 本題使用遞歸模擬即可&#xff0c;將每一個大格子都可以拆分看成幾個小格子&#xff0c;先將最開始的數字進行填入&#xff0c;使每一個對應小格子的值都為大格子對應的數&#xff0c;搜索找到符合要求的即可 &#xff08;答案&#xff1a;50 33 30 41&am…

Vue3+ts學習筆記2

<script setup lang"ts"> import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted} from vueonBeforeMount(()>{console.log(---掛載之前---) })onMounted(()>{console.log(---掛載---) })onBeforeUpdate(()>{consol…

Python爬取京東商品銷售數據進行數據分析示例代碼,以口紅為例

文章目錄 一、準備工作驅動安裝模塊使用與介紹 二、流程解析三、完整代碼四、效果展示關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Python學習書籍四、Python工具包項目源碼合集①Python工具包②Python實戰案例③Python小游戲源碼五、面試資…

git代碼提交命令(如何提交代碼)

# 提交暫存區到倉庫區 $ git commit -m [message]# 提交暫存區的指定文件到倉庫區 $ git commit [file1] [file2] ... -m [message]# 提交工作區自上次commit之后的變化&#xff0c;直接到倉庫區 $ git commit -a# 提交時顯示所有diff信息 $ git commit -v# 使用一次新的commit…

2023年中國釩鐵產量及行業進出口現狀分析[圖]

釩鐵&#xff0c;銀白色塊狀&#xff0c;一般分為桶裝或噸袋包裝&#xff0c;根據釩含量的不同分為50釩鐵&#xff08;FeV50&#xff09;和80釩鐵&#xff08;FeV80&#xff09;,通過爐外法或電爐法冶煉生產&#xff0c;北方多以爐外法制取&#xff0c;南方多為電爐法生產。 釩…

Chrome瀏覽器將從2024年6月開始限制廣告攔截器

雖然一年前&#xff0c;谷歌公司已經暫停推出新的“Manifest V3”擴插件展格式&#xff0c;原因是這種新格式會對 Chrome 中一些最受歡迎的擴展插件造成嚴重損害&#xff1b;一年后今天&#xff0c;Google 正在重新啟動該計劃&#xff0c;逐步淘汰 Chrome 擴展程序當前的 Manif…

Faster R-CNN源碼解析(一)

目錄 前言訓練腳本(train_mobilenetv2.py)自定義數據集(my_dataset.py) 前言 Faster R-CNN 是經典的two-stage目標檢測模型&#xff0c; 原理上并不是很復雜&#xff0c;也就是RPNFast R-CNN&#xff0c;但是在代碼的實現上確實有很多細節&#xff0c;并且源碼也非常的多&…

chatglm3部署使用

chatglm3部署使用 1.部署2.使用3.接入微信4.vue前端 1.部署 1.首先去github下載chatglm3代碼。Huggingface下載模型一直失敗&#xff0c;所以用阿里的魔塔社區下載。 git clone https://github.com/THUDM/ChatGLM3.git git clone https://www.modelscope.cn/ZhipuAI/chatglm3…

docker常見問題匯總

docker常見問題 ?問題1&#xff1a;啟動docker容器時&#xff0c;報錯Unknown runtime specified nvidia. 當我啟動一個容器時&#xff0c;運行以下命令&#xff1a; docker run --runtimenvidia 。。。。 后面一部分命令沒寫出來&#xff0c;此時報錯的信息如下&#xff1a;…

python-opencv劃痕檢測

python-opencv劃痕檢測 這次實驗&#xff0c;我們將對如下圖片進行劃痕檢測&#xff0c;其實這個比較有難度&#xff0c;因為清晰度太差了。 我們做法如下&#xff1a; &#xff08;1&#xff09;讀取圖像為灰度圖像&#xff0c;進行自適應直方圖均衡化處理&#xff0c;增強圖…

thingsboard3.6的mailConfigTemplateController錯誤

1、bug內容 使用3.6版本的tb代碼進行打包生成boot的jar包,在啟動的時候會報錯mailConfigTemplateController bean初始化找不到文件路徑。 Error creating bean with name mailConfigTemplateController defined in URL [jar:file:/D:/yuxinwei/AE/thingsboard/thingsboard-3…

nuxt3項目修改端口號

nuxt的默認端口號是3000 一、修改開發環境端口號 方式一&#xff1a;使用環境變量配置,設置&#xff08;PORT 或 NUXT_PORT&#xff09; # .env PORT3001 #http://localhost:3001/ NITRO_PORT3001 #http://localhost:3001/ 方式二&#xff1a;nuxt.config.ts里配置…

vue2.0+elementui集成file-loader之后圖標失效問題

背景 跑vue2elementUI項目時&#xff0c;由于前端這邊需要在本地存放xlsx模板文件&#xff0c;供用戶下載模板文件&#xff0c;所以需要在webpack構建的時候增加file-loader進行解析xlsx文件打包。 vue版本2.x element-ui 版本 2.13.x 注意 npm i -D file-loader版本號給vue項…

操作系統 day12(調度算法的評價指標)

評價指標 CPU利用率 系統吞吐量 周轉時間 帶權周轉時間 等待時間 響應時間

vue中屬性的基本用法

v-for指令的用法 v-for指令用于重復輸出當前元素。 案例&#xff1a;寫一個新的組件頁面&#xff1a;For.vue 當訪問&#xff1a; /for時看到它。 場景1 遍歷字符串數組輸出每一個列表項元素&#xff1a; data: {nav: [京東超市,京東家電,秒殺,拍賣,京東生鮮,PLUS會員] } …

【python學習】中級篇-TCP編程Socket模塊:客戶端與服務端

客戶端 創建一個基于TCP連接的Socket AF_INET指定使用IPv4協議 AF_INET6指定使用IPv6協議 # 導入socket庫: import socket# 創建一個socket: s socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立連接: s.connect((www.sina.com.cn, 80))客戶端要主動發起TCP連接 必…