【Spring Cloud-Open Feign】使用OpenFeign完成声明式服务调用
理解OpenFeign
- OpenFeign是Netflix 开发的声明式、模板化的HTTP请求客户端。可以更加便捷、优雅地调用http api。
- OpenFeign会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign会将函数的参数值设置到这些请求模板中。
- OpenFeign主要是构建微服务消费端。只要使用OpenFeign提供的注解修饰定义网络请求的接口类,就可以使用该接口的实例发送RESTFUL的网络请求。还可以集成Ribbon和Hystrix,提供负载均衡和断路器。
- 英文表意为“假装,伪装,变形”, 是一个 Http 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 Http 请求,而不用像 Java 中通过封装 HTTP 请求报文的方式直接调用。通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。Feign 封装 了HTTP 调用流程,面向接口编程
Feign和OpenFeign的关系
- Feign本身不支持Spring MVC的注解,它有一套自己的注解
- OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。 OpenFeign的
@FeignClient
可以解析SpringMVC的@RequestMapping注解下的接口, 并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
声明式服务调用
provider方提供公用API包,Feign通过SpringMVC的注解来加载URI
好处
服务提供者发布一个API接口服务调用者引入这个包,调用服务提供者方法的时候,只需要点一下就可以把方法点出来,省去了手动拼接URL比较low的方式,同样也能够保证服务生产者和服务消费者方法统一
创建API
- 创建一个支持web的SpringBoot项目,然后创建接口,实际项目中可根据业务灵活调整
@RequestMapping("/user")
public interface ProviderApi {
@RequestMapping("/alive")
public String alive();
}
- mvn install打包一下,主要目的是为了让User-Provider和User-Consumer引入这个jar
创建User-Provider
- 需要引入依赖:Spring Web 和 Spring Eureka Client
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Eureka Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- APIjar包 -->
<dependency>
<groupId>com.yibing</groupId>
<artifactId>user-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 新建Controller,并实现API接口
@RestController
public class ProviderController implements ProviderApi{
@Override
public String alive() {
return "hello alive";
}
}
创建User-Consumer
- 引入依赖,包括Spring Web 和 Spring Eureka Client、Open Feign、自定义的API的jar包
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Open Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- APIjar包 -->
<dependency>
<groupId>com.yibing</groupId>
<artifactId>user-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 修改启动类,加上@EnableFeignClients注解
@EnableFeignClients
@SpringBootApplication
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}
- 创建一个接口,继承provider提供的接口API
//注意:这里的FeignClient注解必须要加,意味着服务路由
@FeignClient(name = "user-provider")
public interface ConsumerService extends ProviderApi{
}
- 在Controller中注入ConsumerService,就可以调用Provider提供的方法了
@RestController
public class ConsumerController {
@Autowired
ConsumerService consumerService;
@RequestMapping("/alive")
public String alive() {
return consumerService.alive();
}
}
测试
http://localhost:90/alive
分类:
Spring Cloud
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人