springboot單獨(dú)使用feign簡(jiǎn)化接口調(diào)用方式
單獨(dú)使用feign簡(jiǎn)化接口調(diào)用
與HttpClient和RestTemplate相比,使用springcloud的feign調(diào)用遠(yuǎn)程接口更為簡(jiǎn)便,可以通過(guò)配置的方式實(shí)現(xiàn)遠(yuǎn)程接口調(diào)用。但是有時(shí)我們并不想使用springcloud,而只是想在springboot中使用feign,我在網(wǎng)上搜了很多springboot單獨(dú)集成feign的文章,但都不能用。在通過(guò)學(xué)習(xí)、開(kāi)發(fā)后簡(jiǎn)單整理了一個(gè)教程。詳細(xì)介紹如何在springboot中單獨(dú)集成feign,以簡(jiǎn)便的方式調(diào)用遠(yuǎn)程接口。
1.引入maven
? ? <parent>
? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? <artifactId>spring-boot-starter-parent</artifactId>
? ? ? ? <version>2.2.2.RELEASE</version>
? ? ? ? <relativePath/> <!-- lookup parent from repository -->
? ? </parent>
? ? <groupId>com.example</groupId>
? ? <artifactId>demo</artifactId>
? ? <version>0.0.1-SNAPSHOT</version>
? ? <packaging>jar</packaging>
? ? <properties>
? ? ? ? <java.version>1.8</java.version>
? ? ? ? <maven.compiler.target>1.8</maven.compiler.target>
? ? ? ? <maven.compiler.source>1.8</maven.compiler.source>
? ? ? ? <!--添加springcloud版本-->
? ? ? ? <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
? ? </properties>
? ? <dependencies>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter</artifactId>
? ? ? ? </dependency>
? ? ? ??
? ? ? ? <!--lombok可自動(dòng)生成getter、setter-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.projectlombok</groupId>
? ? ? ? ? ? <artifactId>lombok</artifactId>
? ? ? ? ? ? <optional>true</optional>
? ? ? ? </dependency>
? ? ? ? <!--feign遠(yuǎn)程接口調(diào)用-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-openfeign</artifactId>
? ? ? ? </dependency>
? ? </dependencies>
? ? <!--管理springcloud版本,引入openfeign時(shí)不用添加version-->
? ? <dependencyManagement>
? ? ? ? <dependencies>
? ? ? ? ? ? <dependency>
? ? ? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? ? ? <artifactId>spring-cloud-dependencies</artifactId>
? ? ? ? ? ? ? ? <version>${spring-cloud.version}</version>
? ? ? ? ? ? ? ? <type>pom</type>
? ? ? ? ? ? ? ? <scope>import</scope>
? ? ? ? ? ? </dependency>
? ? ? ? </dependencies>
? ? </dependencyManagement>
? ? <build>
? ? ? ? <plugins>
? ? ? ? ? ? <plugin>
? ? ? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId>
? ? ? ? ? ? </plugin>
? ? ? ? </plugins>
? ? </build>
</project>2.啟動(dòng)類(lèi)添加@EnableFeignClients注解
開(kāi)啟feign
@EnableFeignClients //開(kāi)啟feign
@SpringBootApplication
public class SpringbootApplication {
?? ?public static void main(String[] args) {
?? ??? ?SpringApplication.run(SpringbootApplication.class, args);
?? ?}
}3.像平常一樣寫(xiě)一個(gè)service接口
在此基礎(chǔ)上添加一些feign注解
@FeignClient(name = "userService",url = "${ip}:${port}/${base_url}")
public interface UserService {
? ? /**
? ? ?* 根據(jù)條件查詢用戶
? ? ?* @param user查詢參數(shù)
? ? ?* @return 用戶列表
? ? ?*/
? ? @PostMapping("searchUsers")
? ? List<User> searchUsers(@RequestBody User user);
}在service接口上添加@FeignClient注解,name為springbean的id,用于注入service時(shí)使用,url為ip地址
最終調(diào)用的接口地址為url加上@PostMapping的value。
@FeignClient的url可以使用配置文件中的參數(shù)。使用${參數(shù)名}引入即可。
對(duì)應(yīng)的接口:
@RestController("/user")
public class UserController{
? ? @PostMapping("searchUsers")
? ? List<User> searchUsers(@RequestBody User user);
}由此可見(jiàn),在使用feign時(shí),service方法的調(diào)用方式(get、post)和參數(shù)、參數(shù)格式、返回值格式需要和對(duì)應(yīng)的接口保持一致
4.調(diào)用接口
@Autowired
private UserService userService;
/**
*查詢18歲的用戶并打印到控制臺(tái)
*/
public void printUsers(){
? ?User user = new User();
? ?user.setAge(18);
? ?List<User> userList = userService.searchUsers(user);
? ?System.out.println("userList = " + userList);
}springboot feign調(diào)用方式比較
1.事發(fā)原因
兩個(gè)東家都使用SpringCloud,巴拉巴拉用上了Spring全家桶,從eureka到ribbon,從ribbon到feign,從feign到hystrix,然后在使用feign的時(shí)候發(fā)現(xiàn)使用方式不同,仔細(xì)一看這種調(diào)用方式,唉,麻煩,我怎么要自己定義DTO,自己定義Fallback, 自己定義方法呢?用上之后,其實(shí)發(fā)現(xiàn)各有各的好處,來(lái)記錄一下。
2.方式1介紹
我們?cè)陂_(kāi)發(fā)服務(wù)的時(shí)候,會(huì)把接口和實(shí)現(xiàn)分開(kāi), 即有一個(gè)API模塊和一個(gè)Service模塊,消費(fèi)者依賴API的jar包,直接注入API中的Service,則可以直接通過(guò)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è)試,不寫(xiě)過(guò)多代碼。)
具體的實(shí)現(xiàn)如下圖所示。

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

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

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

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

