最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot集成OpenFeign Demo詳解

 更新時(shí)間:2025年02月12日 11:19:14   作者:Alex_81D  
這篇文章主要為大家詳細(xì)介紹了Springboot集成OpenFeign Demo以及參數(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

最近整理一下微服務(wù)的文章,先拿一直用的OpenFeign開(kāi)刀

思考:微服務(wù)之間如何方便優(yōu)雅的實(shí)現(xiàn)服務(wù)間的遠(yuǎn)程調(diào)用

一、說(shuō)說(shuō)openFeign是什么吧

說(shuō)到這個(gè),那不得不先說(shuō)說(shuō)RPC

1.什么是RPC

RPC 全稱是 Remote Procedure Call ,即遠(yuǎn)程過(guò)程調(diào)用,其對(duì)應(yīng)的是我們的本地調(diào)用。RPC 的目的是:讓我們調(diào)用遠(yuǎn)程方法像調(diào)用本地方法一樣。

//本地調(diào)用
R result = orderService.findOrderByUserId(id);
//RPC遠(yuǎn)程調(diào)用  orderService為代理對(duì)象
R result = orderService.findOrderByUserId(id);

RPC框架設(shè)計(jì)架構(gòu)

2. 什么是Feign

Feign是Netflix開(kāi)發(fā)的聲明式、模板化的HTTP客戶端,F(xiàn)eign可幫助我們更加便捷、優(yōu)雅地調(diào)用HTTP API。

Feign可以做到使用 HTTP 請(qǐng)求遠(yuǎn)程服務(wù)時(shí)就像調(diào)用本地方法一樣的體驗(yàn),開(kāi)發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè) HTTP 請(qǐng)求。它像 Dubbo 一樣,consumer 直接調(diào)用接口方法調(diào)用 provider,而不需要通過(guò)常規(guī)的 Http Client 構(gòu)造請(qǐng)求再解析返回?cái)?shù)據(jù)。它解決了讓開(kāi)發(fā)者調(diào)用遠(yuǎn)程接口就跟調(diào)用本地方法一樣,無(wú)需關(guān)注與遠(yuǎn)程的交互細(xì)節(jié),更無(wú)需關(guān)注分布式環(huán)境開(kāi)發(fā)。

Spring Cloud openfeign對(duì)Feign進(jìn)行了增強(qiáng),使其支持Spring MVC注解,另外還整合了Ribbon和Eureka,從而使得Feign的使用更加方便。

2.1 OpenFeign和Feign的區(qū)別

Feign

Feign是SpringCloud組件中的一個(gè)輕量級(jí)RESTful的Http服務(wù)客戶端,F(xiàn)eign內(nèi)置了Ribbon,用來(lái)做客戶端負(fù)載均衡,去調(diào)用服務(wù)注冊(cè)中心的服務(wù)。Feign的使用方式是:使用Feign的注解定義接口,調(diào)用這個(gè)接口,就可以調(diào)用服務(wù)注冊(cè)中心的服務(wù)。

OpenFeign

OpenFeign是SpringCloud在Feign的基礎(chǔ)上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通過(guò)動(dòng)態(tài)代理的方式產(chǎn)生實(shí)現(xiàn)類,實(shí)現(xiàn)類中做負(fù)載均衡并調(diào)用其他服務(wù)。

2.2 Ribbon&Feign對(duì)比

Ribbon+RestTemplate進(jìn)行微服務(wù)調(diào)用

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}
 
//調(diào)用方式
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);

Feign進(jìn)行微服務(wù)調(diào)用

@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {
    @RequestMapping("/findOrderByUserId/{userId}")
    public R findOrderByUserId(@PathVariable("userId") Integer userId);
}
 
//調(diào)用
@Autowired
OrderFeignService orderFeignService;
//feign調(diào)用
R result = orderFeignService.findOrderByUserId(id);

2.3 Feign的設(shè)計(jì)架構(gòu) 

二、Spring Cloud Alibaba快速整合Feign

下面是Springboot集成OpenFeign Demo,完全照著來(lái)妥妥的沒(méi)問(wèn)題

服務(wù)提供者我就不寫了,這就是正常的controller,主要是調(diào)用者這塊,接下來(lái)寫的也是這個(gè)

1.在pom.xml文件中添加以下依賴

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

2.調(diào)用端添加啟動(dòng)注解 @EnableFeignClients

