2020SpringCloud学习年终总结——第七章-Feign_AJSpade的博客-程序员秘密

技术标签: springcloud  

代码地址:https://github.com/AJ-Spade/cloud2020/tree/master

Feign前置

  • Feign是一个声明式的Web服务的客户端,它让编写Web服务的客户端变得更容易,只需创建一个接口,并再接口上添加注解即可。
  • 目的:让编写Java Http客户端(例如消费者80端口的服务)变得更容易;
  • 在之前使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。但是,在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用(于一个80端口的消费者,即一个Http客户端中,被多处代码块中调用),所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在上述基础上进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。
  • 在Feign的实现下,我们只需要创建一个接口,并使用注解的方式配置它(类似以前在Dao接口上标注Mapper注解,现在是在一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定。
  • 简化了使用Spring cloud Ribbon时,自动封装服务调用的客户端的开发量。
  • Feign集成了Ribbon,利用Ribbon维护了Payment的服务列表信息,并通过轮询实现客户端的负载均衡。与Ribbon不同的是,通过feign,只需要以声明的方式定义服务接口(在消费者端,即Http客户端),优雅简单的实现服务调用。
    在这里插入图片描述

版本说明

  • cloud Hoxton.SR1
  • boot 2.2.2RELEASE
  • cloud alibaba 2.1.0 RELEASE
  • java java8
  • Maven 3.5以上
  • Mysql 5.7以上

Feign

  • 使用步骤:

    • 接口+注解,微服务调用接口[email protected]

    • 新建cloud-consumer-feign-order80,注意:Feign是在消费端使用的;

    • POM、YML,然后在主启动类上,添加注解@EnableFeignClient,表示激活并开启Feign;

    • 在业务类中:

      • 业务逻辑接口[email protected]配置调用provider服务(与服务提供者中的业务逻辑层中暴露出来的接口对应,但是具体返回结果,需要看服务提供者中的控制层的对应方法(直接拷贝控制层中的方法也也行,不需要具体内容);@FeignClient相当于使用Feign;

      • 新建PaymentFeignService接口并新增注解@FeignClient;

        //服务提供者的业务层接口
        public interface PaymentService {
            public int create(Payment payment);
            public Payment getPaymentById(@Param("id") Long id);
        }
        
        //服务提供者的控制层对应内容
        @GetMapping(value="/payment/get/{id}")
            public CommonResult getPaymentById(@PathVariable("id") Long id){
                Payment payment = paymentService.getPaymentById(id);
                log.info("*********查询结果"+payment);
                if(payment!=null){
                    return new CommonResult(200,"查询成功,serverPort:"+serverPort,payment);
                }else{
                    return new CommonResult(444,"没有对应记录,查询id:"+id,null);
                }
            }
        
        //消费者的业务逻辑接口[email protected]配置
        @Component
        @FeignClient(value="CLOUD-PAYMENT-SERVICE")//找这个微服务下的如下方法
        public interface PaymentFeignService {
            @GetMapping(value="/payment/get/{id}")微服务的具体调用地址,找的则是8001或8002服务的对应方法
            public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
        }
        
    • 控制层Controller:在controller包下添加OrderFeignController:

      @RestController
      @Slf4j
      public class OrderFeignController {
          @Resource
          private PaymentFeignService paymentFeignService;
      
          @GetMapping(value = "/consumer/payment/get/{id}")
          public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
              return paymentFeignService.getPaymentById(id);
          }
      }
      
      • 测试,①启动eureka集群7001/7002;②启动微服务8001和8002;③启动OpenFeign;④http://localhost/consumer/payment/get/1; 注意:Feign自带负载均衡配置项
  • OpenFeign超时控制:

    • 起因:因为是消费端调用服务提供者对外暴露的URL接口,所以可能服务提供者的方法处理运行了3秒钟,但是消费端只能等2秒钟,就会发生报错;默认Feign客户端只等待1秒钟。

    • 步骤:

      • 服务提供方8001故意写暂停程序;
      • 服务消费方80的业务层添加超时接口PaymentFeignService;
      • 服务消费方80的控制层添加超时方PaymentFeignService;
      • 测试,错误页面;
    • 设置Feign客户端的超时时间,在yml开启配置:

      • server:
          port: 80
        
        eureka:
          client:
            register-with-eureka: true
            service-url:
              defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
        
        #设置feign客户端超时时间(OpenFeign默认支持ribbon)
        ribbon:
          #表示建立连接所用的时间
          ReadTimeout: 5000
          #表示建立连接后从服务器读取到可用资源的时间,5s
          ConnectTimeout: 5000
        
  • OpenFeign的日志打印功能:

    • 目的:对Feign接口的调用情况进行监控和输出;

    • Feign提供日志打印功能,可用通过配置来调整日志级别,从而了解Feign中Http请求的细节。

    • 日志级别:

      • NONE:默认的,不显示任何日志;
      • BASIC:记录请求方法、URL】响应状态码以及执行时间;
      • HEADER:在BASIC基础上,还有请求和响应的头信息;
      • FULL:在上面基础上,还有请求和响应的正文和元数据;
    • 步骤:

      • 配置日志bean;

        //创建一个config包,其中方法如下:
        @Configuration
        public class FeignConfig {
            @Bean
            Logger.Level feignLoggerLevel() {
                return Logger.Level.FULL;
            }
        }
        
      • YML文件中,开启日志的Feign客户端;

        logging:
          level:
            # feign日志以什么级别监控哪个接口,这里是以debug形式
            com.atguigu.springcloud.service.PaymentFeignService: debug
        
      • 后台查看日志;

需熟练掌握

知识点

  1. Feign和OpenFeign的异同点?
    • Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端。Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是,使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。
    • OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中负载均衡,并调用其他服务。

tips

  • 接口也是可以被注入的,因此在需要被注入的接口上,也要添加@Component,如该module下的OrderFeignController类就注入了PaymentFeignService接口。

  • //消费者的业务逻辑接口[email protected]配置
    @Component
    @FeignClient(value="CLOUD-PAYMENT-SERVICE")//找这个微服务下的如下方法
    public interface PaymentFeignService {
        @GetMapping(value="/payment/get/{id}")微服务的具体调用地址,找的则是8001或8002服务的对应方法
        public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
    }
    

    上面代码,有点类似在消费者端编写接口,然后用@FeignClient(value=…)指示程序去服务提供者(如CLOUD-PAYMENT-SERVICE)中找具体的实现类,只是有的返回结果不太一样,一般遵循服务提供者中控制层对应的方法。

  • Feign的方法,让消费端继续沿用了控制层(controller)调用业务层(Service)的规则。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46185085/article/details/111911137

智能推荐

stm32F4库函数中的RCC系统时钟配置_laoyl的博客-程序员秘密

stm32F4系列的芯片相对与以前M3内核的芯片最大的不同是对时钟进行了很多的优化,采用了两个锁相环,一个用于IIS,不知道在音频处理上面会有什么效果,另一个则是用于M4核心和大部分外设。       官方的库中system_stm32f4xx.c文件中已经给我们提供了时钟配置函数,其中我们只要修改文件头中的定义就可以修改系统频率:       #define PLL_M      8

【转】玩转git分支_git信号处理_信号处理学渣的博客-程序员秘密

玩转git分支https://www.cnblogs.com/sunshine-anycall/p/4342520.html 搞个代码的管理工具,居然不弄上分支啥的东西。这简直太low了。尤其是在使用了传说中得很牛X的Git的时候,尤其显得low。拿着青龙偃月刀当烧火棍子使,关公知道了还不重反人间教育你!?远程分支要说分支就一定要从分支产生的最遥远的历史谈起。这一切开始于你用c...

PDF文件合并(MergePDF)_冰河zyc的博客-程序员秘密

最近一个项目用了水晶报表开发报表,其中涉及到了生成的多张pdf文件合并的问题,最近一直在研究这个。也没有找到太好的实现方法,自己写一套Class实在是太费劲了,最好的解决方案还是用了其他的dll。没有太深入的研究,找到可以很简单实现的dll包括前文所说的那个pdfkit,还有一个easyPDF SDK,实现起来都很简单,比如这个easyPDF SDK:在工程中引入BEPPROCLib后,

K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比_核k-means聚类是谁提出的_z_xiaozhuT的博客-程序员秘密

一、概述      在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别。      首先需要明确的是上述四种算法都属于&quot;硬聚类”算法,即数据集中每一个样本都是被100%确定得分到某一个类别中。与之相对的&quot;软聚类”可以理解为每个样本是以一定的概率被分到某一个类别中。      先简...

C语言:void的用法即解析_void函数怎么用_没摸过女孩儿手的博客-程序员秘密

一、理解void的能否定义变量 二、void作为函数返回值以及函数参数 三、void指针的用法

手机淘宝app、xsign签名算法_x sign 签名算法_会飞的bug的博客-程序员秘密

事情是这样的,一个朋友问我,能不能帮忙看看手机淘宝的商品详情接口和一些联盟的接口。他想直接调用手机app的接口去处理一些业务。我看了下。手机淘宝app的架构做的真不错。说干就干。hook架构:netty+spring boot+xposed首先root手机或者下载手机模拟器 安装xposed,安装手机淘宝app vs创建一个xposed框架 hook手淘的入口(代码就不贴了,百度下一堆) hook签名参数 注入广播 反射拿到签名方法和签名结果...

随便推点

Linux C语言编程-Linux网络通信--Linux上使用套接字(socket)来处理信息---编写一个单进程非阻塞多客户的套接字客户端_PinkBean的博客-程序员秘密

*相关软件的版本:gcc版本:gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)Linux版本:红帽企业版 5.51.概述:在之前的“Linux上使用套接字(socket)来发送信息”的文章中我们讲了套接字的相关相关的属性和相关的函数,但是我们在之前的文章中写的服务端的实例写的都是阻塞模式的套接字,而且我们之前编写的套接字的实例只能使用于单个

