開發(fā)微服務,免不了需要服務間調(diào)用。Spring Cloud框架提供了RestTemplate和FeignClient兩個方式完成服務間調(diào)用,本文簡要介紹如何使用OpenFeign完成服務間調(diào)用
背景介紹
本示例使用consul作為服務注冊中心,基于SpringCloud框架開發(fā)兩個微服務,一個user-service(服務提供方),一個feignusercommodity-service(服務調(diào)用方),具體版本信息如下
軟件/框架 | 版本 |
---|---|
consul | v1.2.0 |
Spring Boot | 2.0.1.RELEASE |
Spring Cloud | Finchley.RELEASE |
openFeign使用默認版本的,也就是spring-cloud-starter-openfeign 2.0.0版本。
完整代碼這這里, user-servcie, feignusercommodity-service, 歡迎加星,fork。
官方文檔在這里http://cloud.spring.io/spring-cloud-openfeign/single/spring-cloud-openfeign.html
主要代碼
核心代碼主要包括兩點,
1, 對應接口添加@FeignClient,并完成對應服務提供者的requestMapping映射。
2,在啟動類加上@EnableFeignClients(basePackages = {"com.yq.client"}), 我的serviceClieng位于com.yq.client包。
提供方的主要接口如下:
ServiceClient類的主要實現(xiàn)如下.
注意:User 類在兩個服務中是一樣,實際項目中我們可以把它放到公共依賴包中。
@FeignClient(value = "user-service", fallbackFactory = UserServiceFallbackFactory.class)
public interface UserServiceClient {
@RequestMapping(value="/v1/users/{userId}", method= RequestMethod.GET, produces = "application/json;charset=UTF-8")
public User getUser(@PathVariable(value = "userId") String userId);
@RequestMapping(value="/v1/users/queryById", method= RequestMethod.GET, produces = "application/json;charset=UTF-8")
public User getUserByQueryParam(@RequestParam("userId") String userId);
@RequestMapping(value="/v1/users", method= RequestMethod.POST, produces = "application/json;charset=UTF-8")
public String createUser();
}
完整代碼看 user-servcie, feignusercommodity-service,里面的pom文件,serviceClient都是完整的可以運行的。 歡迎加星,fork。
效果截圖
第一張截圖,兩個服務都正常在consul上注冊,完成服務間調(diào)用
第二張截圖,兩個服務都正常在consul上注冊,完成服務間調(diào)用, 這是consul down了,服務間調(diào)用可以繼續(xù),因為feignusercommodity-service服務緩存了user-service服務的服務提供地址信息
第三張截圖,feignusercommodity-service服務正常在consul上注冊,但是user-service沒有注冊,系統(tǒng)給出了“com.netflix.client.ClientException: Load balancer does not have available server for client: user-service”
第四張截圖,user-service提供方的對應方法報異常,服務調(diào)用能正常獲取到該異常并顯示。