您好,登錄后才能下訂單哦!
這篇文章主要介紹了springboot如何單獨使用feign簡化接口調用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
與HttpClient和RestTemplate相比,使用springcloud的feign調用遠程接口更為簡便,可以通過配置的方式實現遠程接口調用。但是有時我們并不想使用springcloud,而只是想在springboot中使用feign,我在網上搜了很多springboot單獨集成feign的文章,但都不能用。在通過學習、開發后簡單整理了一個教程。詳細介紹如何在springboot中單獨集成feign,以簡便的方式調用遠程接口。
<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遠程接口調用--> <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>
開啟feign
@EnableFeignClients //開啟feign @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } }
在此基礎上添加一些feign注解
@FeignClient(name = "userService",url = "${ip}:${port}/${base_url}") public interface UserService { /** * 根據條件查詢用戶 * @param user查詢參數 * @return 用戶列表 */ @PostMapping("searchUsers") List<User> searchUsers(@RequestBody User user); }
在service接口上添加@FeignClient注解,name為springbean的id,用于注入service時使用,url為ip地址
最終調用的接口地址為url加上@PostMapping的value。
@FeignClient的url可以使用配置文件中的參數。使用${參數名}引入即可。
對應的接口:
@RestController("/user") public class UserController{ @PostMapping("searchUsers") List<User> searchUsers(@RequestBody User user); }
由此可見,在使用feign時,service方法的調用方式(get、post)和參數、參數格式、返回值格式需要和對應的接口保持一致
@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); }
兩個東家都使用SpringCloud,巴拉巴拉用上了Spring全家桶,從eureka到ribbon,從ribbon到feign,從feign到hystrix,然后在使用feign的時候發現使用方式不同,仔細一看這種調用方式,唉,麻煩,我怎么要自己定義DTO,自己定義Fallback, 自己定義方法呢?用上之后,其實發現各有各的好處,來記錄一下。
我們在開發服務的時候,會把接口和實現分開, 即有一個API模塊和一個Service模塊,消費者依賴API的jar包,直接注入API中的Service,則可以直接通過Feign調用到對應的服務,
對應的項目結構如下:
我們在接口API中定義好方法,并加上Feign注解等(MICRO-PROVIDER2是服務名,注冊到Eureka Server上的名稱。
使用Feign還可以自己實現fallback,設置超時默認放回值。這里做測試,不寫過多代碼。)
具體的實現如下圖所示。
接下來就是我們如何在consumer中去消費這個服務了,我們會在service服務中,依賴api的jar包,實現Provider2Service即可。
具體的實現如下圖
代碼中的實現邏輯:
這中方式介紹起來比較簡單。直接在消費者中定義新的service接口,通過Feign注解,定義方法,調用的url和被調用服務的url相同,實現邏輯如下。
方式2:
方式1:
可以看到,兩種方式都是可以消費到服務(本質是一樣)。但是兩種方式各有好處和壞處,我們要來比較下,看看究竟哪一種才是我們需要的呢?
通過兩種方式的對比,我們可以看到的優優劣勢主要有:
方式一:
優點:
1:服務消費者不用自己寫接口。
2:可提供好Dto,Vo等直接給服務消費者。
缺點:
1:service需要依賴jar包,如果依賴服務過多,jar也會過多。
2:給消費者暴露了過多的接口。部分與消費者無關的接口也暴露給對方。
方式二:
優點:
1:無需依賴過多jar包。
2:消費者不要要過多接受消費者提供的方法。
缺點:
1:需要消費者自己實現接口。
2:嚴重依賴文檔。在實現接口時,對于所有信息都要有文檔定義。如:請求方式,請求參數,返回值等。
3:自己完成Dto,Vo的編寫。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“springboot如何單獨使用feign簡化接口調用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。