SpringCloud:Feign组件之服务调用

x33g5p2x  于2021-10-20 转载在 Spring  
字(3.9k)|赞(0)|评价(0)|浏览(479)

一、Feign概述

通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下

Feign 是一个声明式的 REST 客户端,它用了基于接口的注解方式,很方便实现客户端配置

而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix,可以让我们不再需要显式地使用这两个组件

二、快速入门

1.项目结构

  • eureka-server:注册中心
  • eureka-comsumer:服务消费端
  • eureka-client,eureka-provider:服务提供端

2.消费端引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. <version>2.2.6.RELEASE</version>
  5. </dependency>

3.定义feign接口

这里feign接口里面的方法要跟服务提供者的接口保存一致

  1. package com.mye.eurekaconsumer.feign;
  2. import com.mye.eurekaconsumer.pojo.Goods;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. /** * * feign声明式接口。发起远程调用的。 * String url = "http://FEIGN-PROVIDER/goods/findOne/"+id; Goods goods = restTemplate.getForObject(url, Goods.class); * * 1. 定义接口 * 2. 接口上添加注解 @FeignClient,设置value属性为 服务提供者的 应用名称 * 3. 编写调用接口,接口的声明规则 和 提供方接口保持一致。 * 4. 注入该接口对象,调用接口方法完成远程调用 */
  7. @FeignClient(value = "EUREKA-PROVIDER")
  8. public interface GoodsFeignClient {
  9. @GetMapping("/goods/findOne/{id}")
  10. public Goods findOne(@PathVariable("id") int id);
  11. }

4.修改controller

  1. package com.mye.eurekaconsumer.controller;
  2. import com.mye.eurekaconsumer.feign.GoodsFeignClient;
  3. import com.mye.eurekaconsumer.pojo.Goods;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/order")
  11. public class OrderController {
  12. @Autowired
  13. private GoodsFeignClient goodsFeignClient;
  14. @GetMapping("/goods/{id}")
  15. public Goods findOne(@PathVariable("id") int id){
  16. return goodsFeignClient.findOne(id);
  17. }
  18. }

5.在启动类 添加 @EnableFeignClients 注解,开启Feign功能

  1. package com.mye.eurekaconsumer;
  2. import com.mye.eurekaconsumer.config.MySelfRule;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  7. import org.springframework.cloud.netflix.ribbon.RibbonClient;
  8. import org.springframework.cloud.openfeign.EnableFeignClients;
  9. @SpringBootApplication
  10. @EnableEurekaClient
  11. @EnableDiscoveryClient
  12. /* 配置Ribbon的负载均衡策略 name:设置服务提供方的应用名称 configuration:设置负载均衡的Bean */
  13. @RibbonClient(name="EUREKA-PROVIDER",configuration= MySelfRule.class)
  14. @EnableFeignClients//开启Feign的功能
  15. public class EurekaConsumerApplication {
  16. public static void main(String[] args) {
  17. SpringApplication.run(EurekaConsumerApplication.class, args);
  18. }
  19. }

三、 Feign超时配置

Feign 底层依赖于 Ribbon 实现负载均衡和远程调用。

Ribbon默认1秒超时。

  1. # 设置Ribbon的超时时间
  2. ribbon:
  3. ConnectTimeout: 1000 # 连接超时时间 默认1s 默认单位毫秒
  4. ReadTimeout: 3000 # 逻辑处理的超时时间 默认1s 默认单位毫秒

四、Feign日志记录

Feign 只能记录 debug 级别的日志信息

  1. # 设置当前的日志级别 debug,feign只支持记录debug级别的日志
  2. logging:
  3. level:
  4. com.mye.eurekaconsumer: debug

定义Feign日志级别Bean

  1. package com.mye.eurekaconsumer.config;
  2. import feign.Logger;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class FeignLogConfig {
  7. /* NONE,不记录 BASIC,记录基本的请求行,响应状态码数据 HEADERS,记录基本的请求行,响应状态码数据,记录响应头信息 FULL;记录完成的请求 响应数据 */
  8. @Bean
  9. public Logger.Level level(){
  10. return Logger.Level.FULL;
  11. }
  12. }

启动bean

  1. /** * * feign声明式接口。发起远程调用的。 * String url = "http://FEIGN-PROVIDER/goods/findOne/"+id; Goods goods = restTemplate.getForObject(url, Goods.class); * * 1. 定义接口 * 2. 接口上添加注解 @FeignClient,设置value属性为 服务提供者的 应用名称 * 3. 编写调用接口,接口的声明规则 和 提供方接口保持一致。 * 4. 注入该接口对象,调用接口方法完成远程调用 */
  2. @FeignClient(value = "EUREKA-PROVIDER", configuration = FeignLogConfig.class)
  3. public interface GoodsFeignClient {
  4. @GetMapping("/goods/findOne/{id}")
  5. public Goods findOne(@PathVariable("id") int id);
  6. }

相关文章