SpringCloud OpenFeign(一)基本介绍与简单示例
SpringCloud OpenFeignadmin 发布于:2023-01-31 09:08:16
阅读:loading
Feign是一个声明式web服务客户端。它使编写web服务客户端更容易。要使用Feign,创建一个接口并对其进行注释。它具有可插入的注释支持,包括假注释和JAX-RS注释。fake还支持可插拔的编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并支持在Spring Web中默认使用相同的HttpMessageConverters。Spring Cloud集成了Eureka, Spring Cloud CircuitBreaker,以及Spring Cloud LoadBalancer,在使用Feign时提供一个负载平衡的http客户端。
在此前通过Http接口的请求交互可以是使用JDK内置的HttpURLConnection、Apache开源项目HttpClient、OkHttp、Spring提供的RestTemplate,以及Ribbon、Feign和现在的Open Feign。可以看出来在http接口交互上也算一直在不断的发展演变,(远程http交互也常使用Web Service和Hessian)。至于Open Feign与Feign有着较大的区别,一句话总结就是Feign早已不再升级维护了,可放心选择Open Feign,它使得调用远程http服务变得如同本地Service接口一样便捷。
(1)maven依赖
本次示例比较全面,所以涉及到的maven依赖有:spring-boot-starter-web、spring-cloud-starter-openfeign、spring-cloud-starter-loadbalancer、spring-cloud-starter-netflix-hystrix 这4个,其中最后一个不是必须,作为服务容错时的依赖,后文有专门示例。
(2)启动类
启动类增加@SpringBootApplication、@EnableDiscoveryClient、@EnableFeignClients、@EnableHystrix这4个注解,主要是最后两个注解。
(3)Client接口
package cn.chendd.api.client;
import ;
/**
* Open Feign 接口调用客户端
*
* @author chendd
* @date 2023/1/8 20:38
*/
@FeignClient(name = "chendd-nacos-client" , path = "/nacos-client/hello")
public interface OpenFeignClient {
/**
* 获取数据列表
* @return 数据列表
*/
@GetMapping(value = "/list")
List<Point> getList();
/**
* 获取复杂数据对象
* @return 复杂数据对象
*/
@GetMapping(value = "/complex" , produces = MediaType.APPLICATION_JSON_VALUE)
ComplexVo getComplex();
/**
* Hello world
* @param name 名称
* @return hello world
*/
@GetMapping("/world/{name}")
String sayHello(@PathVariable(name = "name") String name);
/**
* Hello world
* @param name 参数名
* @param value 参数值
* @param author header参数值
* @return hello 多个参数
*/
@PostMapping(value = "/form" , consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
String sayHello(@RequestParam(name = "name") String name ,
@RequestParam(name = "value") String value ,
@RequestHeader(name = "author") String author);
/**
* 传递参数包含body和普通参数
* @param name 普通参数
* @param body body参数
* @return 字符串
*/
@PutMapping(value = "/param_body" , consumes = MediaType.APPLICATION_JSON_VALUE)
String paramBody(@RequestParam(name = "name") String name , @RequestBody String body);
/**
* 下载yaml文本文件
* @return response
*/
@PostMapping(value = "/download_yaml" , produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
Response downloadYaml();
/**
* 下载图片文件
* @return response
*/
@GetMapping(value = "/download_image" , produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
Response downloadImage();
/**
* 多文件上传(附带其它参数)
* @param files 多文件
* @param id 参数对象
* @param name 参数对象
* @param nikeNames 参数对象
* @return 上传结果
*/
@PostMapping(value = "/upload" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE , produces = MediaType.APPLICATION_JSON_VALUE)
Map<String , Object> upload(@RequestPart(value = "files") List<MultipartFile> files ,
@RequestParam(name = "id") Integer id,
@RequestParam(name = "name") String name,
@RequestParam(name = "nikeNames") List<String> nikeNames);
}
package cn.chendd.api.vo;
/**
* 复杂数据对象
*
* @author chendd
* @date 2023/1/10 13:28
*/
public class ComplexVo {
private Integer total;
private Data data;
public static class Data {
private String x;
private Boolean y;
private List<Point> list;
//getter setter
}
//getter setter
}
A.@FeignClient的name是注册在注册中心的微服务名称;path是所有接口路径的统一前缀(类似在类上面的@RequestMapping注解);还有个url参数为接口服务的根路径地址,一般可用于从application.yml中读取路径变量(也可以通过拦截器进行重载该参数实现从数据库读取路径参数);
B.以getList方法为例,该方法的完整URL路径为:“lb://chendd-nacos-client/nacos-client/hello/list”;
C.示例中覆盖到了GET、POST、PUT等多种请求类型;
D.示例中接口请求参数覆盖到了路径变量@PathVariable、请求头@RequestHeader、请求参数@RequestParam、请求体@RequestBody、文件对象@RequestPart等多种参数交互;
E.示例中覆盖单个参数和数组参数,同时支持响应基本类型和复杂对象类型;
F.示例中覆盖多文件上传(含附带其它非文件类型参数)和文件下载,文件下载又区分字符文件和字节文件的解析;
G.示例编写在open-feign模块中,调用的接口服务在nacos-client中,需要参见不同服务的代码;
H.源码下载:源码下载.txt;
点赞