一.Open Feign

Feign是一个声明式Webservice客户端,使用Feign能让编写Web Service更加简单。
它的使用方法是定义一个服务接口然后在上面添加注解。Feign也可以支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持Spring MVC标准注解和HttpMessageConverter。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign与Open Feign的区别:
Spring Cloud:Open Feign基础知识

二.Open Feign的基本使用

2.1 引入依赖(部分)

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

我们能观察到,OpenFeign引入了Ribbon,所以OpenFeign本身就自带了Ribbon的负载均衡功能。

Spring Cloud:Open Feign基础知识

2.2 yml配置

server:
  port: 80

eureka:
  client:
    #是否将自己注册到Eureka Server 默认为true
    register-with-eureka: false
    #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置true才能配合ribbon做负载均衡
    service-url:
      #设置eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      #defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

2.3 springboot主启动类

添加@EnableFeignClients注解

@EnableFeignClients
@SpringBootApplication
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class,args);
    }
}

2.4 业务类

2.4.1 业务逻辑接口

添加一个Service接口,接口标注@FeignClient,值为需要调用的微服务名称。

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {

    @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable Long id);
}

2.4.2 控制层

@RestController
public class OrderFeignController {
    @Autowired
    private PaymentFeignService paymentFeignService;

    @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
        return  paymentFeignService.getPaymentById(id);

    }
}

调用流程:
Spring Cloud:Open Feign基础知识

三.Open Feign的超时控制

Open Feign的客户端默认只等一秒钟。
这里同一个CLOUD-PAYMENT-SERVICE微服务有两个服务提供方,一个占用8001,一个占用8002,现在先给8001的服务睡上三秒。

@RestController
@Slf4j
public class PaymentController {

    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable Long id){
        Payment payment = paymentService.getPaymentById(id);
        timeout();
        if(payment!=null){
            return new CommonResult<>(200,"查询成功+"+serverPort,payment);
        }else{
            return new CommonResult<>(444,"查询失败+"+serverPort,null);
        }

    }

    private void timeout(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

然后由客户端调用该微服务,发现返回的数据一直由8002提供。
然后我们进行配置ribbon的超时时间:

ribbon:
  #连接建立所用超时时间
  ReadTimeout: 5000
  #建立连接后,读取到可用资源的超时时间
  ConnectTimeout: 5000

再次调用微服务,发现8001,8002轮流提供服务。

四 Open Feign日志增强

Feign提供了日志打印功能,我们可以通过配置,来调整日志级别,从而了解Feign中http请求细节。
日志级别:

  • NONE 默认,不显示任何日志
  • BASIC 仅记录请求方法、URL、响应码及响应时间
  • HEADERS 除了BASIC定义的信息外,还有请求和响应的头信息。
  • FULL 除了HEADERS中的信息外,还有请求和相应的正文及元数据。
    配置类:
@Configuration
public class FeignConfig {

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

配置yml

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

运行效果:
Spring Cloud:Open Feign基础知识

相关文章:

  • 2021-07-20
  • 2021-08-31
  • 2021-08-29
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-08
  • 2021-11-16
  • 2021-04-29
  • 2021-09-14
相关资源
相似解决方案