day07-OpenFeign-服務調用

来源:https://www.cnblogs.com/liyuelian/archive/2023/04/11/17307243.html
-Advertisement-
Play Games

SpringCloud OpenFeign-服務調用 1.OpenFeign介紹 https://github.com/spring-cloud/spring-cloud-openfeign OpenFeign是一個聲明式WebService客戶端,使用OpenFeign讓編寫Web Service ...


SpringCloud OpenFeign-服務調用

1.OpenFeign介紹

https://github.com/spring-cloud/spring-cloud-openfeign

  1. OpenFeign是一個聲明式WebService客戶端,使用OpenFeign讓編寫Web Service客戶端更加簡單
  2. 它的使用方法是定義一個服務埠然後在上面添加註解
  3. OpenFeign也支持可插拔式的編碼器和解碼器
  4. SpringCloud對OpenFeign進行了封裝使其支持SpringMVC標準註解和HttpMessageConverters消息轉換器
  5. OpenFeign可以與Eureka和Ribbon組合使用以支持負載均衡

2.OpenFeign和Feign的區別

  • Feign
    1. Feign是SpringCloud組件中的一個輕量級RESTful的Http服務客戶端
    2. Feign內置了Ribbon,用來做客戶端負載均衡,去調用服務註冊中心的服務
    3. Feign的使用方法是:使用Feign的註解定義介面,調用服務註冊中心的服務
    4. Feign支持的註解和用法請參考官方文檔:OpenFeign/feign: Feign makes writing java http clients easier (github.com)
    5. Feign本身不支持SpringMVC註解,它有一套自己的註解
    6. Feign集成了Ribbon、RestTemplate實現了負載均衡的執行Http調用,只不過對原有的方式(Ribbon+RestTemplate)進行了封裝,開發者不必手動使用RestTemplate調服務,而是定義一個介面,在這個介面中標註一個註解即可完成服務調用,這樣更加符合面向介面編程的宗旨,簡化了開發。
  • OpenFeign
    1. OpenFeign是SpringCloud在Feign的基礎上支持了SpringMVC的註解,如@RequestMapping等
    2. OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping註解下的介面
    3. OpenFeign通過動態代理的方式產生實現類,實現類中做負載均衡並調用其他服務
  • 一句話:OpenFeign就是在Feign的基礎上做了加強

3.OpenFeign應用實例

需求分析:如下,將原來使用Ribbon+RestTemplate實現:獲取服務+遠程調用+負載均衡,替換為使用OpenFeign來實現

image-20230410184244233

參考 member-service-consumer-80 創建 member-service-consumer-openfeign-80(步驟參考以前)

(1)創建新模塊-member-service-consumer-openfeign-80

(2)修改 pom.xml:拷貝 member-service-consumer-80 的 pom.xml 依賴,並加入 openfeign-starter

<!-- 引入 openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(3)創建application.yml

server:
  port: 80

spring:
  application:
    name: e-commerce-consumer-openfeign-80
eureka:
  client:
    register-with-eureka: true #將自己註冊到EurekaServer
    fetch-registry: true
    service-url:
      #將自己註冊都哪個EurekaServer
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

(4)創建主啟動類

package com.li.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author 李
 * @version 1.0
 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients//啟動OpenFeignClient
public class MemberConsumerOpenfeignApplication {
    public static void main(String[] args) {
        SpringApplication
                .run(MemberConsumerOpenfeignApplication.class,args);
    }
}

