在前面的学习中,我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码:

String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);

如果就学到这里,你可能以后需要编写类似的大量调用代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?这就是我们接下来要讲的Feign的功能了。

一、简介——什么是Feign

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller调用service一样,你不用再使用传统的restTemplate构造请求、解析返回数据等等操作,一切都交给Feign去做。(用过Dubbo的同学可以将其形成一个联系与对比。)

项目主页:https://github.com/OpenFeign/feign简单画了一个调用图

二、实操——代码演示

1.导入openfeign依赖

        <dependency>            <groupId>org.springframework.cloudgroupId>            <artifactId>spring-cloud-starter-openfeignartifactId>        dependency>

2.启动类开启feign功能

@SpringBootApplication@EnableFeignClients  //开启feign客户端public class ConApp {    public static void main(String[] args) {        SpringApplication.run(ConApp.class,args);    }}

3.编写feign客户端UserClient接口

@FeignClient(value = "service-provider")public interface UserClient {    @GetMapping("user/{id}")    User selectById(@PathVariable("id") int id);}
  • 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像

  • @FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称

  • 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果

    service-provider的调用接口

4.使用UserClient调用

@RestController@RequestMapping("/consumer")public class ConsuController {    @Autowired    public UserClient userClient;    @GetMapping("/{id}")    public User selectById(@PathVariable("id") int id){        User user = userClient.selectById(id);        return user;    }}

5.启动测试

访问成功!6.对Ribbon和hystrix的支持

Feign中本身已经集成了Ribbon依赖和自动配置;也有对Hystrix的集成,只不过熔断功能默认情况下是关闭的。我们需要通过下面的参数来开启:(在service-consumer工程添加配置内容)

feign:  hystrix:    enabled: true # 开启Feign的熔断功能

我们要定义一个类UserClientFallback,实现刚才编写的UserClient,作为fallback的处理类。

@Componentpublic class UserClientFallback implements UserClient{    public User selectById(int id) {        User user = new User();        user.setName("服务器繁忙,请稍后再试!");        return user;    }}

然后在UserClient中,指定刚才编写的实现类

@FeignClient(value = "service-provider",fallback = UserClientFallback.class)public interface UserClient {    @GetMapping("user/{id}")    User selectById(@PathVariable("id") int id);}

重启测试

三、请求压缩与日志级别

1.请求压缩Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能:

feign:  compression:    request:      enabled: true # 开启请求压缩    response:      enabled: true # 开启响应压缩   

同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:

feign:  compression:    request:      enabled: true # 开启请求压缩      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型      min-request-size: 2048 # 设置触发压缩的大小下限
  • 注:上面的数据类型、压缩大小下限均为默认值。

2.日志级别

通过logging.level.xx=debug来设置日志级别。然而这个对Fegin客户端而言不会产生效果。因为@FeignClient注解修改的客户端在被代理时,都会创建一个新的Fegin.Logger实例。我们需要额外指定这个日志的级别才可以。设置com.diku.consumer下都为debug

logging:  level:    com.diku.consumer: debug

编写配置类

@Configurationpublic class FeignLogConfiguration {    @Bean    Logger.Level feignLoggerLevel(){        return Logger.Level.FULL;    }}

  • NONE:不记录任何日志信息,这是默认值。

  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间

  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

在UserClient中指定配置类:

@FeignClient(value = "service-provider",fallback = UserClientFallback.class,        configuration = FeignLogConfiguration.class)public interface UserClient {    @GetMapping("user/{id}")    User selectById(@PathVariable("id") int id);}

重启项目,即可看到每次访问的日志:

北漂Java 程序员一枚,喜欢就点个关注吧。

往期精选

SpringCloud配置中心的使用

SpringCloud-Eureka高可用搭建

SpringCloud-Ribbon负载均衡

SpringCloud-Hystrix解决雪崩

Nacos入门案例

Mybatis动态SQL