@EnableAsync
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class })
@EnableDiscoveryClient
@EnableFeignClients  //掃描和注冊(cè)feign客戶端的beanDefinition
@MapperScan("com.**.**.**.**.mapper")
public class Application {
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3.編寫調(diào)用接口+@FeignClient注解

創(chuàng)建一個(gè)FeignClient接口,用于定義要調(diào)用的遠(yuǎn)程服務(wù)的方法:

@FeignClient(value = "base-application", path = "/base")
@RequestMapping("/api/testDemo")
public interface OpenFeignBaseDemo {
 
    @PostMapping("/queryList")
    String queryList(@RequestBody JSONObject jsonObject);
}

在上面的代碼中,我們使用@FeignClient注解指定了要調(diào)用的遠(yuǎn)程服務(wù)的名稱。然后,我們定義了一個(gè)名為queryList的方法,并使用@PostMapping注解指定了要調(diào)用的遠(yuǎn)程服務(wù)的API路徑。

4.發(fā)起調(diào)用,像調(diào)用本地方式一樣調(diào)用遠(yuǎn)程服務(wù)

在其他類中使用OpenFeignBaseDemo 來(lái)調(diào)用遠(yuǎn)程服務(wù)的方法

@RestController
@RequestMapping("/openFeignDemo")
public class OpenFeignControllerDemo {
 
    @Autowired
    private OpenFeignBaseDemo openFeignBase;
 
    @PostMapping(value = "/test", produces = { "application/json;charset=utf-8" })
    public ResponseEntity test(@RequestBody JSONObject jsonObject) {
        //feign調(diào)用
        String res = openFeignBase.queryList(jsonObject);
        return new ResponseEntity(res, HttpStatus.OK);
    }
 
}

5.結(jié)果預(yù)覽

啟動(dòng)兩個(gè)工程,postmain調(diào)用 請(qǐng)求url :localhost:8088/server/openFeignDemo/test。

6.這里我必須強(qiáng)調(diào)一下第3步這個(gè)參數(shù)設(shè)置的含義

public @interface FeignClient {
    @AliasFor("name")
    String value() default "";
 
    String contextId() default "";
 
    @AliasFor("value")
    String name() default "";
 
    String qualifier() default "";
 
    String url() default "";
 
    boolean decode404() default false;
 
    Class<?>[] configuration() default {};
 
    Class<?> fallback() default void.class;
 
    Class<?> fallbackFactory() default void.class;
 
    String path() default "";
 
    boolean primary() default true;
}

下面就對(duì)各個(gè)屬性進(jìn)行分析

1.value、name

value和name的作用一樣,如果沒(méi)有配置url那么配置的值將作為服務(wù)名稱,用于服務(wù)發(fā)現(xiàn)。反之只是一個(gè)名稱。

2.contextId

我們不想將所有的調(diào)用接口都定義在一個(gè)類中,有一種解決方案就是為每個(gè)Client手動(dòng)指定不同的contextId,這樣就不會(huì)沖突了。

3.url

url用于配置指定服務(wù)的地址,相當(dāng)于直接請(qǐng)求這個(gè)服務(wù),不經(jīng)過(guò)Ribbon的服務(wù)選擇。像調(diào)試等場(chǎng)景可以使用。

4.decode404

當(dāng)調(diào)用請(qǐng)求發(fā)生404錯(cuò)誤時(shí),decode404的值為true,那么會(huì)執(zhí)行decoder解碼,否則拋出異常。

5.configuration

configuration是配置Feign配置類,在配置類中可以自定義Feign的Encoder、Decoder、LogLevel、Contract等。

6.fallback

定義容錯(cuò)的處理類,也就是回退邏輯,fallback的類必須實(shí)現(xiàn)Feign Client的接口,無(wú)法知道熔斷的異常信息。

7.fallbackFactory

也是容錯(cuò)的處理,可以知道熔斷的異常信息。

8.path

path定義當(dāng)前FeignClient訪問(wèn)接口時(shí)的統(tǒng)一前綴,比如接口地址是/user/get, 如果你定義了前綴是user, 那么具體方法上的路徑就只需要寫/get 即可。

9.primary

primary對(duì)應(yīng)的是@Primary注解,默認(rèn)為true,官方這樣設(shè)置也是有原因的。當(dāng)我們的Feign實(shí)現(xiàn)了fallback后,也就意味著Feign Client有多個(gè)相同的Bean在Spring容器中,當(dāng)我們?cè)谑褂聾Autowired進(jìn)行注入的時(shí)候,不知道注入哪個(gè),所以我們需要設(shè)置一個(gè)優(yōu)先級(jí)高的,@Primary注解就是干這件事情的。

10.qualifier

qualifier對(duì)應(yīng)的是@Qualifier注解,使用場(chǎng)景跟上面的primary關(guān)系很淡,一般場(chǎng)景直接@Autowired直接注入就可以了。