(5)創建介面,該介面最終是由OpenFeign來實現的(這裡是OpenFeign的核心

  1. @FeignClient(value = "MEMBER-SERVICE-PROVIDER") 指定遠程調用的地址別名
  2. 註意這裡的 @GetMapping("/member/get/{id}") 指定要調用服務方的哪個方法,路徑要和服務方的路徑匹配。這是OpenFeign支持的SpringMVC的註解
package com.li.springcloud.service;

import com.li.springcloud.entity.Member;
import com.li.springcloud.utils.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author 李
 * @version 1.0
 */
@Component
//MEMBER-SERVICE-PROVIDER 是服務提供方[集群]註冊到EurekaServer的別名
//根據這個key,可以在EurekaServer提供的註冊信息中找到對應value,即真正的服務方地址:http://ip+port
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")
public interface MemberFeignService {
    //定義方法-遠程調用的介面

    /**
     * 1.遠程調用的方式是get
     * 2.遠程調用的url http://ip+port/member/get/{id}
     * 3.MEMBER-SERVICE-PROVIDER 是服務提供方[集群]註冊到EurekaServer的別名
     * 4.OpenFeign會根據負載均衡來決定要掉用服務提供方的哪個節點(預設是輪詢)
     * 5.OpenFeign的好處是支持了SpringMVC註解+使用介面解耦
     * @param id
     * @return
     */
    @GetMapping("/member/get/{id}")
    public Result<Member> getMemberById(@PathVariable("id") Integer id);
}

(6)創建MemberConsumerFeignController.java

這裡的@GetMapping("/member/consumer/openfeign/get/{id}"),是消費方給瀏覽器的介面。

package com.li.springcloud.controller;

import com.li.springcloud.service.MemberFeignService;
import com.li.springcloud.utils.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author 李
 * @version 1.0
 */
@RestController
public class MemberConsumerFeignController {
    //裝配MemberFeignService,
    //使用時該介面會對應一個代理對象,通過代理對象可以該介面的方法
    @Resource
    private MemberFeignService memberFeignService;

    @GetMapping("/member/consumer/openfeign/get/{id}")
    public Result getMemberById(@PathVariable("id") Integer id) {
        return memberFeignService.getMemberById(id);
    }
}

(7)啟動EurekaServer,服務消費方,啟動本模塊主程式,在瀏覽器中訪問:http://localhost:80/member/consumer/openfeign/get/5,可以看到查詢數據成功,並且多次刷新會發現調用的介面是輪詢的。

image-20230411170725815

註意事項和使用細節

  • OpenFeign使用特點是 微服務調用介面+@FeignClient,使用介面進行解耦

  • 介面中的@FeignClient(value = "MEMBER-SERVICE-PROVIDER"),這裡的MEMBER-SERVICE-PROVIDER就是Eureka Server的服務提供方註冊的別名,底層會通過這個別名(key)找到真正的地址(value)

  • 介面中的方法,value是不能亂寫的,要根據服務消費方的url一致,否則無法訪問到服務消費方對應的方法

    image-20230411171610243

4.OpenFeign的日誌配置

4.1基本介紹

  1. Feign提供了日誌列印功能,可以通過配置來調整日誌級別,從而對Feign介面的調用情況進行監控和輸出

  2. 日誌級別

    • NONE:預設的,不顯示任何日誌
    • BASIC:僅記錄請求方法、URL、響應狀態碼和執行時間
    • HEADERS:除了BASIC中定義的信息之外,還有請求和響應的頭信息
    • FULL:除了HEADERS中定義的信息之外,還有請求和響應的正文及元數據
    image-20230411172141337

4.2日誌配置-應用實例

(1)在member-service-consumer-80創建OpenFeignConfig.java

package com.li.springcloud.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 李
 * @version 1.0
 */
@Configuration
public class OpenFeignConfig {
    @Bean
    public Logger.Level loggerLevel() {
        return Logger.Level.FULL;
    }
}

(2)修改application.yml

logging:
  level:
    #對MemberFeignService介面調用過程列印信息-Debug
    com.li.springcloud.service.MemberFeignService: debug

常見的日誌級別有 5 種,分別是 error、warn、info、debug、trace

error:錯誤日誌,指比較嚴重的錯誤,對正常業務有影響,需要運維配置監控的;

warn:警告日誌,一般的錯誤,對業務影響不大,但是需要開發關註;

info:信息日誌,記錄排查問題的關鍵信息,如調用時間、出參入參等等;

debug:用於開發 DEBUG 的,關鍵邏輯裡面的運行時數據;

trace:最詳細的信息,一般這些信息只記錄到日誌文件中。

(3)重啟模塊,瀏覽器訪問消費模塊,後臺輸出如下:

image-20230411173306168

5.OpenFeign超時時間配置

OpenFeign調用服務的預設時長是1秒鐘,也就是如果超過1秒沒連接上或者超過1秒沒響應,那麼會相應的報錯。

image-20230411181907078

而實際會因為業務的不同出現超出1秒的情況,這時我們需要調整超時時間:

https://cloud.tencent.com/developer/article/1444369

Feign 的負載均衡底層用的就是 Ribbon。在application.yml中添加如下配置,超過8秒沒連接上報連接超時,如果超過8秒沒有響應,報請求超時

#全局配置
ribbon:
  # 設置feign客戶端超時時間(OpenFeign預設支持ribbon),單位ms,預設超時時間為1s
  ReadTimeout: 8000
  #兩端連接所用時間
  ConnectionTimeout: 8000

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 經典設計模式源碼詳解,用不同語言來實現,包括Java/JS/Python/TypeScript/Go等。結合實際場景,充分註釋說明,每一行代碼都經過檢驗,確保可靠。 設計模式是一個程式員進階高級的必然選擇,不懂設計模式,就像寫文章不懂得層次,蓋房子沒有結構。只有充分懂得設計之道,才能真正設計出良好的... ...
  • 本文轉載自國外論壇 medium,原文地址: https://medium.com/navan-tech/7-java-features-you-might-not-have-heard-of-adee8166d942,由博主簡譯後給大家帶來! Show me your code and I wil ...
  • 前言 在上一篇文章中,我們介紹了&運算符的高級用法,本篇文章,我們將介紹| 運算符的一些高級用法。 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、將兩個位元組合併成一個16位整數 #include <stdio ...
  • 最近互聯網行業一片哀嘆,這是受到三年影響的後遺症,許多的公司也未能挺過寒冬,一些外資也開始撤出市場,因此許多的IT從業人員加入失業的行列,而且由於公司較少導致許多人求職進度緩慢,很不幸本人也是其中之一。自從參加工作以來,一直都是忙忙碌碌,開始總認為工作只是為了更好的生活,但是一旦工作停下來後自己就覺 ...
  • 註意,該項目為Python基礎語法的一個綜合,項目資料庫。 #學員管理系統 """ 學員管理系統 1. 系統簡介 需求:進入系統顯示系統功能界面,功能如下: 1、添加學員 2、刪除學員 3、修改學員信息 4、查詢學員信息 5、顯示所有學員信息 6、退出系統 系統共6個功能,用戶根據自己需求選取。 " ...
  • 昨天出現一個生產問題。我們的channel系統代碼里,調用其中一個三方服務商的http介面時未設置超時時間。碰巧昨天出現一筆http請求持續數小時始終無響應,加之程式是單線程處理交易請求,就出現因為線程一直處於RUNNABLE狀態而導致系統生產能力嚴重下降。 現在說這個結論很easy,而昨天排查這個 ...
  • 1.struct 簡單介紹 struct 是 Python 的內置模塊, 在使用 socket 通信的時候, 大多數據的傳輸都是以二進位流的形式的存在, 而 struct 模塊就提供了一種機制, 該機制可以將某些特定的結構體類型打包成二進位流的字元串然後再網路傳輸,而接收端也應該可以通過某種機制進行 ...
  • Kafka 環境搭建 kafka 安裝、配置、啟動、測試說明: 1. 安裝:直接官網下載安裝包,解壓到指定位置即可(kafka 依賴的 Zookeeper 在文件中已包含) 下載地址:https://kafka.apache.org/downloads 示例版本:kafka_2.13-2.8.0.t ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...