Spring Cloud OpenFeign模版化客户端


Posted in Java/Android onJune 25, 2022

OpenFeign是什么?

OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eureka(服务注册中心)和ribbon组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便。

OpenFeign能干啥?

  • OpenFeign的设计宗旨式简化Java Http客户端的开发。Feign在restTemplate的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了Spring cloud Ribbon的开发,自动封装服务调用客户端的开发量。
  • OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口且以申明式的方法,优雅而简单的实现了服务调用。

OpenFeign使用

使用OpenFeign之前,我们首先将之前的工程还原,为了操作简单,我们只采用单节点的eureka。

API服务模块搭建

由于我们使用openfeign之后,需要暴露相关接口给外部服务,所以我们需要写一个api服务。

我这里为了方便所以直接在外部创建了一个ms-service-api服务,实际开发过程中我们基本都是将其写在对应的模块中。

Spring Cloud OpenFeign模版化客户端

整体模块创建完成后,我们便可以定义相关接口供外部调用了,每个服务一一对应即可。

这里只演示一个goods-service-api项目的搭建,项目代码在文末会给出。

引入依赖

引入 open feign的相关依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

创建接口

这里对应的是goods-service项目中的GoodsService类,这里定义了其中的方法。

public interface IGoodsService {
    @GetMapping("/goods")
    String getGoodsById();
}

这个时候还需要将goods-service项目的类继承该接口:

首先需要将我们创建的api服务依赖添加到项目中:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>goods-service-api</artifactId>
</dependency>

然后开始修改:

@Slf4j
@RestController
public class GoodsService implements IGoodsService  {

    @Value("${server.port}")
    private String port;

    /**
     * 根据ID查询商品信息
     *
     * @return
     */
    @GetMapping("/goods")
    public String getGoodsById() {
        log.info("收到请求,端口为:{}", port);
        return "返回商品信息";
    }
}

这里为了区分职责,类似我们写mapper和service这种,又额外写了一个对外暴露的接口。

FeignClient中的name不能随意写,它对应各个服务在eureka中注册的名字。如果不写该接口的话,可以将该注解加在IGoodsService上。

@FeignClient(name = "goods-service")
public interface IGoodsServiceFeignClient extends IGoodsService {
}

以上便是一个api服务的搭建过程。

外部调用

当我们的API服务调用完成之后,如何在聚合服务中调用呢?

首先我们需要在聚合服务中引入openfeign以及各api服务的依赖:

<!--        open fiegn-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>com.example</groupId>
            <artifactId>goods-service-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>marking-service-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>order-service-api</artifactId>
        </dependency>

引入相关依赖后,我们就可以不需要之前的代码了,全面采用面向接口的形式来开发。

@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {

    // 代理对象
    @Autowired
    private IGoodsService goodsService;

    @Autowired
    private IPromotionService promotionService;

    @Autowired
    private IOrderService orderService;

    @GetMapping
    public String order() {
        log.info("begin do order");
//        使用openfiegn
        String goods = goodsService.getGoodsById();
        String promotion = promotionService.getPromotionById();
        String result = orderService.createOrder(goods, promotion);
        return result;
    }
}

这个时候还没有完全结束,我们还需要在启动类上配置扫码相关的feign类。

@EnableFeignClients(basePackages = "com.example.feignclient")
@SpringBootApplication
public class MallProtalApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallProtalApplication.class, args);
    }
}

以上便是我们集成openfeign的全部步骤。

项目代码

cloud-demo

OpenFeign相关特性 Gzip压缩Looger底层通信框架:(sun.net.www.protocol.http.HttpURLConnection)也可以自定义替换为OKHttp Logger 日志使用

使用OpenFeign的日志功能,我们需要进行如下几个操作:

创建配置类

@Configurationpublic class FeignClientLogConfiguration {    /**     * NONE     * BASIC     * HEAD     * FULL     * @return     */    @Bean    Logger.Level feignLogger(){        return Logger.Level.FULL;    }}

指定配置类

@FeignClient(name = "goods-service",configuration = FeignClientLogConfiguration.class)public interface IGoodsServiceFeignClient extends IGoodsService {}

最后还需要在聚合服务出添加相关日志配置

feignclient所在的路径

# openfeign 日志logging.level.[com.example.feignclient]=DEBUG

Spring Cloud OpenFeign模版化客户端

使用OKHttp通信

引入依赖

<!--        ophttp-->        <dependency>            <groupId>io.github.openfeign</groupId>            <artifactId>feign-okhttp</artifactId>        </dependency>

修改配置

# openfeign替换底层通信框架feign.httpclient.enabled=falsefeign.okhttp.enabled=true

Tags in this post...

Java/Android 相关文章推荐
Java 将PPT幻灯片转为HTML文件的实现思路
Jun 11 Java/Android
Java实现斗地主之洗牌发牌
Jun 14 Java/Android
Java实现简易的分词器功能
Jun 15 Java/Android
Java日常练习题,每天进步一点点(38)
Jul 26 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
Java9新特性对HTTP2协议支持与非阻塞HTTP API
Mar 16 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
Java数组详细介绍及相关工具类
Apr 14 Java/Android
springcloud整合seata
May 20 Java/Android
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
Jun 21 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
Android实现获取短信验证码并自动填充
May 21 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 #Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 #Java/Android
springboot读取resources下文件的方式详解
Jun 21 #Java/Android
java实现自定义时钟并实现走时功能
Jun 21 #Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 #Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 #Java/Android
一文搞懂Java中的注解和反射
Jun 21 #Java/Android
You might like
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
浅谈Webpack打包优化技巧
2018/06/12 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
python实现电子词典
2020/04/23 Python
wxPython框架类和面板类的使用实例
2014/09/28 Python
python 换位密码算法的实例详解
2017/07/19 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
python的dict判断key是否存在的方法
2020/12/09 Python
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
银行会计财务工作个人的自我评价
2013/10/29 职场文书
无偿献血倡议书
2014/04/14 职场文书
敬老院活动总结
2014/04/28 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
消防宣传语大全
2015/07/13 职场文书