最近刚好打算做一个springcloud系列的分享,趁此机会刚好梳理下springcloud常用组件的使用,今天先对feign做个简单介绍!

feign是一个声明式的Web服务客户端,它使得发送web请求变得很容易,而openFign是springcloud对feign的一个升级,可以支持springMvc的注解;

接下来描述下我是怎么使用openFeign发送web请求的,首先需要明确,使用openFeign是有一定的代码侵入的,不过侵入的是consumer的代码,通过在consumer中添加openFeign的注解来拼装请求并发送,一般有两种方式,一种是consumer端根据provider提供的接口文档编写调用用例.另一种是由Prodiver提供一个接口API的jar包供consumer调用;下面上我的测试步骤及代码,两种方式都有涉及;

consumer端

 首先在consumer中引入openFeigin以及HTTPClient的依赖:

  1.      <!-- 引入open-feign的依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>
  6.  
  7. <!-- 引入open-feign的httpClien依赖 -->
  8. <dependency>
  9. <groupId>io.github.openfeign</groupId>
  10. <artifactId>feign-httpclient</artifactId>
  11. </dependency>
  12.      <!-- 引入Prodiver提供的接口包(根据实际需要) -->
  13.      <dependency>
  14.     <groupId>com.darling.api</groupId>
  15.     <artifactId>server-apis</artifactId>
  16.     <version>0.0.1-SNAPSHOT</version>
  17.     <scope>compile</scope>
  18.      </dependency>

  然后在consumer中封装一个service引入feign,来进行远程调用,关键代码如下:

  1. package com.darling.eureka.consumer.service;
  2.  
  3. import com.darling.api.service.UserService;
  4. import com.darling.eureka.consumer.model.User;
  5. import org.springframework.cloud.openfeign.FeignClient;
  6. import org.springframework.web.bind.annotation.*;
  7.  
  8. /**
  9. * @description: 通过openFeign远程调用服务提供者
  10. * @author: dll
  11. * @date: Created in 2021/9/14 12:29
  12. * @version: 1.0
  13. * @modified By:
  14. */
  15. @FeignClient(name = "EUREKA-PROVIDER")
  16. public interface UserApiService extends UserService{
  17.  
  18. @GetMapping("/test/sayHi?name={name}")
  19. String sayHi(@PathVariable String name);
  20.  
  21. /**
  22. * 测试 插入一条信息
  23. * @param user
  24. * @return
  25. */
  26. @GetMapping("/test/insertInfo")
  27. String insertInfo(@RequestBody User user);
  28.  
  29. }

  说明:

    1、consumer中的启动类需要加上@EnableFeignClients注解,这里代码没有贴出

    2、FeignClient注解有多种属性可选,如自定义配置信息的configuration、直接指定访问链接的url等,由于我这里只是一个测试的demo就直接用name来指定在eureka中注册的Prodiver的服务名称了;

    3、代码中的GetMapping就是上面说的两种方式之一,consumer根据Prodiver提供的接口文档进行编码调用的;

    4、代码中的UserService就是上面说的另一种方式,由服务提供者提供的一个接口依赖包,我这里包名叫server-apis,,这样consumer中就可以像调用本地方法一样调用远程服务提供的接口能力,下面贴上UserService的代码:

  1. package com.darling.api.service;
  2.  
  3. import com.darling.api.model.UserInfo;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6.  
  7. /**
  8. * @description:
  9. * @author: dll
  10. * @date: Created in 2021/9/15 22:02
  11. * @version:
  12. * @modified By:
  13. */
  14. @RequestMapping("/serverApis")
  15. public interface UserService {
  16.  
  17. @GetMapping("/test")
  18. UserInfo test();
  19.  
  20. /**
  21. * 获取用户信息
  22. * @return 用户姓名、年龄等信息
  23. */
  24. @GetMapping("/getInfo")
  25. UserInfo getInfo();
  26.  
  27. }

    需要注意的是,无论是通过Prodiver提供的依赖包还是直接编写调用代码,以上代码中所有的类似GetMapping、PostMapping的注解都是由Prodiver暴露出来的接口请求路径,由feign负责识别、拼装并发起远程请求的;

    下面来看看consumer中的Controller的调用代码:

  1. package com.darling.eureka.consumer.controller;
  2.  
  3. import com.darling.api.model.UserInfo;
  4. import com.darling.eureka.consumer.model.User;
  5. import com.darling.eureka.consumer.service.UserApiService;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8.  
  9. import javax.annotation.Resource;
  10.  
  11. /**
  12. * @description: 测试openFeign的远程调用
  13. * @author: dll
  14. * @date: Created in 2021/8/25 21:52
  15. * @version: 1.0
  16. * @modified By:
  17. */
  18. @RestController
  19. @RequestMapping("/consumer/test")
  20. public class TestConsumerController {
  21.  
  22. @Resource
  23. private UserApiService userApiService;
  24.  
  25. /**
  26. * 调用UserApiService中自己根据接口文档编写的调用代码
  27. * @return
  28. */
  29. @RequestMapping("/sayHello")
  30. public String sayHello() {
  31. String res = userApiService.sayHi("hahaha");
  32. System.out.println("res = " + res);
  33. return res;
  34. }
  35.  
  36. /**
  37. * 调用UserApiService中自己根据接口文档编写的调用代码
  38. * @param user
  39. * @return
  40. */
  41. @RequestMapping("/insert")
  42. public String insertInfo(User user) {
  43. String res = userApiService.insertInfo(user);
  44. System.out.println("res = " + res);
  45. return res;
  46. }
  47.  
  48. /**
  49. * 调用UserApiService中由Prodiver提供的server-apis依赖包中的UserService的接口
  50. * @return
  51. */
  52. @RequestMapping("/getUserInfo")
  53. public UserInfo getUserInfo() {
  54. UserInfo res = userApiService.getInfo();
  55. System.out.println("res = " + res);
  56. return res;
  57. }
  58.  
  59. }

  provider端

  如果没有采用由Prodiver提供接口依赖包的方式的话,使用openFeign对Prodiver端几乎无任何侵入,Prodiver只需写好自己可以提供的服务并提供一份接口文档即可;

  下面主要聊聊如果通过提供接口依赖包的方式Prodiver应该做哪些调整以及其中可能遇到的坑

  首先,需要定义一个专门用来提供接口能力的api服务(server-apis),就正常的web服务即可,代码可参见上面的UserService;然后由Prodiver引入这个服务;需要注意的是如果通过这种方式提供服务的话,Prodiver

