服务调用——OpenFeign

之前有一篇文章讲解了Ribbon的负载均衡功能,服务调用——Ribbon,当时的消费者服务调用代码如下:
在这里插入图片描述
分析上面的结构,我们能发现什么问题?
1.通过RestTemplate,我们需要访问一个url地址。
2、需要手动拼接路径和参数。
3、对于多个方法,代码将会大量重复,并不优雅。

那么有没有一种更优雅的方式,来解决服务调用问题呢?
OpenFeign出现了。

是什么

Fegin本意是“伪装”,可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给OpenFeign去做。
在这里插入图片描述
说明:Feign和OpenFeign都是进行服务调用的一个工具,但是Feign已经不用了,目前市面上应用最多的就是OpenFeign。

实例

我这里是用的微服务工程还是上一篇中使用的,大家如果还没有建微服务工程,可以参考上一篇博客。

(1)导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)开启OpenFeign功能

在启动类上,添加注解@EnableFeignClients,开启OpenFeign功能

@SpringCloudApplication
@EnableFeignClients // 开启feign客户端
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}

删除RestTemplate:OpenFeign已经自动集成了Ribbon负载均衡的RestTemplate。所以,此处不需要再注册RestTemplate(如果之前没有用过的可以忽略此步骤)。
在这里插入图片描述

(3)服务提供者提供api接口

作为一个服务的提供者,服务中将会有很多controller方法,供外界访问调用,此时作为服务的提供者,可以针对controller中的方法,做一个api接口,将controller中的方法映射到api中,这样一来外界需要访问该服务时,直接实现该接口即可。
我们以item-server服务提供者为例展示:
在这里插入图片描述

package com.zhyheima.bj.api;

import com.zhyheima.bj.CommonResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

public interface TestServerApi {
    @GetMapping("/test/{id}")
    CommonResult test(@PathVariable("id")Long id);
}

(4)服务消费者开启Feign客户端

消费者服务中,我们新建一个接口,继承提供者服务提供的api接口,并开启OpenFeign功能。
在这里插入图片描述

package com.zhyheima.bj.client;

import com.zhyheima.bj.CommonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "item-server") // 标注该类是一个feign接口,传入的参数是我们需要调用的微服务名称
public interface TestClient {
}

(5)修改消费者服务的controller方法

    @Autowired
    private TestClient testClient;

    @GetMapping("/test/{id}")
    @HystrixCommand //标记该方法需要熔断
    public CommonResult<Integer> test(@PathVariable("id")Long id){
        //改为直接调用接口
        return testClient.test(id);
    }

重启消费者和提供者服务,查看执行结果:
在这里插入图片描述
由运行结果我们可以看出,Feign实现了服务调用功能,并且使代码更加简洁易懂。

OpenFeign超时控制

服务消费方调用服务提供方,当服务提供方因为某些原因不能及时返回结果后,服务消费方会报错(默认只等待一秒),此时我们需要在服务消费方进行超时控制,如下:

在配置文件中写明

# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
  # 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
  # 指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

OpenFeign日志打印功能

OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中http请求的细节,即对feign接口的调用情况进行监控和输出。

日志级别:
在这里插入图片描述

配置日志

@Configuration
public class FeignConfig {

    /**
     * feignClient配置日志级别
     *
     * @return
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
        // 请求和响应的头信息,请求和响应的正文及元数据
        return Logger.Level.FULL;
    }
}

配置文件中开启日志的Feign客户端:

logging:
  level:
    # feign日志以什么级别监控哪个接口
    com.zhyheima.springcloud.service.PaymentFeignService: debug

OpenFeign说明

我们查看maven消费者服务的maven依赖:
在这里插入图片描述
OpenFeign中本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外引入依赖,也不需要再注册RestTemplate对象。
同时,Feign默认也有对Hystrix的集成,只不过,默认情况下是关闭的。我们需要通过下面的参数来开启:

feign:
  hystrix:
    enabled: true # 开启OpenFeign的熔断功能

但是,Feign中的Fallback配置不像hystrix中那样简单了。
(1)定义一个类TestClientFallback,实现刚才编写的TestClient,作为TestClient的处理类。
在这里插入图片描述
在类中,将异常处理的逻辑放入:

package com.zhyheima.bj.client;

import com.zhyheima.bj.CommonResult;
import org.springframework.stereotype.Component;

@Component
public class TestClientFallback implements TestClient {
    @Override
    public CommonResult test(Long id) {
        return new CommonResult<>(500,"请求繁忙,请稍后再试!");
    }
}

(2)TestClient接口中,在@FeignClient注解中表明熔断处理类
在这里插入图片描述
(3)controller的TestServer类中,将原来关于Hystrix的注解注掉,直接运行
在这里插入图片描述
同样提供两个地址:
http://localhost:9002/test/1
http://localhost:9002/test/2
点击第一个地址,出现降级处理逻辑,点击第一个地址20此以上,点击第二个地址,将看到第二个地址最初也是进行了降级处理(熔断)但是只有几秒钟,再次刷新就会查询出数据。
在这里插入图片描述
从结果中我们可以看出,OpenFeign集成了Hystrix的依赖,可以达到服务降级和熔断的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值