非深度网络 Non-deep Network:低延迟平行网络 ParNet,仅 12 层媲美 ResNet_非深度学习超分网络_Phoenixtree_DongZhao的博客-程序员秘密

Non-deep NetworkAnkit Goyal1,2 Alexey Bochkovskiy2 Jia Deng1 Vladlen Koltun21Princeton University 2 Intel Labs[pdf] [github]Figure 1: Top-1 accuracy on ImageNet vs. depth (in log scale) of various models. ParNet performs competitively ...

批量拿站 的 攻击思路_dengjia1139的博客-程序员秘密

...8./Database/#newasp.mdb关键词:NewAsp SiteManageSystem Version9.用挖掘机 关键字:Powered by WEBBOY页面:/upfile.asp10.baidu中搜索关键字Ver5.0 Build 0519(存在上传漏洞)11.Upfile_Article.asp bbs/upfile.asp 输...

关于 4.1 - copycat 的通关经历_风海铜锣的博客-程序员秘密

经验总结:4.1 的 copycat 不可怕,比起判定你是马甲的 4.3 来,要好受的多。首先 4.1 基本是人审,人审就比较好讲道理,而机审就很难,因为现在苹果审核就是机器的小弟,全听机器的;其次首先自己腰板要直,只要充分考虑过侵权这个问题,并做过相应处理,底气就更足,也比较好和审核叫板;第三点,不要急于修改,先理论,提出自己多观点,要学会平视审核,不要学很多网友搞的自己苦兮兮的,说了一堆卖可怜的话,论据没有重点。最后一点,要认命,如果真的苹果审核死咬不放,那就不要纠结了,趁早放弃保号稳妥。

YOLO学习笔记(一)_liangxiaopan的博客-程序员秘密

不错的yolo的介绍:https://blog.csdn.net/m0_37192554/article/details/81092514https://blog.csdn.net/Dongjiuqing/article/details/84763430https://www.cnblogs.com/fariver/p/7446921.htmlhttps://blog.csdn.net...