方式1:

可以看到,兩種方式都是可以消費(fèi)到服務(wù)(本質(zhì)是一樣)。但是兩種方式各有好處和壞處,我們要來(lái)比較下,看看究竟哪一種才是我們需要的呢?
5.兩種方式對(duì)比
通過(guò)兩種方式的對(duì)比,我們可以看到的優(yōu)優(yōu)劣勢(shì)主要有:
方式一:
優(yōu)點(diǎn):
1:服務(wù)消費(fèi)者不用自己寫(xiě)接口。
2:可提供好Dto,Vo等直接給服務(wù)消費(fèi)者。
缺點(diǎn):
1:service需要依賴jar包,如果依賴服務(wù)過(guò)多,jar也會(huì)過(guò)多。
2:給消費(fèi)者暴露了過(guò)多的接口。部分與消費(fèi)者無(wú)關(guān)的接口也暴露給對(duì)方。
方式二:
優(yōu)點(diǎn):
1:無(wú)需依賴過(guò)多jar包。
2:消費(fèi)者不要要過(guò)多接受消費(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的編寫(xiě)?! ?/p>
6.小結(jié)一下
兩種調(diào)用方式,我把知道的優(yōu)缺點(diǎn)放在這了,歡迎大家提出自己的建議。關(guān)于如何選擇,請(qǐng)根據(jù)需要自己抉擇。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)置PDF有序和無(wú)序列表的知識(shí)點(diǎn)總結(jié)
在本篇文章中小編給大家整理了關(guān)于Java設(shè)置PDF有序和無(wú)序列表的知識(shí)點(diǎn),需要的朋友們參考下。2019-03-03
Spring MVC InitBinder驗(yàn)證方法
這篇文章主要介紹了Spring MVC InitBinder驗(yàn)證方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
java方法重寫(xiě)和super關(guān)鍵字實(shí)例詳解
這篇文章主要介紹了java方法重寫(xiě)和super關(guān)鍵字實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
java實(shí)現(xiàn)員工工資管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Java中checkbox實(shí)現(xiàn)跨頁(yè)多選的方法
最近做了一個(gè)項(xiàng)目其中遇到這樣的需求,要實(shí)現(xiàn)checkbox跨頁(yè)多選功能,經(jīng)過(guò)小編整理,順利解決,今天小編給大家分享Java中checkbox實(shí)現(xiàn)跨頁(yè)多選的方法,需要的的朋友參考下2017-01-01
Java Mail與Apache Mail發(fā)送郵件示例
這篇文章主要介紹了Java Mail與Apache Mail發(fā)送郵件示例的相關(guān)資料,需要的朋友可以參考下2014-10-10
spring mvc中@PathVariable / 帶斜杠方式獲取
這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring Boot與Redisson實(shí)時(shí)排行榜功能
排行榜功能是常見(jiàn)且重要的需求之一,本文主要介紹了Spring Boot與Redisson實(shí)時(shí)排行榜功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05

