Eureka 服务端是如何暴露HTTP接口的

我们知道Eureka作为注册中心,客户端可以完成注册节点、通知下线、拉取节点列表、服务续约等功能。那客户端是怎么实现这些功能的呢?简而言之就是服务端提供了一系列的HTTP接口。客户端按照约定调用这些接口就可以完成各种功能。

服务端的HTTP接口

Jersey初探

我们知道SpringMVC暴露HTTP接口,只需要使用RequestMapping注解就可以暴露HTTP接口了。但是很遗憾Eureka并没有选择使用SpringMVC来暴露HTTP接口。而是采用Jersey框架。

先来看一个Jersey示例,示例1:

less 复制代码
@Path("/{version}/apps")
@Produces({"application/xml", "application/json"})
public class ApplicationsResource {
  @Path("delta")
  @GET
  public Response getContainerDifferential(){
    // DO SOMETHING
    // return ...
  }
}

示例1的语义表达的很明确,那就是对外提供了一个HTTP接口,请求路径为GET /{version}/apps/delta HTTP1.1且返回值为json或xml。

示例1中的Path注解可以理解为RequestMapping,GET注解可以理解为GetMapping。Produces注解是说返回值可以是xml或json格式。示例1的语义等同于如下使用SpringMVC编写的示例2

kotlin 复制代码
@RequestMapping(value = "/{version}/apps", produces = {"application/xml", "application/json"})
public class ApplicationsResource {
    @GetMapping("delta")
    public Response getContainerDifferential() {
        // DO SOMETHING
        // return ...
    }
}

Eureka之HTTP接口

Eureka的HTTP接口都在com.netflix.eureka.resources包下。类名都是*Resource

Plain 复制代码
com.netflix.eureka.resources
  |--AbstractVIPResource
  |--ApplicationResource
  |--ApplicationsResource
  |--ASGResource
  |--CurrentRequestVersion
  |--DefaultServerCodecs
  |--InstanceResource
  |--InstancesResource
  |--PeerReplicationResource
  |--SecureVIPResource
  |--ServerCodecs
  |--ServerInfoResource
  |--StatusResource
  |--VIPResource

在浅浅的了解了Jersey之后,我们再来看这些*Resource中是如何暴露HTTP接口的。其中比较常用的是这几个

  • ApplicationResource

  • ApplicationsResource

  • InstanceResource

  • InstancesResource

这里我们只分析 ApplicationResource 源码内容 如下(其他的几个都是一样的)。结尾会把这4个Resource暴露的HTTP整理成表格贴出来。

Java 复制代码
@Path("/{version}/apps")
@Produces({"application/xml", "application/json"})
public class ApplicationsResource {

    @Path("{appId}")
    public ApplicationResource getApplicationResource(
            @PathParam("version") String version,
            @PathParam("appId") String appId) {
    }

    @GET
    public Response getContainers(@PathParam("version") String version,
                                  @HeaderParam(HEADER_ACCEPT) String acceptHeader,
                                  @HeaderParam(HEADER_ACCEPT_ENCODING) String acceptEncoding,
                                  @HeaderParam(EurekaAccept.HTTP_X_EUREKA_ACCEPT) String eurekaAccept,
                                  @Context UriInfo uriInfo,
                                  @Nullable @QueryParam("regions") String regionsStr) {
    }
  
    @Path("delta")
    @GET
    public Response getContainerDifferential(
            @PathParam("version") String version,
            @HeaderParam(HEADER_ACCEPT) String acceptHeader,
            @HeaderParam(HEADER_ACCEPT_ENCODING) String acceptEncoding,
            @HeaderParam(EurekaAccept.HTTP_X_EUREKA_ACCEPT) String eurekaAccept,
            @Context UriInfo uriInfo, @Nullable @QueryParam("regions") String regionsStr) {
    }
}

可以看到使用了Path注解对外提供HTTP接口服务。

Eureka还有一些路由规则,比如URI中以/eureka/apps开头的会被路由到ApplicationsResource,URI以/eureka/instances开头的会被路由到InstancesResource,这里了解即可。

所属类 请求类型 URI 示例 作用
1 ApplicationResource GET / http://localhost:11000/eureka/apps/a getApplication 获取所有应用列表
2 ApplicationResource GET /{id} http://localhost:11000/eureka/apps/a/b 根据ID(一般ID都是主机ID)获取InstanceResource。会转发到7
3 ApplicationResource POST / addInstance 注册节点,客户端可以调用此接口把自己注册到服务端
4 ApplicationsResource GET /{version}/apps/{appId} http://localhost:11000/eureka/apps/a 最终会转发到1
5 ApplicationsResource GET /{version}/apps/ http://localhost:11000/eureka/apps/ getContainers 获取所有应用列表
6 ApplicationsResource GET /{version}/apps/delta http://localhost:11000/eureka/apps/delta getContainerDifferential 获取增量信息
7 InstanceResource GET / http://localhost:11000/eureka/apps/a/b 获取指定的实例信息
8 InstanceResource PUT / renewLease 服务续约
9 InstanceResource PUT /status statusUpdate 更新节点状态
10 InstanceResource DELETE /status deleteStatusUpdate 删除节点覆盖状态
11 InstanceResource PUT /metadata updateMetadata 更新节点元数据
12 InstanceResource DELETE / cancelLease 服务下线
13 InstancesResource GET /{version}/instances/{id}} http://localhost:11000/eureka/instances/a getById 获取服务实例信息

总结

  • Eureka使用Jersey框架提供HTTP服务

  • 客户端通过调用这些HTTP接口可以完成服务注册、服务续约、服务下线等功能

相关推荐
Minyy112 小时前
SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常
xml·java·spring boot·后端·spring·mybatis·logback
ai大佬10 小时前
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
java·spring·自动化·api中转·apikey
啥都想学的又啥都不会的研究生11 小时前
Kubernetes in action-初相识
java·docker·微服务·容器·kubernetes·etcd·kubelet
来自星星的猫教授11 小时前
spring,spring boot, spring cloud三者区别
spring boot·spring·spring cloud
Bling_12 小时前
请求参数、路径参数、查询参数、Spring MVC/FeignClient请求相关注解梳理
java·spring·spring cloud·mvc
-曾牛13 小时前
企业级AI开发利器:Spring AI框架深度解析与实战
java·人工智能·python·spring·ai·rag·大模型应用
二进制独立开发13 小时前
[Trae 04.22+]适用于JAVA Spring开发的智能体提示词
spring·trae
大家都说我身材好15 小时前
Spring缓存注解深度实战:3大核心注解解锁高并发系统性能优化‌
spring·缓存·性能优化
都叫我大帅哥15 小时前
Spring AI中的ChatClient:从入门到精通,一篇搞定!
java·spring·ai编程
都叫我大帅哥15 小时前
《@SpringBootApplication:Spring Boot的"一键启动"按钮,还是程序员的"免死金牌"?》
java·后端·spring