OpenFeign入门操作

语言: CN / TW / HK

OpenFeign

OpenFeifn也是服务调用与Ribbon相比简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。Feign集成了Ribbon利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

使用方法

  • 接口+注解: 微服务调用接口[email protected]

  • 新建一个cloud-consumer-openFeign-order80消费端

  • pom

xml <dependencies> <!--openfeign--> <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> <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <groupId>com.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--一般基础通用配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

  • 主启动类要加@EnableFeignClients

  • 新建业务层接口PaymentFeignService接口并新增注解@FeignClient

这里抽象方法就对应服务接口@GetMapping("/payment/get/{id}")

java @Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface OpenFeignService { @GetMapping("/payment/get/{id}") public Result<Payment> getPaymentById(@PathVariable("id") Long id); }

  • 写控制层Controller 这就正常写

```java @RestController @Slf4j public class FeignController {

  @Resource
  private OpenFeignService openFeignService;

  @GetMapping(value = "/consumer/payment/get/{id}")
  public Result<Payment> getPaymentById(@PathVariable("id") Long id)
  {
      return openFeignService.getPaymentById(id);
  }

}

```

  • 测试

启动7001->8001/8002->80

进行测试会发现OpenFeign自带负载均衡配置项,这是因为它也集成了ribbon包。

OpenFeign超时设置

  • 故意让8001端口睡一会

java @GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeOut() { System.out.println("*****paymentFeignTimeOut from port: "+port); //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return port; }

  • 测试一下

feign.jpg

  • 发现并没有找到接口报404,这是因为feign默认请求为1秒,而我们让程序睡了3秒用户等不了只能给他说没有这个请求,如果真遇到复杂程序就要我们手动调整一下最大时间上限.

这里我们调的ribbon的时间其实也都一样,因为feign已经集成了ribbon

yml ribbon: ReadTimeout: 5000 # 毫秒时间, 同feign的 ConnectTimeout: 5000 #, 同feign的

  • 再进行测试 会等待三秒才会得到数据

feign2.jpg

  • feign的配置

```yml feign: client: config: default: // 这个代表 服务,default为任意服务,可以指定服务名来指定调用该服务时的超时时间 connectTimeout: 毫秒时间,建立连接的超时时间,一般只在发现服务时用到 readTimeout: 毫秒时间 ,接口请求的超时时间

```

OpenFeign日志打印

  • Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。说白了就是对Feign接口的调用情况进行监控和输出,现在接口少等以后接口多可以更好的维护。

  • 配置类

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

  • yml配置

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

  • 启动测试

feignlog.jpg

openfeign 和 feign

Feign 是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-openfeign

| Feign | OpenFeign | | ------------------------------------------------------------ | ------------------------------------------------------------ | | 是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。 | 是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。 | | Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。 | OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 | | org.springframework.cloud spring-cloud-starter-feign | org.springframework.cloud spring-cloud-starter-openfeign | | | |

为什么有Ribbon又出现OpenFeig呢?

为了方便,让程序写起来更有逻辑。比如我们之前用Ribbon+RestTemplate方式去获得暴露的端口,我们是直接在Controller中进行的,而代码写起来也不是很顺畅的对吧。而我们之前写代码是怎么样的?是不是刚开始学时老师就强调dao-service-controller,但是你用了是不是就没办法调用service是不是违背了本来的意愿其实也没那么严重。这是OpenFeign就出现了,他封装了Ribbon只是在接口成用注解进行完成操作,是不是方便很多写起来更加方便了。这里理解为8001的controller接口为80端的serviceImpl或者dao层是不是更好理解点。