OpenFeign服务调用

前言

Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。只需要创建一个接口并在接口上添加注解即可。
它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HTTPMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

Feign 能干什么?

Feign旨在使编写Java Http客户端变得更容易
在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装,这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(以前时Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

Feign集成了Ribbon:
利用Ribbon维护了服务列表信息,并通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且声明式的方法,优雅而简单的实现了服务调用

本章的OpenFeign是根据:

我们在Eureka注册与发现的例子上稍作修改https://blog.csdn.net/javaasd/article/details/108791307

把客户端:cloud-consumer-order80给舍弃掉。
除了这个客户端,其余的四个项目正常启动,7001,7002,8001和8002。

然后我们在创建一个客户端:cloud-consumer-feign-order80

第一步:pom.xml中引入jar包依赖

 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
 <!-- 引入Eureka Client -->
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
 </dependency>

第二步:配置application.yml配置文件

server:
  port: 8083

eureka:
  client:
    #向注册中心注册自己(eureka server)
    register-with-eureka: false
    service-url:
      #设置与eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群

第三步:创建启动类

@SpringBootApplication
@EnableFeignClients  //激活开启feign
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class,args);
    }
}

第四步:创建service接口

@Component
//调用Eureka服务下的注册服务项
@FeignClient(name = "CLOUD-PAYMENT-SERVICE") 
public interface PaymentFeignService {
    //服务项下的controller类里面的方法接口
    @GetMapping(value = "/payment/getPaymentById/{id}")
    CommonResult getPaymentById(@PathVariable("id") Integer id);
}

第五步:创建controller

@RestController
public class OrderFeignController {
    //调用接口
    @Resource
    private PaymentFeignService paymentFeignService;
    
    @GetMapping(value = "/consumer/payment/getPaymentById/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Integer id){
        return paymentFeignService.getPaymentById(id);
    }
}

最后启动cloud-consumer-feign-order80访问http://localhost:8083/consumer/payment/getPaymentById/9

在这里插入图片描述

超时控制

在8001服务端的controller层的一个类中,模拟一个复杂的逻辑处理,它需要三秒的时间

    //模拟这是一个复杂的业务逻辑,程序需要执行三秒钟
    @GetMapping("/payment/feign/timeout")
    public String paymentFeignTimeout(){
        try {
            TimeUnit.SECONDS.sleep(3);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return serverPort;
    }

然后在80客户端的service层添加一下代码

    @GetMapping("/payment/feign/timeout")
    String paymentFeignTimeout();

controller层

    @GetMapping("/consumer/payment/feign/timeout")
    public String paymentFeignTimeout(){
        //OpenFeign-ribbon默认等待1秒,这个时候这个程序需要等待三秒,
        // 三秒过后会报连接超时的错误
        return paymentFeignService.paymentFeignTimeout();
    }

然后启动80客户端。我们直接访问服务端接口http://localhost:8001/payment/feign/timeout 等待三秒是可以正常的访问的到的。但通过用户端80去访问服务端的8001里面的接口会报错(报错内容如下)

在这里插入图片描述
这个错误就是连接超时。因为这个代码的执行时间是三秒,而用户端80,它只等待一秒,一秒钟后没有等到结果,就会直接报连接超时。

这个时候我们需要修改一下用户端80,的application.yml加上超时配置即可

server:
  port: 8083

eureka:
  client:
    #向注册中心注册自己(eureka server)
    register-with-eureka: false
    service-url:
      #设置与eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群
#设置OpenFeign客户端连接超时时间
ribbon:
  #建立连接所用的时间,适用于网络状态正常的情况下,二端连接所用时间
  ReadTimeout: 5000
  #建立连接后从服务器读取到可用资源所用的时间
  connectTimeout: 5000

重启项目即可正常访问

OpenFeign日志打印功能

Feign 提供了日志打印功能,我们可以通过配置来调整日期级别,从而了解Feign种的Http请求的细节。所白了就是对Feign接口的调用情况进行监控和输出。

日志级别:
1.NONE:默认的,不显示任何日志
2.BASIC:仅记录请求方法、url、响应状态及执行时间
3.HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息。
4.FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

用法(80用户端)

第一步需要写一个日志工具类

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

第二步修改application.yml文件

server:
  port: 8083

eureka:
  client:
    #向注册中心注册自己(eureka server)
    register-with-eureka: false
    service-url:
      #设置与eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群
#设置OpenFeign客户端连接超时时间
ribbon:
  #建立连接所用的时间,适用于网络状态正常的情况下,二端连接所用时间
  ReadTimeout: 5000
  #建立连接后从服务器读取到可用资源所用的时间
  connectTimeout: 5000
logging:
  level:
    #日志以哪个级别监控哪个接口
    com.atguigu.springcloud.service.PaymentFeignService: debug

第三步:重启80用户端口,然后随便访问一个接口。
最后看一下控制台输出

在这里插入图片描述
到此OpenFeign服务调用结束!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值