feign调用https接口_SpringCloudFeign远程调用相关推荐

  1. Xamarin使XRPC实现接口/委托远程调用

    在之前的文章中已经介绍如何使用Beetlex.XRCP组件进行接口/委托远程调用:由于组件BeetleX.XRPC.Clients支持.NETStandard2,因此Xamarin同样可以使用它来实现 ...

  2. android app通过Geth RPC接口实现远程调用

    记录一下APP怎么通过以太坊的RPC接口实现远程调用.此过程的环境为Window7和Android studio2.2.3.以web3_clientVersion为例.更多用法参考Geth JSON- ...

  3. Spring Boot项目中使用RestTemplate调用https接口出现 unable to find valid certification path to requested target

    问题描述:Spring Boot项目中使用RestTemplate调用https接口出现以下错误: PKIX path building failed: sun.security.provider.c ...

  4. python调用webservice接口实例_python调用各种接口,webservice,c接口,com接口,socket协议方法...

    python调用webservice接口(SOAP) (2)调用示例: 需要先安装suds库:pip install suds from suds.client import Client #如果需要 ...

  5. 在php中调用java接口吗,php 调用 java 接口

    php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...

  6. spring 调用python_Spring http服务远程调用实现过程解析

    最近公司有个新的需求,写了一个接口,想要把服务暴露出去,但是这个服务所在的进程是非web项目,(可以理解成schedule/batch等进程项目),所以没有tomcat等容器,而且只有这一个服务,无论 ...

  7. c语言调用c 接口方法,C++调用C接口的实现示例

    C++调用C代码 一个C语言文件p.c #include void print(int a,int b) { printf("这里调用的是C语言的函数:%d,%d\n",a,b); ...

  8. java调用php接口_java 如何调用接口

    在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适,所以,问题来了,java如何调用接口?很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接 ...

  9. Java调用Https接口:fatal, handshake_failure问题记录

    一. 问题描述 HttpClient调用接口,报错:handling exception: javax.net.ssl.SSLHandshakeException: Received fatal al ...

  10. rpa调用https接口 返回数据异常_金融企业“银行余额RPA查询机器人”解读

    一.财务机器人应用背景 公司简介 金融行业银行卡联合组织--是只通过银联跨行交易清算系统,实现商业银行系统间的互联互通和资源共享,保证银行卡跨行.跨地区和跨境的使用的组织. 总部设于上海,作为中国的银 ...

最新文章

  1. 某程序员对比美团和阿里的卷文化区别:美团重过程,死抠没用细节;阿里更自由,注重结果!...
  2. 【Java】eclipse如何导入项目
  3. 掌握 analyze API,一举搞定 Elasticsearch 分词难题
  4. win10 ndk hello_world
  5. Spring MVC 的常用注解
  6. 普通电阻触摸屏多点触摸低成本解决方 转载
  7. 程序员到底要不要重复造轮子?
  8. 带线程池的socket客户端与服务端
  9. 31天重构学习笔记17. 提取父类
  10. 【泛型高级-通配符】
  11. Qt5学习笔记之串口助手四:增加16进制/ASCII切换、周期发送
  12. 解决 fatal: unable to access xxx: Encountered end of
  13. Java 内存模型(JMM)
  14. 优秀的长截图标注工具:iShot for Mac中文免费
  15. Alta发布高速MIL-STD-1553 ARINC429模块-USB3.0
  16. 写一本技术书能赚多少钱
  17. 蓝牙渗透测试过程:部分工具使用方法
  18. 服务器bios界面usb无线网卡,BIOS怎么开启无线网卡
  19. openstack中 Server Error for url: http://controller:9696/v2.0/agents, Internal Server Error
  20. 用python画多啦a梦源码_python 画多啦A梦

热门文章

  1. 14.看板方法---运营回顾
  2. 1.Kubernetes 简介
  3. 9. Doctrine2
  4. 1.OAuth 简介
  5. 88. cdata , dtd
  6. Magento url 问题
  7. Python学习之面向对象(一)
  8. PIP(Python包管理工具)-Mac环境下安装
  9. 0/1背包总结(持续更新...)
  10. javascript中 try catch finally 的使用