【SpringCloud】OpenFeign服务接口调用快速入门
文章目录
- 【SpringCloud】OpenFeign服务接口调用快速入门
- 1. 概述
- 2. 引入依赖
- 3. 配置、测试
1. 概述
官网地址:点击跳转
Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用 Feign 创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和 JAX-RS 注释。Feign 还支持可插拔编码器和解码器。Spring Cloud 添加了对 Spring MVC 注释的支持,以及对使用 Spring Web 中默认使用HttpMessageConverter 的支持。Spring Cloud 集成了 Eureka、Spring Cloud CircuitBreaker 以及 Spring Cloud LoadBalancer,以便在使用 Feign 时提供负载平衡的http客户端。
前面在使用 SpringCloud LoadBalancer + RestTemplate 时,利用 RestTemplate 对http请求的封装处理形成了一套模版化的调用方法。
但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign 在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 OpenFeign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个 @FeignClient 注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过 OpenFeign 调用即可。
OpenFeign 同时还集成SpringCloud LoadBalancer,可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
2. 引入依赖
<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3. 配置、测试
1)配置文件如下:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}
2)启动类上添加 @EnableFeignClients
注解:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MainOpenFeign80 {public static void main(String[] args) {SpringApplication.run(MainOpenFeign80.class, args);}
}
3)在通用commons模块下编写client:
@FeignClient(value = "cloud-payment-service")
public interface PayFeignApi {@PostMapping(value = "/pay/add")public ResultData<String> addPay(@RequestBody PayDTO payDTO);@GetMapping(value = "/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id") Integer id);@GetMapping(value = "/pay/get/info")public String mylb();
}
这三个接口在pay服务中的接口对应如下:
@PostMapping(value = "/pay/add")
@Operation(summary = "新增", description = "新增支付流水方法,json串做参数")
public ResultData<String> addPay(@RequestBody PayDTO payDTO) {Pay pay = new Pay();BeanUtils.copyProperties(payDTO, pay);System.out.println(pay.toString());int i = payService.add(pay);return ResultData.success("成功插入记录,返回值:" + i);
}@GetMapping(value = "/pay/get/{id}")
@Operation(summary = "按照ID查流水", description = "查询支付流水方法")
public ResultData<Pay> getById(@PathVariable("id") Integer id) {Pay pay = payService.getById(id);return ResultData.success(pay);
}@GetMapping(value = "/pay/get/info")
private String getInfoByConsul(@Value("${com.zhj}") String str) {return "com.zhj: " + str + "\t" + "port: " + port;
}
4)在order服务中调用这三个接口:
@RestController
@Slf4j
public class OrderController {@Resourceprivate PayFeignApi payFeignApi;@PostMapping("/feign/pay/add")public ResultData addOrder(@RequestBody PayDTO payDTO) {System.out.println("第一步:模拟本地addOrder新增订单成功(省略sql操作),第二步:再开启addPay支付微服务远程调用");ResultData resultData = payFeignApi.addPay(payDTO);return resultData;}@GetMapping("/feign/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id") Integer id) {System.out.println("-------支付微服务远程调用,按照id查询订单支付流水信息");ResultData resultData = payFeignApi.getPayInfo(id);return resultData;}/*** openfeign天然支持负载均衡演示** @return*/@GetMapping(value = "/feign/pay/mylb")public String mylb() {return payFeignApi.mylb();}
}
调用第二个接口,结果如下:
测试第三个结果,看负载均衡是否成功,结果如下:
说明 OpenFeign 默认集成了 LoadBalance。