我们知道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接口可以完成服务注册、服务续约、服务下线等功能