第7章 OpenFeign服务接口调用
1、已经有loadbalancer为什么还要学习OpenFeign?
OpenFeign和负载均衡器(LoadBalancer)是两个在微服务架构中常用的组件,它们有不同的功能和作用。
OpenFeign是一个声明式的Web服务客户端,它简化了编写基于HTTP的服务调用代码的过程。通过使用注解和接口定义,OpenFeign可以自动地生成具有负载均衡、错误处理和超时控制等功能的客户端代码。它可以与Spring Cloud等微服务框架集成,方便地实现服务之间的通信。
负载均衡器(LoadBalancer)是一种用于分发网络请求的技术。在微服务架构中,负载均衡器可以将请求分发给多个服务实例,以实现请求的负载均衡和高可用性。负载均衡器可以根据不同的算法(如轮询、随机、加权等)来选择目标服务实例,并且可以根据实时的服务状态进行动态调整。
总结一下:
- OpenFeign是一个用于简化Web服务调用的客户端工具,它提供了声明式的方式来定义和使用服务接口。
- 负载均衡器是一种用于分发网络请求的技术,它可以将请求分发给多个服务实例,以实现负载均衡和高可用性。
在微服务体系中对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用(需要人工封装) 。OpenFeign 提供了更高级的抽象和便利性,使得微服务之间的通信更加简单和优雅。它提供了声明性 API 定义、集成负载均衡和服务发现、错误处理和容错机制等功能,使得开发人员可以更专注于业务逻辑,减少了大量的样板代码和配置。
OpenFeign的优点在于:
- 声明性 API 定义OpenFeign 提供了基于注解的方式来定义和描述服务间的 API 接口,使得开发人员可以以接口的形式定义微服务之间的交互,而无需手动编写 HTTP 请求和解析响应的代码。这使得代码更加清晰、简洁和可维护。
- 集成负载均衡和服务发现OpenFeign 默认集成了 Ribbon 和 Eureka,使得在调用服务时可以自动进行负载均衡和服务发现。通过 OpenFeign,你可以直接使用服务名来调用其他微服务,而不需要关心具体的服务实例。
- 错误处理和容错机制:OpenFeign 提供了丰富的错误处理和容错机制。它可以处理不同的 HTTP 状态码、重试策略、断路器等,以提高微服务之间的可靠性和容错性。
- 集成性和开箱即用OpenFeign 可以轻松地集成到 Spring Cloud 中,并与其他组件(如 Spring Boot、Ribbon、Eureka)无缝协同工作。它提供了一系列的自动配置选项,使得使用 OpenFeign 变得非常简单,只需在代码中添加相应的注解即可开始使用。
- 可扩展性OpenFeign 具有良好的扩展性,可以通过自定义编码器、解码器、拦截器等来满足特定的需求。你可以根据业务需求自定义和扩展 OpenFeign 的功能。
2、是什么
Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,以及对使用Spring Web中默认使用的HttpMessageConverter的支持。Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,以便在使用Feign时提供负载平衡的http客户端。
2.1 官网
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign
2.2 GitHub
https://github.com/spring-cloud/spring-cloud-openfeign
2.3 总结
openfeign是一个声明式的Web服务客户端,只需创建-个Rest接口并在该接口上添加注解@FeignCLient即可。
OpenFeign基本上就是当前微服务之间调用的事实标准。
3、能干嘛
前面在使用SpringCloud LoadBalancer+RestTemplate时,利用RestTemplate对http请求的封装处理形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个**_@FeignClient*_注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可
OpenFeign同时还集成SpringCloud LoadBalancer可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
- 可插拔的注解支持,包括Feign注解和JAX-RS注解
- 支持可插拔的HTTP编码器和解码器
- 支持Sentinel和它的Fallback
- 支持SpringCloudLoadBalancer的负载均衡
- 支持HTTP请求和响应的压缩
4、怎么玩(Open Feign通用步骤)
架构说明图
4.1 接口+注解
微般务Api接口+@FeignClient注解
4.2 流程步骤
4.2.1 建Module
Feign在消费端使用。模块名字cloud-consumer-feign-order80
4.2.2 改pom
<dependencies>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--SpringCloud consul discovery-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- 引入自己定义的api通用包 -->
<dependency>
<groupId>cn.sz.dzy.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--hutool-all-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!--fastjson2-->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
</dependency>
</dependencies>
4.2.3 改yml
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true #优先使用服务ip进行注册
service-name: ${
spring.application.name}
4.2.4 改主启动类
主启动类上面配置@EnableFeignClients表示开启OpenFeign功能并激活
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务
@EnableFeignClients//启用feign客户端,定义服务+绑定接口,以声明式的方法优雅而简单的实现服务调用
public class MainOpenFeign80
{
public static void main(String