一、背景

项目中接口调用:

  • 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);
}

  

@FeignClient

  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的更多相关文章

  1. 四、springcloud之服务调用Feign(二)

    一.Fegin的常见应用 Feign的Encoder.Decoder和ErrorDecoder Feign将方法签名中方法参数对象序列化为请求参数放到HTTP请求中的过程,是由编码器(Encoder) ...

  2. SpringCloud 源码系列(6)—— 声明式服务调用 Feign

    SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...

  3. Java进阶(三十一) Web服务调用

    Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...

  4. SpringCloud之声明式服务调用 Feign(三)

    一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样.我们知道,阿里巴巴的doubbo采 ...

  5. 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

    上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...

  6. 【Dalston】【第三章】声明式服务调用(Feign)

    当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那 ...

  7. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)

    在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...

  8. SpringCloud --服务调用Feign

    介绍 服务间通信简介 一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务.商品服务.用户服务等共同组成. 这些服务相互独立,但又相互依赖.由于它们相互依赖,所以需要通过通信的方式来进行相互 ...

  9. springCloud中的服务调用feign

    springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...

随机推荐

  1. uoj35 后缀排序

    题目链接:http://uoj.ac/problem/35 这是一道模板题. 读入一个长度为 n 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第 ...

  2. 【Cf #503 B】The hat(二分)

    为什么Cf上所有的交互题都是$binary \; Search$... 把序列分成前后两个相等的部分,每一个都可以看成一条斜率为正负$1$的折线.我们把他们放在一起,显然,当折线的交点的横坐标为整数时 ...

  3. 编译安装haproxy开启支持SSL

    1.下载程序包 # wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz # tar xvf haproxy-1.7.5. ...

  4. Java中JDK,JRE和JVM之间的关系

    初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...

  5. matlab绿色版本合集

    网上找的matlab绿色版本合集链接https://pan.baidu.com/s/1gfDyIo7     密码:pxrs

  6. python学习(24) 使用Xpath解析并抓取美女图片

    Xpath最初用来处理XML解析,同样适用于HTML文档处理.相比正则表达式更方便一些 Xpath基本规则 nodename 表示选取nodename 节点的所有子节点 / 表示当前节点的直接子节点 ...

  7. Python3 笨方法 练习41(面向对象)详解及运行结果

    #无尽模式训练你,检验所掌握的面向对象的单词和短语. import random from urllib.request import urlopen import sys WORD_URL = &q ...

  8. JAVA 线程池基本总结

    合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第三:提高线程 ...

  9. Docker简介和安装(一)

    Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...

  10. 使用 Dojo 掌握面向对象开发

    原文出处:Joe Lennon 从头开始学习 Dojo,第 2 部分 使用 Dojo 掌握面向对象开发 什么是面向对象开发? 面向对象编程(Object-Oriented Programming,OO ...