撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>

Feign简介

Feign是Netflix开发的声明式、模块化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮组我们更加便捷、优雅的调用HTTP API。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对feign进行了增强,并整合了Ribbon和Eureka,从而让Feign的使用更加便捷。

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。

简而言之:

  • Feign 采用的是基于接口的注解
  • Feign 整合了ribbon

准备工作

继续之前的工作,启动Eureka server,端口为8080,启动spring-cloud-eureka-provider-A-1、启动spring-cloud-eureka-provider-A-2,端口分别为8081、8082

创建一个feign服务

新建一个spring-boot工程,取名为spring-cloud-feign,在它的pom文件引入Feign的起步依赖spring-cloud-starter-feign、Eureka的起步依赖spring-cloud-starter-eureka、Web的起步依赖spring-boot-starter-web,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.vincent</groupId><artifactId>spring-cloud-feign</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.4.RELEASE</version><scope>import</scope><type>pom</type></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies></project>

在工程的配置文件application.properties文件,指定程序名为service-feign,端口号为8083,服务注册地址为http://127.0.0.1:8080/eureka/,代码如下:

# 注册中心的注册地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8080/eureka/# 服务名称--调用的时候根据名称来调用该服务的方法
spring.application.name=service-feign
server.port=8083

在程序的启动类App ,加上@EnableFeignClients注解开启Feign的功能:

package com.vincent;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** Created by vincent on 2019-6-18 21:56*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}

定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了service-provider-A服务的“/user/{name}”接口,代码如下:

@FeignClient("service-provider-A")
public interface FeignService {@GetMapping("/user/{name}")Map<String,Object> getUser(@PathVariable("name") String userName);
}

在Web层的controller层,对外暴露一个"/user/{name}"的API接口,通过上面定义的Feign客户端FeighService 来消费服务。代码如下:

public class UserController {@AutowiredFeignService feignService;@GetMapping("/user/{userName}")public Map<String, Object> getUser(@PathVariable("userName") String userName){Map<String, Object> user = feignService.getUser(userName);System.out.println(user);return user;}
}

启动程序,多次访问http://localhost:8083/user/vincent,浏览器交替显示:

{"from":"provider-A-2","id":"vincent"}
{"from":"provider-A-1","id":"vincent"}

Ribbon与Feign的区别

Ribbon
是一个基于 HTTP 和 TCP 客户端 的负载均衡的工具。
它可以 在客户端 配置 RibbonServerList(服务端列表),使用 HttpClient 或 RestTemplate 模拟http请求,步骤相当繁琐。

Feign
Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。

采用接口的方式, 只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方法即可, 不需要自己构建http请求。

然后就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写 客户端变得非常容易。

类似于 mybatis 的 @Mapper注解 。

spring-cloud-starter-openfeign 里面已经包含了 spring-cloud-starter-ribbon(Feign 中也使用了 Ribbon)

从零开始搭建spring-cloud(3) ----feign相关推荐

  1. 自己动手,使用Spring Initializr从零开始搭建Spring Cloud项目

    新建Project 这里使用的开发工具是IDEA,JDK版本1.8. 打开IDEA开发工具,File -> New -> Project 然后一步步往下设置,然后到这一步,选择Spring ...

  2. 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (中)

    本文承接上文<从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (上)> ...

  3. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  4. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

    项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...

  5. Spring Cloud (Eureka,Feign,Hystrix整合)

    Spring Cloud(Eureka,Feign,Hystrix整合) Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代 ...

  6. Spring Cloud(四):Spring Cloud Alibaba Feign Dubbo

    扩展点 RequestInterceptor#apply 扩展点 feign.Client#execute spring cloud dubbo 调用 RPC RPC 全称是 Remote Proce ...

  7. 从0到1手把手搭建spring cloud alibaba 微服务大型应用框架(十五) swagger篇 : gateway 集成swagger 与 knife4j实现在线api文档并嵌入到自己项目内

    背景 我们日常开发中基本都是协同开发的,当然极个别的项目整体前后端都是一个人开发的,当多人协作时,尤其是前后端人员协同开发时 必然会面临着前端需要了解后端api接口的情况,两个选择,提前设计好文档,然 ...

  8. 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?

    在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...

  9. 从零开始带你实战搭建Spring Cloud Alibaba商城项目

    这里写目录标题 一:环境搭建 二:项目搭建 三:分布式组件--Spring Cloud Alibaba 1.微服务架构简介 2.为什么使用SpringCloud Alibaba作为组件 3.本次项目技 ...

  10. Eclipse(STS) 初次搭建Spring Cloud项目之声明式REST调用+负载均衡实现Feign(四)

    一.什么是Feign Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用.Feign通过处理注解,将请 ...

最新文章

  1. Pytorch 网络模型的保存与读取
  2. 如何测试程序是否_软件开发过程中,如何进行自动化测试?Unit Test 和 UI Test
  3. 来一份全面的面试宝典练练手,面试真题解析
  4. python类中的函数调用关系_Python中类的内置方法与继承关系实例
  5. AcWing 898. 数字三角形
  6. pairwork2测试作业
  7. 统计图表类库--libchart使用简介
  8. cfupload java_java的web项目上传文件和下载
  9. java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)
  10. 【板栗糖GIS】kmz数据是什么,如何打开,普通数据如何转换成kmz格式
  11. 月薪30k的PHP架构师的成长路线图1.0!
  12. springboot整合
  13. 如何成为一个游戏制作人——教程企划
  14. C语言基础练习-输入球体半径,计算球体表面积和体积
  15. java读取并导出多类型数据csv文件
  16. 大数据学习之HDFS基础
  17. kubernetes 菜鸟_菜鸟系列k8s——k8s快速入门(1)
  18. 助记符表示指令功能的计算机语言,计算机语言分类.doc
  19. 可燃气传感器 android,可燃气体传感器工作原理,一文看懂!
  20. SSM电影院购票网站

热门文章

  1. sql server 2008学习3 表组织和索引组织
  2. php json和数组,php数组和json数组之间的互相转化
  3. scikit-learn 梯度提升树(GBDT)调参小结
  4. 非科班的java程序员该如何补充计算机基础知识,需要看哪些书?
  5. PHP与Redis结合令牌桶算法进行实现限流
  6. 影驰名人堂送的机器人_玩转GTX 1080Ti名人堂显示屏 影驰全新魔盘使用教程
  7. halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...
  8. 两台linux服务器负载均衡代码实现,nginx实现负载均衡,nginx负载均衡确保两台服务器数据保...
  9. 文件上传linux服务器,Linux 文件上传Linux服务器
  10. Linux mkdir 命令创建多级目录