三、springcloud之服务调用Feign
一、背景
项目中接口调用:
- Httpclient
- Okhttp
- Httpurlconnection
- RestTemplate
微服务提供了更简单,方便的Feign
二、Feign简介
- Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。
- Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
- 而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
- SpringCloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpMessageConverters。
- Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
三、使用
1.准备:
1.gradle:
compile('org.springframework.cloud:spring-cloud-starter-feign')
2.在应用主类中通过@EnableFeignClients注解开启Feign功能,具体如下:
@EnableFeignClients可以指定扫描的包。如@EnableFeignClients(com.test)
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MyApplication { public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
} }
2.绑定服务
1.服务提供方提供接口
2.消费方继承接口,添加注解
@FeignClient(name = "微服务之间调用直接在name处输入服务名,其他rest需要指定url", url = "${yml配置文件url地址}", fallback = HystrixLawsFallback.class, configuration = MyFeignConfig.class)
public interface ServiceClient {
@RequestMapping(method = RequestMethod.GET, value = "/client/{id}")
ClientVo getClient(@RequestParam("id") String id);
}
name/value:微服务之间调用直接在name处输入服务名,其他rest需要指定url,若是没有其他可以省略
原有serviceId已废弃
url:指定访问路径RequestMapping表明相对路径
fallback:Feign熔断器回调
configuration:可以让你自定义配置信息来覆盖Feign的默认配置
value:表示你要消费哪个服务的接口
path:就是统一的前缀
该注解表示申明创建一个rest client bean,可以直接通过Autowired注入使用,如果ribbon在工程中启用,则会使用load balance进行后端请求调用,可以为FeignClient指定value表明需要访问的serviceId
说明:
fallback = HystrixServiceFallback.class为熔断返回处理
@Component
public class HystrixServiceFallback implements Client { @Override
public ClientVo getClient(String id) {
ClientVo client = new FClientVo();
client.setName(false);
return client;
} }
configuration = MyFeignConfig.class配置日志输出
@Configuration
public class MyFeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
level级别:
NONE:不记录任何信息
BASIC:仅记录请求方法、URL以及响应状态码和执行时间
HEADERS:BASIC信息加上请求和响应的头信息
FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等。
3.调用
controller直接注入使用:
@Autowired
private ServiceClient serviceClient; @GetMapping("{id}")
public ClientVo getClient(@PathVariable String id) throws Exception {
ClientVo client = serviceClient.getClient(id);
return client;
}
Feign的源码实现的过程:
首先通过@EnableFeignCleints注解开启FeignCleint
根据Feign的规则实现接口,并加@FeignCleint注解
程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。
当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
RequesTemplate在生成Request
Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
三、springcloud之服务调用Feign的更多相关文章
- 四、springcloud之服务调用Feign(二)
一.Fegin的常见应用 Feign的Encoder.Decoder和ErrorDecoder Feign将方法签名中方法参数对象序列化为请求参数放到HTTP请求中的过程,是由编码器(Encoder) ...
- SpringCloud 源码系列(6)—— 声明式服务调用 Feign
SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...
- Java进阶(三十一) Web服务调用
Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...
- SpringCloud之声明式服务调用 Feign(三)
一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样.我们知道,阿里巴巴的doubbo采 ...
- 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign
上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...
- 【Dalston】【第三章】声明式服务调用(Feign)
当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那 ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)
在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...
- SpringCloud --服务调用Feign
介绍 服务间通信简介 一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务.商品服务.用户服务等共同组成. 这些服务相互独立,但又相互依赖.由于它们相互依赖,所以需要通过通信的方式来进行相互 ...
- springCloud中的服务调用feign
springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...
随机推荐
- Python画统计图
https://blog.csdn.net/jenyzhang/article/details/52046372
- 洛谷 P1199 三国游戏 解题报告
P1199 三国游戏 题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有\(N\)位武将(\(N\)为 ...
- WEB入门一 网页设计基础
本章简介 在当今社会,网页是网络信息共享和发布的主要形式.而HTML (Hyper Text Mark-up Language),即超文本标记语言,是创建网页基础.本章将学习HTML文档的基本结构.组 ...
- bzoj 2839 : 集合计数 容斥原理
因为要在n个里面选k个,所以我们先枚举选的是哪$k$个,方案数为$C_{n}^k$ 确定选哪k个之后就需要算出集合交集正为好这$k$个的方案数,考虑用容斥原理. 我们还剩下$n-k$个元素,交集至少为 ...
- BZOJ 4802 欧拉函数
4802: 欧拉函数 Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sample Input 8 Sample Outp ...
- Python word_cloud 样例 标签云系列(三)
转载地址:https://zhuanlan.zhihu.com/p/20436642word_cloud/examples at master · amueller/word_cloud · GitH ...
- (四)关于读文件的结束的判别方法(EOF和feof)以及区别
关于读文件的时候判断文本是否读完的方式一般可以通过EOF,一般宏定义为-1.因为ASCII码中不可能出现-1. 当以文本形式读取文件内容, 读入的字符值等于EOF时, 表示读入的已不是正常的字符而是文 ...
- 【数据库-MySql】清空所有表格的所有数据
方式一. drop procedure if exists del_all_tb; delimiter $$ create procedure del_all_tb(db char(20)) begi ...
- 用pip install升级已安装的包的附加包, 以tabulate包为例
用pip install升级已安装的附加包, 以tabulate包为例 去pypi官网查看tabulate包的介绍, 发现tabulate 0.7.6才开始支持宽字符的美化打印. 而且还需要安装它的附 ...
- [转载]jsonp详解
http://www.cnblogs.com/lemontea/archive/2012/12/11/2812268.html json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到, ...