springboot2.x引入feign踩的坑及解決
springboot2.x引入feign踩的坑
一、需求
最近公司項(xiàng)目需求,需要調(diào)用第三方服務(wù)的接口,所以選用了feign來實(shí)現(xiàn)(這里只說springboot2.x的pom引用,沒有怎么使用,網(wǎng)上一大頓)。
二、什么是feign
feign是聲明式的web service客戶端,它讓微服務(wù)之間的調(diào)用變得更簡(jiǎn)單了,類似controller調(diào)用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign時(shí)提供負(fù)載均衡的http客戶端。
三、springboot1.x中feign的使用
這里不展示hystrix熔斷的配置和實(shí)現(xiàn)
3.1 在pom.xml中加入依賴
<!-- feign依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.2.2.RELEASE</version> </dependency> <!-- hystrix 斷路器依賴 用于處理請(qǐng)求第三方接口超時(shí) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.2.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> <version>1.2.3.RELEASE</version> </dependency>
3.2 在啟動(dòng)類上添加注解@EnableFeignClients
@EnableCaching
@EnableAutoConfiguration
@SpringBootApplication
@EnableConfigurationProperties
@ServletComponentScan//配置druid必須加的注解,如果不加,訪問頁面打不開,filter和servlet、listener之類的需要單獨(dú)進(jìn)行注冊(cè)才能使用,spring boot里面提供了該注解起到注冊(cè)作用
@EnableTransactionManagement
@EnableFeignClients
@EnableHystrix
@EnableCircuitBreaker
@EnableHystrixDashboard
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}3.3 啟動(dòng)springboot的啟動(dòng)類
四、springboot2.x中feign的使用
這里不展示hystrix熔斷的配置和實(shí)現(xiàn)
在另外項(xiàng)目中引用的時(shí)候用的是spring2.x,所以就出現(xiàn)問題了,引入feign失敗。網(wǎng)上說springboot2.x需要如下引入:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
但是我使用openfeign在啟動(dòng)的時(shí)候報(bào)錯(cuò):

所以我將pom.xml的依賴改成了這樣(<parent>一定要注釋掉):
<!-- 此處一定要注釋掉parent繼承父級(jí)的依賴 -->
<!--<parent>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-parent</artifactId>-->
<!--<version>2.1.2.RELEASE</version>-->
<!--</parent>-->
<dependencies>
<!-- ...其他的依賴省略了 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.2.3.RELEASE</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
<version>2.0.0.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>啟動(dòng)類注解和springboot1.x中的一樣,啟動(dòng)工程,就可以了。
feign調(diào)用方式比較
一、事發(fā)原因
兩個(gè)東家都使用SpringCloud,巴拉巴拉用上了Spring全家桶,從eureka到ribbon,從ribbon到feign,從feign到hystrix,然后在使用feign的時(shí)候發(fā)現(xiàn)使用方式不同,仔細(xì)一看這種調(diào)用方式,唉,麻煩,我怎么要自己定義DTO,自己定義Fallback, 自己定義方法呢?用上之后,其實(shí)發(fā)現(xiàn)各有各的好處,今天就來一一記錄一下。
二、方式1介紹
我們?cè)陂_發(fā)服務(wù)的時(shí)候,會(huì)把接口和實(shí)現(xiàn)分開, 即有一個(gè)API模塊和一個(gè)Service模塊,消費(fèi)者依賴API的jar包,直接注入API中的Service,則可以直接通過Feign調(diào)用到對(duì)應(yīng)的服務(wù),對(duì)應(yīng)的項(xiàng)目結(jié)構(gòu)如下:

我們?cè)诮涌贏PI中定義好方法,并加上Feign注解等(MICRO-PROVIDER2是服務(wù)名,注冊(cè)到Eureka Server上的名稱。 使用Feign還可以自己實(shí)現(xiàn)fallback,設(shè)置超時(shí)默認(rèn)放回值。這里做測(cè)試,不寫過多代碼)。
具體的實(shí)現(xiàn)如下圖所示。

接下來就是我們?nèi)绾卧赾onsumer中去消費(fèi)這個(gè)服務(wù)了,我們會(huì)在service服務(wù)中,依賴api的jar包,實(shí)現(xiàn)Provider2Service即可。
具體的實(shí)現(xiàn)如下圖

