springboot單獨使用feign簡化接口調(diào)用方式
單獨使用feign簡化接口調(diào)用
與HttpClient和RestTemplate相比,使用springcloud的feign調(diào)用遠程接口更為簡便,可以通過配置的方式實現(xiàn)遠程接口調(diào)用。但是有時我們并不想使用springcloud,而只是想在springboot中使用feign,我在網(wǎng)上搜了很多springboot單獨集成feign的文章,但都不能用。在通過學(xué)習(xí)、開發(fā)后簡單整理了一個教程。詳細介紹如何在springboot中單獨集成feign,以簡便的方式調(diào)用遠程接口。
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可自動生成getter、setter--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.projectlombok</groupId> ? ? ? ? ? ? <artifactId>lombok</artifactId> ? ? ? ? ? ? <optional>true</optional> ? ? ? ? </dependency> ? ? ? ? <!--feign遠程接口調(diào)用--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.springframework.cloud</groupId> ? ? ? ? ? ? <artifactId>spring-cloud-starter-openfeign</artifactId> ? ? ? ? </dependency> ? ? </dependencies> ? ? <!--管理springcloud版本,引入openfeign時不用添加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.啟動類添加@EnableFeignClients注解
開啟feign
@EnableFeignClients //開啟feign @SpringBootApplication public class SpringbootApplication { ?? ?public static void main(String[] args) { ?? ??? ?SpringApplication.run(SpringbootApplication.class, args); ?? ?} }
3.像平常一樣寫一個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時使用,url為ip地址
最終調(diào)用的接口地址為url加上@PostMapping的value。
@FeignClient的url可以使用配置文件中的參數(shù)。使用${參數(shù)名}引入即可。
對應(yīng)的接口:
@RestController("/user") public class UserController{ ? ? @PostMapping("searchUsers") ? ? List<User> searchUsers(@RequestBody User user); }
由此可見,在使用feign時,service方法的調(diào)用方式(get、post)和參數(shù)、參數(shù)格式、返回值格式需要和對應(yīng)的接口保持一致
4.調(diào)用接口
@Autowired private UserService userService; /** *查詢18歲的用戶并打印到控制臺 */ 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ā)原因
兩個東家都使用SpringCloud,巴拉巴拉用上了Spring全家桶,從eureka到ribbon,從ribbon到feign,從feign到hystrix,然后在使用feign的時候發(fā)現(xiàn)使用方式不同,仔細一看這種調(diào)用方式,唉,麻煩,我怎么要自己定義DTO,自己定義Fallback, 自己定義方法呢?用上之后,其實發(fā)現(xiàn)各有各的好處,來記錄一下。
2.方式1介紹
我們在開發(fā)服務(wù)的時候,會把接口和實現(xiàn)分開, 即有一個API模塊和一個Service模塊,消費者依賴API的jar包,直接注入API中的Service,則可以直接通過Feign調(diào)用到對應(yīng)的服務(wù),
對應(yīng)的項目結(jié)構(gòu)如下:
我們在接口API中定義好方法,并加上Feign注解等(MICRO-PROVIDER2是服務(wù)名,注冊到Eureka Server上的名稱。
使用Feign還可以自己實現(xiàn)fallback,設(shè)置超時默認放回值。這里做測試,不寫過多代碼。)
具體的實現(xiàn)如下圖所示。
接下來就是我們?nèi)绾卧赾onsumer中去消費這個服務(wù)了,我們會在service服務(wù)中,依賴api的jar包,實現(xiàn)Provider2Service即可。
具體的實現(xiàn)如下圖
代碼中的實現(xiàn)邏輯:
3.方式2介紹
這中方式介紹起來比較簡單。直接在消費者中定義新的service接口,通過Feign注解,定義方法,調(diào)用的url和被調(diào)用服務(wù)的url相同,實現(xiàn)邏輯如下。
4.調(diào)用結(jié)果測試
方式2:
方式1:
可以看到,兩種方式都是可以消費到服務(wù)(本質(zhì)是一樣)。但是兩種方式各有好處和壞處,我們要來比較下,看看究竟哪一種才是我們需要的呢?
5.兩種方式對比
通過兩種方式的對比,我們可以看到的優(yōu)優(yōu)劣勢主要有:
方式一:
優(yōu)點:
1:服務(wù)消費者不用自己寫接口。
2:可提供好Dto,Vo等直接給服務(wù)消費者。
缺點:
1:service需要依賴jar包,如果依賴服務(wù)過多,jar也會過多。
2:給消費者暴露了過多的接口。部分與消費者無關(guān)的接口也暴露給對方。
方式二:
優(yōu)點:
1:無需依賴過多jar包。
2:消費者不要要過多接受消費者提供的方法。
缺點:
1:需要消費者自己實現(xiàn)接口。
2:嚴(yán)重依賴文檔。在實現(xiàn)接口時,對于所有信息都要有文檔定義。如:請求方式,請求參數(shù),返回值等。
3:自己完成Dto,Vo的編寫。
6.小結(jié)一下
兩種調(diào)用方式,我把知道的優(yōu)缺點放在這了,歡迎大家提出自己的建議。關(guān)于如何選擇,請根據(jù)需要自己抉擇。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud如何利用Feign訪問外部http請求
這篇文章主要介紹了SpringCloud如何利用Feign訪問外部http請求,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03JAVA技術(shù)實現(xiàn)上傳下載文件到FTP服務(wù)器(完整)
這篇文章主要介紹了JAVA技術(shù)實現(xiàn)上傳下載文件到FTP服務(wù)器(完整),本文使用 Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服務(wù)器實現(xiàn)FTP服務(wù)器上文件的上傳/下載/刪除等操作,需要的朋友可以參考下2015-07-07java組件commons-fileupload實現(xiàn)文件上傳
這篇文章主要介紹了java借助commons-fileupload組件實現(xiàn)文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10Spring使用event-stream進行數(shù)據(jù)推送
這篇文章主要介紹了Spring使用event-stream進行數(shù)據(jù)推送,前端使用EventSource方式向后臺發(fā)送請求,后端接收到之后使用event-stream方式流式返回,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-03-03關(guān)于Java數(shù)組聲明、創(chuàng)建、初始化的相關(guān)介紹
這篇文章主要是關(guān)于Java數(shù)組聲明、創(chuàng)建、初始化的相關(guān)介紹,并給出其對應(yīng)的代碼,需要的朋友可以參考下2015-08-08Spring?boot?運用策略模式實現(xiàn)避免多次使用if的操作代碼
這篇文章主要介紹了Spring?boot?運用策略模式實現(xiàn),避免多次使用if,使用策略模式后,新加一種支付策略時,只需要在策略枚舉中添加新加的策略信息,外加一個策略類即可,而不再需要添加新的if判斷,需要的朋友可以參考下2022-08-08springboot+redis分布式鎖實現(xiàn)模擬搶單
這篇文章主要介紹了springboot+redis分布式鎖實現(xiàn)模擬搶單,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03Java基礎(chǔ)知識之StringWriter流的使用
這篇文章主要介紹了Java基礎(chǔ)知識之StringWriter流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12