服务调用有2种方式:REST、RPC,SpringCloud一般用RestTemplate来实现REST调用,

此外SpringCloud还可以使用Feign来调用服务,Feign是声明式的服务调用,所谓声明式就是通过服务接口来调用,和RPC相似。

REST使用HTTP协议,RPC使用TCP协议,Feign只是伪RPC调用,因为Feign底层使用的协议是HTTP。

Eureka、Ribbon、Feign都是Netflix旗下的项目,都被SpringCloud集成了。

此处写一个feign的demo,获取用户的所有订单,user-service调用order-service


服务消费者user-service

(1)创建时勾选Spring Cloud Routing -> OpenFeign,当然Eureka Client、Spring Web等等也要勾选,不用勾选Ribbon,Eureka Client中已经包含了Ribbon的依赖

也可以收手动加feign的依赖:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

(2)引导类上加 @EnableFeignClients

(3)新建包feign用来存放feign服务调用的接口,包下新建接口OrderFeignService

  1. @FeignClient("order-service") //参数指定要调用的服务名称。feign也内置了ribbon,会自动实现负载均衡
  2. public interface OrderFeignService {
  3.  
  4. @GetMapping("/api/v1/order/list") //该服务要调用的地址,不需要使用RESTful风格
  5. List<Order> findOrdersByUserId(@RequestHeader("user_id") Integer user_id); //使用参数表传递参数
  6.  
  7. }

一个要调用的服务对应一个接口,如果要调用多个服务,写多个接口。

使用参数表传递参数,每个参数前都要加注解。

启动应用时检测到引导类上有@EnableFeignClients,会扫描@FeignClient标注的接口,给该接口生成动态代理(使用RestTemplate来代理),放在Spring容器中。

调用服务时,底层还是使用RestTemplate来调用服务,使用的还是HTTP协议。

(4)controller

  1. @Controller
  2. @RequestMapping("/api/v1/user")
  3. public class UserController {
  4. //注入要调用的服务接口,实际是注入动态代理生成的RestTemplate
      @Resource
  5. private OrderFeignService orderFeignService;
  6. //根据用户id查找用户所有订单
  7. @GetMapping("/order/{user_id}")
  8. @ResponseBody
  9. public List<Order> findOrdersByUserId(@PathVariable Integer user_id){
  10. //调用Feign客户端(接口)的方法,传入需要的参数
  11. List<Order> orderList = orderFeignService.findOrdersByUserId(user_id);
  12. return orderList;
  13. }
  14.  
  15. }

实际写代码时要在service层调用服务。

Feign比RestTemplate要麻烦些,底层还是调用RestTemplate,还要包装为代理对象,时间、资源开销都增加了;

一会儿用RESTful风格传参,一会@RequestHeader传参,不统一,如果要在被调者中使用RESTful风格,还需要再写一个方法映射为RESTful风格。

但把服务调用写成接口,使得服务调用也是面向接口编程的,消费者、提供者没有耦合在业务方法(类)中,使用接口对接降低了耦合;

升级时只需修改feign包下的feign接口,不必到处修改RestTemplate的调用,好维护,所以feign也很常用。


服务提供者

  1. @Controller
  2. @RequestMapping("/api/v1/order")
  3. public class OrderController {
  4.  
  5. //根据用户id查找该用户的所有订单
  6. @GetMapping("/list") //请求方式、映射地址都要和消费者中的Feign接口对应
  7. @ResponseBody
  8. public List<Order> findAllByUserId(@RequestHeader("user_id") Integer user_id){ //参数表要和消费者中Feign接口中方法的参数表对应
  9. //一些列操作
  10. //......
  11. return orderList;
  12. }
  13.  
  14. }

Feign有一个很不好地方的:传参方式不统一,消费者用@RequestHeader传参,提供者也要用这个来接收,难以统一使用RESTful


消费者使用@RequestHeader传,提供者只能使用@RequestHeader、@RequestParam来接收。

消费者使用@RequestBody传,提供者只能使用@RequestBody、@RequestParam来接收。

@RequestParam是通用的,请求头、请求体中的数据都可以接收。

一般地,少量数据比如int、String使用@RequestHeader传输,大量数据比如Map、User对象使用@RequestBody来传输。

使用@RequestBody时,映射方式要使用@PostMapping,不能使用@GetMapping,因为体积大,要使用post。

@RequestHeader是将数据绑定到请求头,使用Get方式传输,或者从请求头中获取数据;

@RequestBody是将数据绑定大请求体,使用Post方式传输,或者从请求体中获取数据。

@PathVariable是接收Restful风格的url中的参数。

