CGB2105-Day-03

1、Feign的远程服务调用

1.1 背景分析

服务消费方基于rest方式请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生。

1.2 什么是Feign

Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现。如图所示:
在这里插入图片描述
Feign 最早是由 Netflix 公司进行维护的,后来 Netflix 不再对其进行维护,最终 Feign 由一些社区进行维护,更名为 OpenFeign。

1.3 Feign入门案例

1.3.1 在服务消费方添加依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

1.3.2 添加@EnableFeignClients注解

说明:在启动类上添加该注解 (ConsumerApplication)
在这里插入图片描述
@EnableFeignClients 说明:

  1. @EnableFeignClients注解描述启动类时,用于告诉springboot在启动时
  2. 扫描启动类所在包或子包中的类,假如接口上有@FeignClient注解描述
  3. 在接口创建其实现类,在实现类内部帮我们进行远程服务调用

1.3.3 定义请求

在这里插入图片描述
@FeignClient 说明:

  • @FeignClient注解用于描述远程服务调用接口,这个接口不需要你写实现类,你
  • 只需要定义访问规则即可(例如请求方式,请求url,请求参数).
  • @FeignClient注解描述的接口的实现类对象会默认交给spring管理
  • 这个bean对象的名字默认就是name属性指定的值,这个name还有一个层面的含义,就是你远程调用的服务名

其中,@FeignClient描述的接口底层会为其创建实现类。

1.3.4 创建FeignConsumerController

在这里插入图片描述

1.3.5 查询结果

说明:启动消费者服务,在浏览器中直接通过feign客户端进行访问
在这里插入图片描述

2、Feign配置进阶实践

2.1 启动异常说明

一个服务提供方通常会提供很多资源服务,服务消费方基于同一个服务提供方写了很多服务调用接口,此时假如没有指定contextId,服务
启动就会失败,例如假如在服务消费方再添加一个如下接口,消费方启动时就会启动失败,例如:
在这里插入图片描述
报错原因

The bean 'optimization-user.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.

2.1.1 contextId说明

当程序出现上述报错时我们需要为远程调用服务接口指定一个contextId,作为远程调用服务的唯一标识即可
在这里插入图片描述
当我们在进行远程服务调用时,假如调用的服务突然不可用了或者调用过程超时了,怎么办呢?一般服务消费端会给出具体的容错方案

2.1.2 创建FallbackFactory接口实现

在这里插入图片描述

2.1.3 在Feign访问接口中应用FallbackFactory对象

在这里插入图片描述

2.1.4 配置 application.yml

说明:在配置文件application.yml中添加如下配置,启动feign方式调用时的服务中断处理机制.
在这里插入图片描述

2.1.5 启动设置

说明:在服务提供方对应的方法中添加Thread.sleep(500000)模拟耗时操作,然后启动服务进行访问测试.
在这里插入图片描述

3、Feign 调用过程分析

Feign应用过程分析(底层逻辑先了解):

  1. 通过 @EnableFeignCleints 注解告诉springcloud,启动 Feign Starter 组件。
  2. Feign Starter 在项目启动过程中注册全局配置,扫描包下所由@FeignClient注解描述的接口,然后由系统底层创建接口实现类(JDK代·
    理类),并构建类的对象,然后交给spring管理(注册 IOC 容器)。
  3. 接口被调用时被动态代理类逻辑拦截,将 @FeignClient 请求信息通过编码器生成 Request对象,基于此对象进行远程过程调用。
  4. 请求对象经Ribbon进行负载均衡,挑选出一个健康的 Server 实例(instance)。
  5. 通过 Client 携带 Request 调用远端服务返回请求响应。
  6. 通过解码器生成 Response 返回客户端,将信息流解析成为接口返回数据。

3.1 小节面试分析

  1. 为什么使用feign?(基于Feign可以更加友好的实现服务调用,简化服务消费方对服务提供方方法的调用)。
  2. @FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
  3. Feign方式的调用,底层负载均衡是如何实现的?(Ribbon)
  4. @EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)

3.2 总结(Summary)

3.2.1 重难点分析

  1. 何为注册中心?(用于记录服务信息的一个web服务,例如淘宝平台,滴滴平台,美团外卖平台,……)
  2. 注册中心的核心对象?(服务提供方,服务消费方,注册中心-Registry)
  3. 市面上常用注册中心?(Google-Consul,Alibaba-Nacos,…)
  4. 微服务架构下项目的构建过程?(聚合工程)
  5. Nacos安装、启动、服务的注册、发现机制以及实现过程?
  6. Feign的基本应用以及底层底层调用原理?

2.3.3 FAQ分析

  1. Nacos是什么,提供了什么特性(服务的注册、发现、配置)?
  2. 你为什么会选择Nacos?(活跃度、稳定、性能、学习成本)
  3. Nacos的官网?(nacos.io)
  4. Nacos在github的源码?(github.com/alibaba/nacos)
  5. Nacos在windows环境下安装?(解压即可使用)
  6. Nacos在windows中的的初步配置?(application.properties访问数据库的数据源)
  7. Nacos服务注册的基本过程?(服务启动时发送web请求)
  8. Nacos服务消费的基本过程?(服务启动时获取服务实例,然后调用服务)
  9. Nacos服务负载均衡逻辑及设计实现?(Ribbon)
  10. 注册中心的核心数据是什么?(服务的名字和它对应的网络地址)
  11. 注册中心中心核心数据的存取为什么会采用读写锁?(底层安全和性能)
  12. Nacos健康检查的方式?(基于心跳包机制进行实现)
  13. Nacos是如何保证高可用的?(重试,本地缓存、集群)
  14. Feign是什么,它的应用是怎样的,feign应用过程中的代理对象是如何创建的(JDK)?
  15. Feign方式的调用过程,其负载均衡是如何实现?(Ribbon)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

直男编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值