SpringCloud服务调用(2):OpenFeign


在这里插入图片描述
Feign是一个声明式的web客户端,只需要创建一个接口,添加注解即可完成微服务之间的调用
在这里插入图片描述
就是A要调用B,Feign就是在A中创建一个一模一样的B对外提供服务的的接口,我们调用这个接口,就可以服务到B

1. Feign与OpenFeign区别

在这里插入图片描述

2. 使用OpenFeign(建一个消费者80服务)

之前的服务间调用,我们使用的是ribbon+RestTemplate
		现在改为使用OpenFeign
1,新建一个order项目,用于feign测试

名字cloud_order_feign-80

2,pom文件(80)

加了OpenFeign依赖,底层是存在Ribbon负载均衡的,所以是Ribbon的升级

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
3,添加application.yml配置文件(80)

此例并没有将cloud-orderfeign-80注入到eureka里面,所以主启动类不需要添加@EnableEurekaClient注解

server:
  port: 80
# 这里只把feign做客户端用,不注册进eureka
eureka:
  client:
    register-with-eureka: false # 表示是否将自己注册进EurekaServer默认为true
    service-url:
      # defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
4,添加主启动类和@EnableFeignClients注解。(80)

@EnableFeignClients注解 激活OpenFeign客户端 ,这里不需要加@EnableEurekaClient,因为并没有将80注入到eureka里
在这里插入图片描述

5.fegin需要调用的其他的服务的接口(80 @FeignClient)

写这个service业务层接口,主要是80消费者去调用它时,实际上调用的是CLOUD-PAYMENT-SERVICE生产者8001和8002微服务的controller层的该方法(轮循)。可以看到这个接口的抽象方法和生产者8001和8002 controller层的方法相同,而且连@GetMapping注解的地址也一样,只是这个方法是抽象的。
在这里插入图片描述

6. controller (80)

在controller层中调用配置的接口方法PaymentFeignService
在这里插入图片描述
我们访问cloud-consumer-feign-order80的/consumer/payment/get/id地址,因为我们在cloud-consumer-feign-order80中添加了@FeignClient注解的接口,Feign会根据@FeignClient上的value值(CLOUD-PAYMENT-SERVICE),找到具体的服务,向它发送/payment/get/id的请求,从而实现远程调用生产者8001和8002的controller中的/payment/get/id。在使用感受上,好像是调用了cloud-consumer-feign-order80项目内部的一个业务一样,无需关心实现,也不用写RestTemplate了。
在这里插入图片描述
启动Eureka集群7001和7002,服务提供者8001和8002,服务消费者OrderFeignMain80。浏览器访问http://localhost/consumer/payment/get/1,一切正常,可以查询到数据,并且不断在8001和8002之间切换。

7测试:

启动两个erueka(7001,7002)

启动两个pay(8001,8002)

启动当前的order模块

Feign默认使用ribbon实现负载均衡

3. OpenFeign超时机制

OpenFeign默认等待时间是1秒,超过1秒,直接报错

1,设置超时时间,修改配置文件:

因为OpenFeign的底层是ribbon进行负载均衡,所以它的超时时间是由ribbon控制

为了测试超时控制,我们在服务提供者的模块,即8001和8002中,添加一个controller方法,方法体内Thread.sleep(3000);停留3秒钟返回。

//8001或8002中的生产者controller层
@GetMapping("/payment/feign/timeout")
public String paymentFeignTimeout() throws InterruptedException {
    Thread.sleep(3000);
    return serverPort;
}

为了让cloud-consumer-feign-order80能调用到这个接口,需要将接口定义写在PaymentFeignService.java接口中。在OrderFeignController.java中加入映射地址,用于浏览器访问。

//80模块的OrderFeignController.java
@GetMapping("/consumer/payment/feign/timeout")
public String paymentFeignTimeout() throws InterruptedException {
//调用PaymentFeignService.java接口的该方法,实际上去调用生产者8001或8002模块的controller层的该方法
    return paymentFeignService.paymentFeignTimeout();
}

通过浏览器直接访问生产者8002模块http://localhost:8002/payment/feign/timeout,等待3秒钟后,可以看到结果,通过浏览器访问80消费者http://localhost/consumer/payment/feign/timeout,(转到生产者controller)发现页面报错了,提示Read time out。
在这里插入图片描述
在这里插入图片描述
因为,Feign默认连接超时为1秒,默认读取资源超时是1秒。如果需要修改超时时间,需要在80模块的yml里添加配置。

#80模块
# 设置feign客户端超时时间,OpenFeign默认支持Ribbon
ribbon:
  ReadTimeout: 5000 # 建立连接后,读取资源所用时间
  ConnectTimeout: 5000 # 建立连接所用时间

4. OpenFeign日志:(80消费者端)

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而查看Feign中Http请求细节,对Feign接口调用进行监控。

日志级别:

  • NONE:默认,不显示任何日志
  • BASIC:仅记录请求方法、URL、响应状态码及执行时间
  • HEADERS:除了BASIC中定义的信息外,还有请求头和响应头的信息
  • FULL:除了HEADERS中定义的信息之外,还有请求体和响应体的正文及元数据

需要添加一个日志配置类。这个需要配置在需要的模块,如80消费者模块

package com.atguigu.springcloud.config;
@Configuration
public class FeignConfig {
    @Bean
    Logger.Level level() {
        return Logger.Level.FULL;
    }
}

在yml里指定监控哪个请求接口和监控级别。

logging:
  level:
    # 指定监控哪个接口,以及监控的级别,80消费者模块中的业务接口PaymentFeignService
    #该接口调用生产者8001模块的controller层方法,所以日志记录
    com.atguigu.springcloud.service.PaymentFeignService: debug

完整yml,注意格式

server:
  port: 80
# 这里只把feign做客户端用,不注册进eureka
eureka:
  client:
    register-with-eureka: false # 表示是否将自己注册进EurekaServer默认为true
    service-url:
      # defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#80模块
# 设置feign客户端超时时间,OpenFeign默认支持Ribbon
ribbon:
  ReadTimeout: 5000 # 建立连接后,读取资源所用时间
  ConnectTimeout: 5000 # 建立连接所用时间

logging:
  level:
      # 指定监控哪个接口,以及监控的级别,80消费者模块中的业务接口PaymentFeignService
      #该接口调用生产者8001模块的controller层方法,所以日志记录
    com.atguigu.springcloud.service.PaymentFeignService: debug

测试,随便输入一个请求,如http://localhost/consumer/payment/feign/timeout,控制台出现如下日志
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值