在微服務架構中,feign是比較好用的一種服務提供接口的調用方式,它使編寫Web服務客戶端更加容易;並且在使用Feign的同時,它還集成了Ribbon用以完成接口調用的負載均衡。
簡單實現:
服務提供端:
接下來就是具體實現一個Feign接口了,我個人比較傾向於如下實現方式
可以看下項目骨架。
接口都是寫在user-server-api中。而具體實現是放在user-server-provider
/**
*
* @author DKing/Chenxiaorui
* @description
* @date 2020/3/27
*
*/
@RequestMapping("/user-server-api")
public interface UserServerApi {
}
個人覺得這樣寫是比較好的,其他服務想調用user-system服務的接口,只需要加user-server-api的依賴,並且實現UserServerApi接口即可,使用這樣一種黑盒調用,更方便接口的管理。而且,消費端不需要關注我接口內部實現的變化,只需要按規劃升級依賴即可,而且接口的調用是沒有什麼開發量的。這裏可以看下消費端的具體使用。
消費端:
在消費端,需要定義FeignClient,所以首先是要在springboot啓動類中增加註解@EnableFeignClients,啓動類在啓動時,會掃描FeignClient註解的類實現自動裝配,如果不加這一註解,系統是無法識別的。只會導致接口無法使用。404就來了。
@SpringBootApplication
@EnableFeignClients
public class BlogWebApplication {
public static void main(String[] args) {
SpringApplication.run(BlogWebApplication.class, args);
}
}
然後呢,就是加入所需要服務的api依賴。
<dependency>
<groupId>com.king.dk</groupId>
<artifactId>user-server-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
然後根據java的繼承特性,繼承服務提供端提供的api類
/**
*
* @author DKing/Chenxiaorui
* @description
* @date 2020/4/1
*
*/
@FeignClient(value = "${user-system.server.appname}")
public interface UserSystemApi extends UserServerApi {
}
這樣一來,我們可以在消費端使用UserSystemApi類new的對象來調用UserServerApi的restful接口,從而調到服務提供端的具體實現。
可以看到,消費端,我們並沒有做任何代碼的開發,也沒有類似接口的冗餘聲明,只需要管理好依賴的版本和服務提供端的應用名稱,就可以完成對UserSystem服務交互。em,很解耦,很內聚。
Ps.以上代碼都是空實現,隨手寫的小Demo,但是有自己對Feign接口使用的一些小心得。不喜勿噴。哈哈歡迎交流,探討