7.報(bào)錯(cuò)解決

如果遇到這樣的錯(cuò)誤:feign.RetryableException: Read timed out executing POST 

可以做如下處理:yaml配置

feign:
  client:
    config:
      default:
        connectTimeout: 1000
        readTimeout: 6000

或者propertis配置

feign.client.config.default.connect-timeout=20000
feign.client.config.default.read-timeout=20000  

到此這篇關(guān)于Springboot集成OpenFeign Demo詳解的文章就介紹到這了,更多相關(guān)Springboot集成OpenFeign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 實(shí)現(xiàn)Java線程的取值并返回的方法

    實(shí)現(xiàn)Java線程的取值并返回的方法

    在本篇文章中我們給大家分享了關(guān)于Java線程的取值并返回的實(shí)現(xiàn)方法,對(duì)此有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2018-10-10
  • Spring-data-redis操作redis知識(shí)總結(jié)

    Spring-data-redis操作redis知識(shí)總結(jié)

    這篇文章主要介紹了Spring-data-redis操作redis知識(shí)總結(jié),spring-data-redis是spring-data模塊的一部分,專門用來(lái)支持在spring管理項(xiàng)目對(duì)redis的操作。
    2017-04-04
  • MyBatis框架中Executor執(zhí)行器的使用及說(shuō)明

    MyBatis框架中Executor執(zhí)行器的使用及說(shuō)明

    文章詳細(xì)介紹了MyBatis的Executor執(zhí)行器,包括其定義、作用、生命周期、四種可選執(zhí)行器類型(SIMPLE、REUSE、BATCH、CachingExecutor)以及它們?cè)趫?zhí)行鏈路中的協(xié)作關(guān)系,文章還討論了插件機(jī)制、緩存機(jī)制、事務(wù)管理以及常見(jiàn)誤區(qū)澄清等內(nèi)容
    2025-11-11
  • Java利用Spire.XLS for Java實(shí)現(xiàn)自動(dòng)化生成PDF文檔

    Java利用Spire.XLS for Java實(shí)現(xiàn)自動(dòng)化生成PDF文檔

    在 Java 后端高效靈活地實(shí)現(xiàn) PDF 文檔的生成,常常是困擾開(kāi)發(fā)者的一個(gè)痛點(diǎn),本文將為您介紹如何利用 Spire.XLS for Java 輕松駕馭 Java 中的 PDF 文檔生成,感興趣的小伙伴可以了解下
    2026-02-02
  • MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名

    MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名

    這篇文章主要介紹了MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 兩張動(dòng)圖--帶你搞懂TCP的三次握手與四次揮手

    兩張動(dòng)圖--帶你搞懂TCP的三次握手與四次揮手

    TCP是一種傳輸控制協(xié)議,是面向連接的、可靠的、基于字節(jié)流之間的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,TCP完成第四層傳輸層所指定的功能
    2021-06-06
  • SpringBoot AOP使用筆記

    SpringBoot AOP使用筆記

    今天小編就為大家分享一篇關(guān)于SpringBoot AOP使用筆記,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • 解決java.util.NoSuchElementException異常的問(wèn)題

    解決java.util.NoSuchElementException異常的問(wèn)題

    這篇文章主要介紹了解決java.util.NoSuchElementException異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • MyBatis驗(yàn)證多級(jí)緩存及 Cache Aside 模式的應(yīng)用小結(jié)

    MyBatis驗(yàn)證多級(jí)緩存及 Cache Aside 模式的應(yīng)用小結(jié)

    本文介紹了MyBatis的多級(jí)緩存機(jī)制,包括本地緩存和全局緩存,并通過(guò)Spock測(cè)試框架驗(yàn)證了多級(jí)緩存的實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • JavaSwing BorderLayout 邊界布局的實(shí)現(xiàn)代碼

    JavaSwing BorderLayout 邊界布局的實(shí)現(xiàn)代碼

    這篇文章主要介紹了JavaSwing BorderLayout 邊界布局的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

毕节市| 桐柏县| 兴化市| 营口市| 乌拉特前旗| 河东区| 盐城市| 广州市| 湛江市| 教育| 东平县| 仁布县| 甘泉县| 宾阳县| 灌云县| 永修县| 临西县| 广宁县| 大冶市| 得荣县| 黄浦区| 湄潭县| 新昌县| 宁晋县| 建平县| 宁陵县| 台中县| 清丰县| 南川市| 贡觉县| 胶南市| 古丈县| 夹江县| 昆山市| 肇源县| 沅陵县| 新兴县| 汉阴县| 聊城市| 株洲市| 思茅市|