谷粒商城学习笔记-22-分布式组件-SpringCloud-OpenFeign测试远程调用

文章目录

上一节学习了注册中心,我们知道服务器A调用服务器B之前,会从注册中心获取到服务B的IP,然后服务器A向服务B发出请求。

那么服务器A是怎么向服务B发出请求的呢?

这是本节要解决的主要问题。

在这个项目中,采用OpenFeign这个组件完成服务间的调用,OpenFeign是对Http请求的封装。

一,OpenFeign的简介

OpenFeign是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。

Feign 提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。

Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显式地使用这两个组件。

SpringCloudFeign 在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了SpringCloudRibbon 自行封装服务调用客户端的开发量。

二,OpenFeign的使用步骤

1,场景说明

我们以一个场景化的问题学习OpenFeign的使用,假设会员服务要调用优惠券服务的一个接口,这个接口返回了会员的能使用的优惠券信息。

这个优惠券的接口如下,这是一个用来测试的接口,没有真实的业务逻辑。

bash 复制代码
	@RequestMapping("member/list")
    public R list(){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("慢100减80");

        return R.ok().put("page", Arrays.asList(couponEntity));
    }

启动服务后,可以使用下面的url在浏览器访问这个接口。

bash 复制代码
http://localhost:7000/coupon/coupon/member/list

浏览器调用这个接口,发出的是Http请求。

会员服务要使用这个接口,也要想优惠券服务发出Http请求,如果没有OpenFeign,我们需要自己封装Http请求,并解析Http响应,会非常复杂。

使用OpenFeign可以大大简化这个过程。

2,引入依赖

考虑到所有模块都需要这个依赖,所以把这个依赖声明放在common模块最为合适。

bash 复制代码
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2,开启OpenFeign

需要在启动类加上类注解@EnableFeignClients,并通过basePackages属性明确feign接口所在的包。

bash 复制代码
@EnableFeignClients(basePackages = "com.atguigu.gulimall.pms.feign")

@EnableFeignClients是激活OpenFeign的关键,在 Spring Boot 应用的启动类加上这个注解,就相当于告诉 Spring:"嘿,我要开始使用 Feign 啦!请帮我找到所有用 @FeignClient 标记的接口,并为它们创建代理对象。"

这样,Spring 就会扫描basePackages指定的包下的所有类,寻找那些用 @FeignClient 注解过的接口。对于每一个这样的接口,Spring 都会创建一个代理类,这个代理类看起来就像你在调用本地方法一样,但实际上它是在发起远程调用。

总结一下,@EnableFeignClients 的作用就是:

  • 开启 Feign 的功能;
  • 扫描并注册所有用 @FeignClient 标记的接口;
  • 创建代理类,使得你能够以声明式的方式调用远程服务,就像调用本地方法一样简单。

3,编写Feign接口

首先在会员工程下新建一个包,名为feign,我们把所有Feign声明相关的类都放在这个包下,便于管理。

如下图所示。

  • ①所有的远程调用相关的类都定义在feign包下
  • ②与优惠券相关的远程调用接口的定义都可以放在这个类中,通过这个类调用优惠券服务的接口
  • ③使用注解@FeignClient指定这个类下的接口要调用是哪个服务,在FeignClient中指定服务名,需要根据服务名从注册中心获取IP
  • ④Feign相关的类是一个接口,不需要提供具体的实现
  • ⑤声明远程接口,注意通过url指定需要调用的接口
bash 复制代码
@FeignClient("gulimall-coupon")
public interface CouponFeign {
    @RequestMapping("/coupon/coupon/member/list")
    public R list();
}

4,使用feign调用远程接口

一般情况下,我们会在Service中调用Feign接口,但理论上,我们可以在任何地方调用Feign接口。

接下来,为了演示的方便,我们在Member会员服务的Controller接口中调用Feign接口。

如下,我们在MemberController中编写演示代码。

bash 复制代码
@Autowired
    private CouponFeign couponFeign;

    @RequestMapping("/coupons")
    public R coupons(){
        return couponFeign.list();
    }
  • ① 注入CouponFeign对象
  • ② 调用CouponFeign的list方法,就像调用本地接口一样,OpenFeign底层会将这个调用封装为Http请求,并接收、封装响应

通过这个例子,我们可以体验到使用OpenFeign进行远程调用是非常简单的,语法和调用本地接口一样。

5,验证

启动会员服务,在浏览器输入:

bash 复制代码
http://localhost:8000/member/member/coupons

我们调用的是会员服务的接口,但是会员服务通过OpenFeign实现对优惠券服务的远程调用。

错误记录

错误记录-SpringCloud-OpenFeign测试远程调用

相关推荐
波音彬要多做2 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
GitCode官方29 分钟前
GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台
分布式·开源·gitcode
m0_7482567840 分钟前
WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
笔记·学习·开源
红色的山茶花44 分钟前
YOLOv9-0.1部分代码阅读笔记-loss.py
笔记
小扳2 小时前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
南七澄江2 小时前
各种网站(学习资源及其他)
开发语言·网络·python·深度学习·学习·机器学习·ai
胡西风_foxww3 小时前
【es6复习笔记】Promise对象详解(12)
javascript·笔记·es6·promise·异步·回调·地狱
机智的叉烧8 小时前
前沿重器[57] | sigir24:大模型推荐系统的文本ID对齐学习
人工智能·学习·机器学习
量子-Alex9 小时前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类
吉大一菜鸡9 小时前
FPGA学习(基于小梅哥Xilinx FPGA)学习笔记
笔记·学习·fpga开发