springboot單獨使用feign簡化接口調(diào)用方式
單獨使用feign簡化接口調(diào)用
與HttpClient和RestTemplate相比,使用springcloud的feign調(diào)用遠程接口更為簡便,可以通過配置的方式實現(xiàn)遠程接口調(diào)用。但是有時我們并不想使用springcloud,而只是想在springboot中使用feign,我在網(wǎng)上搜了很多springboot單獨集成feign的文章,但都不能用。在通過學習、開發(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ù)名}引入即可。
對應的接口:
@RestController("/user")
public class UserController{
? ? @PostMapping("searchUsers")
? ? List<User> searchUsers(@RequestBody User user);
}由此可見,在使用feign時,service方法的調(diào)用方式(get、post)和參數(shù)、參數(shù)格式、返回值格式需要和對應的接口保持一致
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ā)服務的時候,會把接口和實現(xiàn)分開, 即有一個API模塊和一個Service模塊,消費者依賴API的jar包,直接注入API中的Service,則可以直接通過Feign調(diào)用到對應的服務,
對應的項目結(jié)構(gòu)如下:

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

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

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

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

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

方式1:

可以看到,兩種方式都是可以消費到服務(本質(zhì)是一樣)。但是兩種方式各有好處和壞處,我們要來比較下,看看究竟哪一種才是我們需要的呢?
5.兩種方式對比
通過兩種方式的對比,我們可以看到的優(yōu)優(yōu)劣勢主要有:
方式一:
優(yōu)點:
1:服務消費者不用自己寫接口。
2:可提供好Dto,Vo等直接給服務消費者。
缺點:
1:service需要依賴jar包,如果依賴服務過多,jar也會過多。
2:給消費者暴露了過多的接口。部分與消費者無關(guān)的接口也暴露給對方。
方式二:
優(yōu)點:
1:無需依賴過多jar包。
2:消費者不要要過多接受消費者提供的方法。
缺點:
1:需要消費者自己實現(xiàn)接口。
2:嚴重依賴文檔。在實現(xiàn)接口時,對于所有信息都要有文檔定義。如:請求方式,請求參數(shù),返回值等。
3:自己完成Dto,Vo的編寫。
6.小結(jié)一下
兩種調(diào)用方式,我把知道的優(yōu)缺點放在這了,歡迎大家提出自己的建議。關(guān)于如何選擇,請根據(jù)需要自己抉擇。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)置PDF有序和無序列表的知識點總結(jié)
在本篇文章中小編給大家整理了關(guān)于Java設(shè)置PDF有序和無序列表的知識點,需要的朋友們參考下。2019-03-03
Java Mail與Apache Mail發(fā)送郵件示例
這篇文章主要介紹了Java Mail與Apache Mail發(fā)送郵件示例的相關(guān)資料,需要的朋友可以參考下2014-10-10
spring mvc中@PathVariable / 帶斜杠方式獲取
這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