代碼中的實(shí)現(xiàn)邏輯:

三、方式2介紹
這中方式介紹起來比較簡(jiǎn)單。直接在消費(fèi)者中定義新的service接口,通過Feign注解,定義方法,調(diào)用的url和被調(diào)用服務(wù)的url相同,實(shí)現(xiàn)邏輯如下。

四、調(diào)用結(jié)果測(cè)試
方式2:

方式1:

可以看到,兩種方式都是可以消費(fèi)到服務(wù)(本質(zhì)是一樣)。但是兩種方式各有好處和壞處,我們要來比較下,看看究竟哪一種才是我們需要的呢?
五、兩種方式對(duì)比
通過兩種方式的對(duì)比,我們可以看到的優(yōu)優(yōu)劣勢(shì)主要有:
方式一:
優(yōu)點(diǎn):
1:服務(wù)消費(fèi)者不用自己寫接口。
2:可提供好Dto,Vo等直接給服務(wù)消費(fèi)者。
缺點(diǎn):
1:service需要依賴jar包,如果依賴服務(wù)過多,jar也會(huì)過多。
2:給消費(fèi)者暴露了過多的接口。部分與消費(fèi)者無關(guān)的接口也暴露給對(duì)方。
方式二:
優(yōu)點(diǎn):
1:無需依賴過多jar包。
2:消費(fèi)者不要要過多接受消費(fèi)者提供的方法。
缺點(diǎn):
1:需要消費(fèi)者自己實(shí)現(xiàn)接口。
2:嚴(yán)重依賴文檔。在實(shí)現(xiàn)接口時(shí),對(duì)于所有信息都要有文檔定義。如:請(qǐng)求方式,請(qǐng)求參數(shù),返回值等。
3:自己完成Dto,Vo的編寫?! ?/p>
六、小結(jié)一下
兩種調(diào)用方式,我把知道的優(yōu)缺點(diǎn)放在這了。關(guān)于如何選擇,請(qǐng)根據(jù)需要自己抉擇,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot使用校驗(yàn)框架validation校驗(yàn)的示例
這篇文章主要介紹了springboot使用校驗(yàn)框架validation校驗(yàn)的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
SpringBoot項(xiàng)目jar和war打包部署方式詳解
這篇文章主要為大家介紹了SpringBoot項(xiàng)目jar和war打包部署方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
java與scala數(shù)組及集合的基本操作對(duì)比
這篇文章主要介紹了java與scala數(shù)組及集合的基本操作對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
詳談springboot過濾器和攔截器的實(shí)現(xiàn)及區(qū)別
今天小編就為大家分享一篇詳談springboot過濾器和攔截器的實(shí)現(xiàn)及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
在CentOS上安裝Java 17并實(shí)現(xiàn)多版本共存的詳細(xì)教程
在現(xiàn)代軟件開發(fā)中,Java 作為一種廣泛使用的編程語言,其版本更新頻繁,不同項(xiàng)目可能依賴不同版本的 Java 運(yùn)行環(huán)境,CentOS 作為一款流行的 Linux 發(fā)行版,常被用于服務(wù)器部署和開發(fā)環(huán)境,本文將詳細(xì)介紹如何在 CentOS 上安裝 Java 17,并實(shí)現(xiàn)與現(xiàn)有 Java 8 的多版本共存2025-03-03
如何利用SpringAOP的返回通知處理數(shù)據(jù)加密返回
這篇文章主要介紹了如何利用SpringAOP的返回通知處理數(shù)據(jù)加密返回,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-12-12
Java關(guān)鍵字詳解之final static this super的用法
this用來調(diào)用目前類自身的成員變量,super多用來調(diào)用父類的成員,final多用來定義常量用的,static定義靜態(tài)變量方法用的,靜態(tài)變量方法只能被類本身調(diào)用,下文將詳細(xì)介紹,需要的朋友可以參考下2021-10-10
java使用Hashtable過濾數(shù)組中重復(fù)值的方法
這篇文章主要介紹了java使用Hashtable過濾數(shù)組中重復(fù)值的方法,涉及java數(shù)組遍歷及過濾的相關(guān)技巧,需要的朋友可以參考下2016-08-08

