Eureka 和 Feign(二)

Eureka 和 Feign 是 Spring Cloud 微服务架构中协同工作的两个核心组件,它们的关系可以通过以下比喻和详解来说明:


关系核心:服务发现 → 动态调用

组件 角色 核心功能
Eureka 服务注册中心 服务实例的"电话簿"
Feign 声明式HTTP客户端 根据"电话簿"智能拨号的"电话"

协同工作流程

  1. 注册 2. 拉取注册表 3. 声明接口 4. 动态调用 服务提供者 Eureka Server 服务消费者 Feign Client
具体步骤:
  1. 服务注册 (Eureka 核心功能)

    服务提供者(如用户服务)启动时向 Eureka 注册自己的地址:

    yaml 复制代码
    # 用户服务的配置
    eureka:
      client:
        service-url:
          defaultZone: http://eureka-server:8761/eureka
  2. 服务发现 (Eureka 核心功能)

    服务消费者(如订单服务)从 Eureka 获取可用服务列表:

    java 复制代码
    // 订单服务通过 Eureka 发现用户服务
    List<ServiceInstance> instances = discoveryClient.getInstances("USER-SERVICE");
  3. 声明式调用 (Feign 核心功能)

    订单服务通过 Feign 声明调用接口(无需关注具体地址):

    java 复制代码
    @FeignClient(name = "USER-SERVICE")  // 自动从Eureka查找服务
    public interface UserClient {
        @GetMapping("/users/{id}")
        User getUser(@PathVariable Long id);
    }
  4. 动态路由 & 负载均衡 (Feign + Ribbon)

    Feign 底层集成 Ribbon 实现:

    • 从 Eureka 获取 USER-SERVICE 的所有实例
    • 自动进行负载均衡(如轮询、随机等)
    • 向选中的实例发送 HTTP 请求

关键协作点

1. 服务名称映射
java 复制代码
@FeignClient(name = "USER-SERVICE")
//         ^^^^^^^^^^^^^^^^^^^^^^
//         这个名称必须匹配Eureka中的注册名
2. 心跳维持连接
  • Eureka 监控服务提供者状态(30秒心跳)
  • Feign 实时获取健康实例列表,自动剔除故障节点
3. 故障转移

当 USER-SERVICE 某个实例宕机时:

  1. Eureka 检测到心跳停止 → 从注册表移除
  2. Feign 下一次调用自动切换到健康实例

典型架构场景

服务注册 服务注册 1. 查询注册表 2. 声明调用 3. 调用用户服务 3. 调用商品服务 Eureka Server 用户服务 商品服务 订单服务 Feign Client


代码体现关系

订单服务中同时使用两者:

java 复制代码
@SpringBootApplication
@EnableFeignClients // 启用Feign
@EnableEurekaClient // 注册到Eureka(同时也作为消费者)
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

// Feign客户端(自动从Eureka发现服务)
@FeignClient(name = "USER-SERVICE")
interface UserServiceClient {
    @GetMapping("/users/{id}")
    User getUser(@PathVariable Long id);
}

脱离 Eureka 的情况

虽然通常配合使用,但 Feign 也可独立工作:

  1. 直连模式 (不推荐):

    java 复制代码
    @FeignClient(name = "user", url = "http://localhost:8080")
  2. 使用其他注册中心 (如 Nacos、Consul):

    java 复制代码
    @FeignClient(name = "user-service") // 从Nacos获取实例

但 Eureka + Feign 是 Spring Cloud Netflix 的黄金组合,共同实现:

  • 动态服务发现
  • 负载均衡
  • 声明式 HTTP 调用
  • 故障自动转移
相关推荐
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21
春天花会开1314 天前
Supabase 自部署 Edge Functions 超时从 60s 延长到 360s 完整复盘
运维·云原生
ysu_03144 天前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling
天天喝旺仔5 天前
分布式服务容错实战:用 Sentinel 实现限流、熔断与降级
分布式·微服务·云原生·sentinel
逐流人5 天前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
运维开发王义杰6 天前
跨项目直连数据库:是架构反模式,还是现实的工程妥协?
云原生