Restful有个缺点:能传递的数据类型有限,毕竟要写在url中,不能是User之类的对象。

映射方式:

@RequestMapping可以接收、处理所有请求方式中的某一种,需使用method属性指定,不指定时默认为 RequestMethod.GET

@GetMapping只接收、处理GET方式的请求,是@RequestMapping(method=RequestMethod.GET)的简写

@PostMapping只接收、处理POST方式的请求,是@RequestMapping(method=RequestMethod.POST)的简写

@PutMapping

@DeleteMapping

SpringCloud Netflix Feign的更多相关文章

  1. SpringCloud学习笔记(六、SpringCloud Netflix Feign)

    目录: feign简介 feign应用 feign简介: feign是一款Netflix开源的声明式.模板化的http客户端,它可以更加便捷.优雅的调用http api:SpringCloud对Net ...

  2. SpringCloud(5)---Feign服务调用

    SpringCloud(5)---Feign服务调用 上一篇写了通过Ribbon进行服务调用,这篇其它都一样,唯一不一样的就是通过Feign进行服务调用. 注册中心和商品微服务不变,和上篇博客一样,具 ...

  3. 31.【微服务架构】SpringCloud之Feign(五)

    Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Fei ...

  4. SpringCloud使用Feign实现服务间通信

    SpringCloud的服务间通信主要有两种办法,一种是使用Spring自带的RestTemplate,另一种是使用Feign,这里主要介绍后者的通信方式. 整个实例一共用到了四个项目,一个Eurek ...

  5. SpringCloud之Feign负载均衡(四)

    整合Feign pom.xml <dependency> <groupId>org.springframework.cloud</groupId> <arti ...

  6. Spring-Cloud之Feign声明式调用-4

    一.Feign受Retrofit.JAXRS-2.0和WebSocket影响,采用了声明式API 接口的风格,将Java Http 客户端绑定到它的内部. Feign 首要目的是将 Java Http ...

  7. SpringCloud+Eureka+Feign+Ribbon的简化搭建流程,加入熔断,网关和Redis缓存[2]

    目录 前提:本篇是基于 SpringCloud+Eureka+Feign+Ribbon的简化搭建流程和CRUD练习[1] 的修改与拓展 1.修改consumer的CenterFeign.java,把返 ...

  8. SpringCloud实战-Feign声明式服务调用

    在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...

  9. SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);

    SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...

随机推荐

  1. [51nod 1256] 乘法逆元 - exgcd

    给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Solution 用 EXGCD 求 ...

  2. 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...

  3. C# 调用APlayer教程

    APlayer介绍 引擎介绍: APlayer 媒体播放引擎是迅雷公司从 年开始开发的通用音视频媒体文件播放内核. 迅雷看看播放器和迅雷影音就是使用 APlayer 作为播放内核,目前迅雷看看播放器在 ...

  4. ClosedXML、DocumentFormat.OpenXml导出DataTable到Excel

    在很多系统中都用到导出,使用过多种导出方式,觉得ClosedXML插件的导出简单又方便. 并且ClosedXML.DocumentFormat.OpenXml都是MIT开源. 首先通过 Nuget 安 ...

  5. C# WPF发票打印

    微信公众号:Dotnet9,网站:Dotnet9.问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 C# WPF发票打印 内容目录 实现效果 业务场景 编码实现 本文参考 源码下 ...

  6. Centos下查看CPU个数跟核数

    总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep & ...

  7. [CF1303G] Sum of Prefix Sums - 点分治,李超线段树

    给定一棵 \(n\) 个点的带点权的树,求树上的路径 \(x_1,...,x_k\) ,最大化 \(\sum_{i=1}^k ia_{x_i}\) Solution 树上路径问题可用点分治. 考虑如何 ...

  8. Docker造化钟神秀

    之前闲暇之余有玩过一哈Dokcer容器,但是日子挺久了,然后挺多东西就忘记了,趁着今天有时间重拾一下docker的相关知识. 搜索下载镜像 docker search ubuntu docker pu ...

  9. unity ui中使用onmouseover

    unity ui中鼠标移进或者移出的触发方式与2d.3d的不同,2d.3d物体使用的是onmouseover,ui使用的是OnPointerEnter.需要实现以下两个接口. public class ...

  10. overfitting &&underfitting

    1.过拟合 然能完美的拟合模型,但是拟合出来的模型会含有大量的参数,将会是一个含有大量参数的非常庞大的模型,因此不利于实现 1.1解决过拟合的方法 1.1.1 特征选择,通过选取特征变量来减少模型参数 ...