OpenFeign最全详解(定义作用及原理使用)

OpenFeign最全详解(定义作用及原理使用)

OpenFeign是微服务的核心组件,是构建微服务的基石,下面我就全面来详解OpenFeign@mikechen

OpenFeign定义

OpenFeign是一个声明式的、模板化的HTTP客户端,它简化了使用RESTful服务的过程。

OpenFeign 与Feign的,关系如下图所示:

OpenFeign最全详解(定义作用及原理使用)

OpenFeign 是对 Feign 的扩展和改进,它是在 Feign 的基础上进行的进一步开发。

OpenFeign 继承了 Feign 的优点并加以改进,提供了更好的功能和性能,通常情况下,如果你在新项目中,推荐选择 OpenFeign。

 

OpenFeign作用

OpenFeign的作用,主要体现在如下4点:

1.简化 HTTP 客户端调用

OpenFeign 提供了声明式的接口定义方式,开发者可以使用接口来描述对外的服务调用,而不需要手动编写 HTTP 客户端代码。

这种声明式的方式简化了 HTTP 客户端调用的过程,使得开发者能够更专注于业务逻辑的实现。

2.集成负载均衡

OpenFeign 集成了 Ribbon 负载均衡器,能够自动实现服务调用的负载均衡。

3.集成断路器

OpenFeign 还集成了 Hystrix 断路器,能够实现断路器模式,增加系统的容错性。

当服务调用失败或超时时,Hystrix 能够快速地切换到备用逻辑,从而防止故障在系统中的蔓延。

4.统一的服务调用方式

使用 OpenFeign,开发者可以统一服务调用的方式,无论是调用本地服务还是远程服务,都可以使用相同的接口定义和调用方式。

 

OpenFeign原理

OpenFeign的工作原理,如下图所示:

OpenFeign最全详解(定义作用及原理使用)

OpenFeign整体工作流程,分为如下7步:

  1. 开启 FeignClient: 通过 @EnableFeignClients 注解开启 FeignClient,该注解会扫描并加载标记了 @FeignClient 注解的接口,并将其转化为可用的 Feign 客户端。
  2. 编写带 @FeignClient 注解的接口: 在定义接口时,使用 @FeignClient 注解来标识这个接口是一个 Feign 客户端接口,并指定服务的名称(可选)。
  3. 包扫描和动态代理: 程序启动后,Spring 容器会进行包扫描,寻找所有标记了 @FeignClient 注解的接口,然后使用 JDK 的动态代理机制,在运行时动态地生成接口的实现类。
  4. 服务发现: 生成接口的实现类后,会根据 @FeignClient 注解中指定的服务名称进行服务发现的过程。
  5. 负载均衡: 在获得某个服务的所有实例后,Feign 将根据负载均衡策略选择一个实例进行调用。
  6. 解析 Spring MVC 注解: Feign 将解析接口方法上的 Spring MVC 注解,如 @RequestMapping@RequestParam 等,获取请求路径、请求参数等配置信息。
  7. 执行服务调用: 最后,Feign 根据解析得到的配置信息,发送 HTTP 请求到目标服务,并将响应结果反序列化成接口方法的返回值,并返回给调用方。

 

OpenFeign使用

1.添加依赖

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

 

2.创建接口

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "userService", url = "${user.service.url}") // 指定服务名称和URL
public interface UserServiceClient {

    @GetMapping("/user")
    String getUserInfo(@RequestParam("userId") String userId);
}

 

3.添加注解

import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableFeignClients
public class FeignClientConfiguration {
    // 配置类内容
}

 

4.调用接口

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserServiceClient userServiceClient;

    @Autowired
    public UserService(UserServiceClient userServiceClient) {
        this.userServiceClient = userServiceClient;
    }

    public String getUserInfo(String userId) {
        return userServiceClient.getUserInfo(userId);
    }
}

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