需要以接口实现类的方式来提供具体服务的实现,不能在controller中定义接口的调用路径了,否则访问会直接404;

  总结

  通过以上的调用实例,我们可以得出结论,feign调用虽香但是对代码的确会有一定的侵入性,主要针对服务的调用者而言,而是通过依赖包调用还是由consumer自己编码调用,无非是愿意接受jar包耦合还是接口文档耦合了,

所以对于同一个团队开发的consumer和Prodiver来说,个人更倾向于通过定义统一的接口依赖包,双方严格按照依赖包进行开发,依赖包的变更大家都能实时感知并作出及时响应,调用起来也更方便;

而对于跨团队来开发consumer和Prodiver来说,个人认为通过接口文档会更合理,consumer相对来说能把命运掌握在自己手上,对接的时候只认接口文档,减少了对接口包的依赖

  

    

springcloud组件梳理之Feign的更多相关文章

  1. springcloud组件梳理之hystrix

    在微服务架构体系中,各服务中间的相互调用是常态,没有哪个服务能保证自身百分百不会出问题,然后再加上网络的波动以及环境等问题,服务间调用的稳定性无法保证,这时候就需要一个有容错能力的组件来介入,当调用出 ...

  2. SpringCloud组件及功能介绍

    1.什么是SpringClould?    SpringCloud是一个基于SpringBoot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线. ...

  3. SpringCloud组件的停更和替换说明

    SpringCloud的Hoxton版本,和之前的版本相比,用新的组件替换掉了原来大部分的组件,老的组件现在处于 停更不停用 的状况. 详情见下图(× 的表示之前的组件,现在停更了的:√ 的表示新的替 ...

  4. Tomcat组件梳理—Service组件

    Tomcat组件梳理-Service组件 1.组件定义 Tomcat中只有一个Server,一个Server可以用多个Service,一个Service可以有多个Connector和一个Contain ...

  5. Tomcat组件梳理—Digester的使用

    Tomcat组件梳理-Digester的使用 再吐槽一下,本来以为可以不用再开一个篇章来梳理Digester了,但是发现在研究Service的创建时,还是对Digester的很多接口或者机制不熟悉,简 ...

  6. Tomcat组件梳理--Server

    Tomcat组件梳理--Server 1.Server组件的定义和功能概述 定义: Server组件用于描述一个启动的Tomcat实例,一个Tocmat被启动,在操作系统中占用一个进程号,提供web服 ...

  7. Tomcat组件梳理--Catalina

    Tomcat组件梳理--Catalina 1.定义和功能 Catalina是Tomcat的核心组件,是Servlet容器,Catalina包含了所有的容器组件,其他模块均为Catalina提供支撑.通 ...

  8. 1.Tomcat组件梳理—Bootstrap启动器

    Tomcat组件梳理-Bootstrap启动器 一开始是直接从Server开始做梳理的,但是发现有很多东西是从Catalina传输过来的,Catalina又是从Bootstrap启动的,所以还是回过头 ...

  9. SpringCloud与微服务Ⅶ --- Feign负载均衡

    官方文档:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign 一.Feign是什么 Feign是一 ...

随机推荐

  1. CF914G Sum the Fibonacci (快速沃尔什变换FWT + 子集卷积)

    题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...

  2. 第六十九篇:vue项目的运行过程

    好家伙, 1.vue的目录结构分析 来看看项目的目录 (粗略的大概的解释) 2.vue项目的运行流程 在工程化项目中,vue要做的事情很单纯:通过main.js把App.vue渲染到index.htm ...

  3. 手写tomcat——netty版

    点击查看代码 package com.grady.diytomcat; import com.grady.diytomcat.handler.DiyNettyTomcatHandler; import ...

  4. 用VBA在PowerPoint中实现日期时间秒级动态显示

    '*********************************************************** 使用说明 ********************************** ...

  5. Windows LDAP加固之LDAP over SSL和通道绑定

    很多网络通信都可以用SSL来加密的,LDAP也不列外,同样可以用SSL加密. LDAPS使用的证书必须满足以下几个条件: 1.证书的增强性密钥用法中必须有服务器身份验证Server Authentic ...

  6. 面试突击84:Spring 有几种事务隔离级别?

    Spring 中的事务隔离级别和数据库中的事务隔离级别稍有不同,以 MySQL 为例,MySQL 的 InnoDB 引擎中的事务隔离级别有 4 种,而 Spring 中却包含了 5 种事务隔离级别. ...

  7. 前端必读:如何在 JavaScript 中使用SpreadJS导入和导出 Excel 文件

    JavaScript在前端领域占据着绝对的统治地位,目前更是从浏览器到服务端,移动端,嵌入式,几乎所有的所有的应用领域都可以使用它.技术圈有一句很经典的话"凡是能用JavaScript实现的 ...

  8. Kibana:在Kibana中对数据进行深入分析 (drilldown)

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/105193907 在上面,我们需要把之前地址栏中拷贝的内容粘贴过来,并做相应的修改.针 ...

  9. centos7.9使用yum方式安装MongoDB 5.x

    1.配置阿里云yum仓库 #vim /etc/yum.repos.d/mongodb-org-5.0.repo [mngodb-org] name=MongoDB Repository baseurl ...

  10. 第二章:视图层 - 5:HttpRequest对象

    每当一个用户请求发送过来,Django将HTTP数据包中的相关内容,打包成为一个HttpRequest对象,并传递给每个视图函数作为第一位置参数,也就是request,供我们调用. HttpReque ...