SpringCloud OpenFeign(一)基本介绍与简单示例

SpringCloud OpenFeign
placeholder image
admin 发布于: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
}

(4)示例知识点

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


 点赞


 发表评论

当前回复:作者

 评论列表


留言区