开发微服务,免不了需要服务间调用。Spring Cloud框架提供了RestTemplate和FeignClient两个方式完成服务间调用,本文简要介绍如何使用OpenFeign完成服务间调用

背景介绍

本示例使用consul作为服务注册中心,基于SpringCloud框架开发两个微服务,一个user-service(服务提供方),一个feignusercommodity-service(服务调用方),具体版本信息如下

软件/框架版本
consulv1.2.0
Spring Boot2.0.1.RELEASE
Spring CloudFinchley.RELEASE

openFeign使用默认版本的,也就是spring-cloud-starter-openfeign 2.0.0版本。

完整代码这这里, user-servciefeignusercommodity-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-servciefeignusercommodity-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提供方的对应方法报异常,服务调用能正常获取到该异常并显示。
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