3千字详细讲解OpenFeign的使用姿势( 二 )

然后再用消费者工程的ConsumerController接口来测试 。
@RestControllerpublic class ConsumerController { //引入Feign客户端@Resourceprivate ProviderClient providerClient;@RequestMapping("/consumer/callProvider")public String callProvider() {//使用Feign客户端调用其他服务的接口return providerClient.list();}}最后我们启动提供者工程 , 消费者工程 , 注册中心 , 测试 。
3千字详细讲解OpenFeign的使用姿势文章插图
然后调用消费者的ConsumerController接口 。
3千字详细讲解OpenFeign的使用姿势文章插图
三、继承式细心的同学可能发现 , 其实声明式会写多一次提供者接口的定义 , 也就是有重复的代码 , 既然有重复的定义 , 那我们就可以抽取出来 , 所以就有了继承式 。
第一步 , 创建一个普通的Maven项目api工程 , 把接口定义在api中 。
3千字详细讲解OpenFeign的使用姿势文章插图
第二步 , 服务提供者工程的ProviderController实现Provider接口 。
@RestControllerpublic class ProviderController implements ProviderApi {public String list() {List list = new ArrayList<>();list.add("java技术爱好者");list.add("SpringCloud");list.add("没有人比我更懂了");return list.toString();}}第三步 , 消费者工程的ProviderClient无需定义 , 只需要继承ProviderApi , 然后加上@FeignClient即可 。
@FeignClient(name = "provider")public interface ProviderClient extends ProviderApi {}其他不用变了 , 最后启动服务提供者 , 消费者 , 注册中心测试一下 。
3千字详细讲解OpenFeign的使用姿势文章插图
测试成功!上面继承式的好处就在于 , 只需要在api工程定义一次接口 , 服务提供者去实现具体的逻辑 , 消费者则继承接口贴个注解即可 , 非常方便快捷 。
缺点就在于如果有人动了api的接口 , 则会导致很多服务消费者、提供者出现报错 , 耦合性比较强 。 api工程相当于一个公共的工程 , 消费者和服务者都会依赖此工程 , 所以一般要求不能随便删api上面的接口 。
四、Feign的相关配置下面讲一下Feign的一些常用的相关配置 。
4.1 请求超时设置Feign底层其实还是使用Ribbon , 默认是1秒 。 所以超过1秒就报错 。
接下来试验一下 。 我在服务提供者的接口加上一段休眠1.5秒的代码 , 然后用消费者去消费 。
@RestControllerpublic class ProviderController implements ProviderApi {public String list() {List list = new ArrayList<>();list.add("java技术爱好者");list.add("SpringCloud");list.add("没有人比我更懂了");try {//休眠1.5秒Thread.sleep(1500);} catch (Exception e) {e.printStackTrace();}return list.toString();}}消费者调用后 , 由于超过1秒 , 可以看到控制台报错 。
3千字详细讲解OpenFeign的使用姿势文章插图
如果想调整超时时间 , 可以在消费者这边 , 加上配置:
ribbon:ReadTimeout:5000 #请求时间5秒ConnectTimeout: 5000 #连接时间5秒为了显示出效果 , 我们在消费者的代码里加上耗时计算:
@RestControllerpublic class ConsumerController {@Resourceprivate ProviderClient providerClient;@RequestMapping("/consumer/callProvider")public String callProvider() throws Exception {long star = System.currentTimeMillis();String list = providerClient.list();long end = System.currentTimeMillis();return "响应结果:" + list + ",耗时:" + (end - star) / 1000 + "秒";}}