openFeign是什么
openFeign是一个声明式的web service客户端。以前我们需要用ribbon+restTemplate实现远程http调用,如果我们使用feign,只需要声明一个接口,在接口上加上注解@FeignClient(value="服务的名称")就可以实现远程http调用,更好的面向接口编程。OpenFeign同时支持SpringMVC注解
openFeign官网
openFeign的使用
引入maven依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
主启动类加上@EnableFeignClients注解开启feign
创建Service接口,我们将在接口中调用远程服务
package com.atguigu.springcloud.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import com.atguigu.springcloud.entities.CommonResult;
import com.atguigu.springcloud.entities.Payment;
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface ConsumerFeignService {
@GetMapping("/payment/{id}")
CommonResult<Payment> getPaymentById(@PathVariable(value = "id")Long id);
//feign默认超时等待1s,接口调用超过1s报错connect time out,如果是集群服务,本来是轮训,此时eureka会将这个超时的服务移除,不在提供服务
@GetMapping("/payment/wait/{id}")
public CommonResult<Payment> waitGetPaymentById(@PathVariable(value = "id")Long id);
}
注意:
Service接口上要加上@Component注解,不然spring不会注入bean
在Service接口加上注解@FeignClient(value="远程服务的名称")
Service接口中加上方法,加上注解@GetMapping,@PostMapping注解指定访问路径
注意:
当调用参数为基本类型的封装类时,必须加上@PathVariable或者@RequestParam注解
创建controller调用Service接口
package com.atguigu.springcloud.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.atguigu.springcloud.entities.CommonResult;
import com.atguigu.springcloud.entities.Payment;
import com.atguigu.springcloud.service.ConsumerFeignService;
@RestController
@RequestMapping()
public class ConsumerFeignController {
@Autowired
private ConsumerFeignService consumerFeignService;
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable(value = "id")Long id){
return consumerFeignService.getPaymentById(id);
}
@GetMapping("/consumer/payment/wait/{id}")
public CommonResult<Payment> waitGetPaymentById(@PathVariable(value = "id")Long id){
return consumerFeignService.waitGetPaymentById(id);
}
}
启动项目,测试