最近刚好打算做一个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的依赖:

     <!-- 引入open-feign的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> <!-- 引入open-feign的httpClien依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
     <!-- 引入Prodiver提供的接口包(根据实际需要) -->
     <dependency>
    <groupId>com.darling.api</groupId>
    <artifactId>server-apis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <scope>compile</scope>
     </dependency>

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

package com.darling.eureka.consumer.service;

import com.darling.api.service.UserService;
import com.darling.eureka.consumer.model.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*; /**
* @description: 通过openFeign远程调用服务提供者
* @author: dll
* @date: Created in 2021/9/14 12:29
* @version: 1.0
* @modified By:
*/
@FeignClient(name = "EUREKA-PROVIDER")
public interface UserApiService extends UserService{ @GetMapping("/test/sayHi?name={name}")
String sayHi(@PathVariable String name); /**
* 测试 插入一条信息
* @param user
* @return
*/
@GetMapping("/test/insertInfo")
String insertInfo(@RequestBody User user); }

  说明:

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

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

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

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

package com.darling.api.service;

import com.darling.api.model.UserInfo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; /**
* @description:
* @author: dll
* @date: Created in 2021/9/15 22:02
* @version:
* @modified By:
*/
@RequestMapping("/serverApis")
public interface UserService { @GetMapping("/test")
UserInfo test(); /**
* 获取用户信息
* @return 用户姓名、年龄等信息
*/
@GetMapping("/getInfo")
UserInfo getInfo(); }

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

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

package com.darling.eureka.consumer.controller;

import com.darling.api.model.UserInfo;
import com.darling.eureka.consumer.model.User;
import com.darling.eureka.consumer.service.UserApiService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /**
* @description: 测试openFeign的远程调用
* @author: dll
* @date: Created in 2021/8/25 21:52
* @version: 1.0
* @modified By:
*/
@RestController
@RequestMapping("/consumer/test")
public class TestConsumerController { @Resource
private UserApiService userApiService; /**
* 调用UserApiService中自己根据接口文档编写的调用代码
* @return
*/
@RequestMapping("/sayHello")
public String sayHello() {
String res = userApiService.sayHi("hahaha");
System.out.println("res = " + res);
return res;
} /**
* 调用UserApiService中自己根据接口文档编写的调用代码
* @param user
* @return
*/
@RequestMapping("/insert")
public String insertInfo(User user) {
String res = userApiService.insertInfo(user);
System.out.println("res = " + res);
return res;
} /**
* 调用UserApiService中由Prodiver提供的server-apis依赖包中的UserService的接口
* @return
*/
@RequestMapping("/getUserInfo")
public UserInfo getUserInfo() {
UserInfo res = userApiService.getInfo();
System.out.println("res = " + res);
return res;
} }

  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. 记一次用arthas排查jvm中CPU占用过高问题

    记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...

  2. FusionCopmpute之CNA,VRM虚拟机安装

    CNA和VRM安装步骤一样,需要修改的只有IP 按步骤创建 修改自己虚拟机想要存放的位置 需要把自己网络同样配置为仅主机(提前配好) 自己也可以修改至200G 虚拟机只是用多少取多少 CNA可以设置为 ...

  3. Arrays.asList()你真的知道怎么用吗?

    发现问题 前几天在看别人的项目的时候,发现一个问题,简单复现一下这个问题 // 注意这是一个Integer对象的数组哦 Integer[] arr = new Integer[]{9999,88,77 ...

  4. MAC Golang环境搭建

    1. 下载golang 下载地址:https://golang.google.cn/dl/ 根据MAC左上角苹果图标->关于本机,即可查看芯片类型 2. 安装golang 在 下载 中双击 下载 ...

  5. The 19th Zhejiang Provincial Collegiate Programming Contest

    目录 A.JB Loves Math B.JB Loves Comma C. JB Wants to Earn Big Money G. Easy Glide I. Barbecue L. Candy ...

  6. Java 流处理之收集器

    Java 流(Stream)处理操作完成之后,我们可以收集这个流中的元素,使之汇聚成一个最终结果.这个结果可以是一个对象,也可以是一个集合,甚至可以是一个基本类型数据. 以记录 Record 为例: ...

  7. Linux安装Minio

    Linux安装Minio 一.安装包方式安装 1.下载minio 1.1 手动下载:https://docs.min.io/docs/minio-quickstart-guide.html ​ 访问上 ...

  8. Minio VS Ceph

    文章转载自:https://blog.csdn.net/Moolight_shadow/article/details/123204412

  9. Request Body Search

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-using.html

  10. SonarQube 之 gitlab-plugin 配合 gitlab-ci 完成每次 commit 代码检测

    转载自:https://cloud.tencent.com/developer/article/1010601 1.背景介绍 我们知道使用 SonarQube 可以在日常开发中检测代码质量,除了使用 ...