从零开始搭建spring-cloud(3) ----feign
撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>
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相关推荐
- 自己动手,使用Spring Initializr从零开始搭建Spring Cloud项目
新建Project 这里使用的开发工具是IDEA,JDK版本1.8. 打开IDEA开发工具,File -> New -> Project 然后一步步往下设置,然后到这一步,选择Spring ...
- 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (中)
本文承接上文<从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (上)> ...
- 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)
告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...
- maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...
- Spring Cloud (Eureka,Feign,Hystrix整合)
Spring Cloud(Eureka,Feign,Hystrix整合) Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代 ...
- Spring Cloud(四):Spring Cloud Alibaba Feign Dubbo
扩展点 RequestInterceptor#apply 扩展点 feign.Client#execute spring cloud dubbo 调用 RPC RPC 全称是 Remote Proce ...
- 从0到1手把手搭建spring cloud alibaba 微服务大型应用框架(十五) swagger篇 : gateway 集成swagger 与 knife4j实现在线api文档并嵌入到自己项目内
背景 我们日常开发中基本都是协同开发的,当然极个别的项目整体前后端都是一个人开发的,当多人协作时,尤其是前后端人员协同开发时 必然会面临着前端需要了解后端api接口的情况,两个选择,提前设计好文档,然 ...
- 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?
在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...
- 从零开始带你实战搭建Spring Cloud Alibaba商城项目
这里写目录标题 一:环境搭建 二:项目搭建 三:分布式组件--Spring Cloud Alibaba 1.微服务架构简介 2.为什么使用SpringCloud Alibaba作为组件 3.本次项目技 ...
- Eclipse(STS) 初次搭建Spring Cloud项目之声明式REST调用+负载均衡实现Feign(四)
一.什么是Feign Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用.Feign通过处理注解,将请 ...
最新文章
- Pytorch 网络模型的保存与读取
- 如何测试程序是否_软件开发过程中,如何进行自动化测试?Unit Test 和 UI Test
- 来一份全面的面试宝典练练手,面试真题解析
- python类中的函数调用关系_Python中类的内置方法与继承关系实例
- AcWing 898. 数字三角形
- pairwork2测试作业
- 统计图表类库--libchart使用简介
- cfupload java_java的web项目上传文件和下载
- java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)
- 【板栗糖GIS】kmz数据是什么,如何打开,普通数据如何转换成kmz格式
- 月薪30k的PHP架构师的成长路线图1.0!
- springboot整合
- 如何成为一个游戏制作人——教程企划
- C语言基础练习-输入球体半径,计算球体表面积和体积
- java读取并导出多类型数据csv文件
- 大数据学习之HDFS基础
- kubernetes 菜鸟_菜鸟系列k8s——k8s快速入门(1)
- 助记符表示指令功能的计算机语言,计算机语言分类.doc
- 可燃气传感器 android,可燃气体传感器工作原理,一文看懂!
- SSM电影院购票网站
热门文章
- sql server 2008学习3 表组织和索引组织
- php json和数组,php数组和json数组之间的互相转化
- scikit-learn 梯度提升树(GBDT)调参小结
- 非科班的java程序员该如何补充计算机基础知识,需要看哪些书?
- PHP与Redis结合令牌桶算法进行实现限流
- 影驰名人堂送的机器人_玩转GTX 1080Ti名人堂显示屏 影驰全新魔盘使用教程
- halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...
- 两台linux服务器负载均衡代码实现,nginx实现负载均衡,nginx负载均衡确保两台服务器数据保...
- 文件上传linux服务器,Linux 文件上传Linux服务器
- Linux mkdir 命令创建多级目录