开发微服务,免不了需要服务间调用。Spring Cloud框架提供了RestTemplate和FeignClient两个方式完成服务间调用,本文简要介绍如何使用OpenFeign完成服务间调用
背景介绍
本示例使用consul作为服务注册中心,基于SpringCloud框架开发两个微服务,一个user-service(服务提供方),一个feignusercommodity-service(服务调用方),具体版本信息如下
软件/框架 | 版本 |
---|---|
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类的主要实现如下.
注意: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上注册,完成服务间调用
第二张截图,两个服务都正常在consul上注册,完成服务间调用, 这是consul down了,服务间调用可以继续,因为feignusercommodity-service服务缓存了user-service服务的服务提供地址信息
第三张截图,feignusercommodity-service服务正常在consul上注册,但是user-service没有注册,系统给出了“com.netflix.client.ClientException: Load balancer does not have available server for client: user-service”
第四张截图,user-service提供方的对应方法报异常,服务调用能正常获取到该异常并显示。