强制 Dropwizard/Jersey 在端点之间进行方法调用而不是网络调用
Forcing Dropwizard/Jersey to make a method call between to endpoints instead of a network call
假设我有一个 Dropwizard/Jersey 资源定义如下:
// Pseudo-code
@Path("/fizz")
@Produces(MediaType.APPLICATION_JSON)
class FizzResource {
FizzDao fizzDao
@GET
List<Fizz> getFizzesByType(@PathParam("type") String type) {
// Do some stuff up here
return fizzDao.getFizzesByType(type)
}
@POST
Widget determineWidgetByFoobaz(@PathParam("foobaz") String foobaz) {
// Do some stuff
List<Fizz> fizzes = getFizzesByType(foobaz.type)
Widget w = new Widget(fizzes, true, blah)
// Do some more stuff
return w
}
}
当我从另一个端点 (determineWidgetByFoobaz
) 内部调用一个端点 (getFizzesByType
) 时会发生什么?
框架是否知道只进行 Java 方法调用?还是进行了实际的网络调用(对 localhost/loopback/etc.)?如果进行网络调用,框架是否提供任何方法来配置它以便只调用本地 Java 方法调用?
如果您将端点作为方法访问(即 this.getFizzesByType(type)
),那么它将像任何其他 Java 方法一样被调用。如果您通过 URI(例如 ClientBuilder.newClient().target("http://localhost/fizz/" + type).request().get()
)访问它,那么它将作为网络资源访问。
determineWidgetByFoobaz
中的 getFizzesByType
调用只是另一个本地方法调用。这些方法没有什么特别之处,您也可以安全地调用它们,比方说,单元测试。
Jersey 在其引导过程中所做的是扫描用 @Path
注释的 类,然后将每个用 HTTP 方法注释的方法绑定到它的端点(如果有的话)。这样,当有人向 /fizz
发出 GET 请求时,简而言之,Jersey 获取一个 FizzResource
实例,调用它的 getFizzesByType
方法,将返回的对象序列化为 JSON,创建适当的 HTTP 响应并将其发送回客户端。
假设我有一个 Dropwizard/Jersey 资源定义如下:
// Pseudo-code
@Path("/fizz")
@Produces(MediaType.APPLICATION_JSON)
class FizzResource {
FizzDao fizzDao
@GET
List<Fizz> getFizzesByType(@PathParam("type") String type) {
// Do some stuff up here
return fizzDao.getFizzesByType(type)
}
@POST
Widget determineWidgetByFoobaz(@PathParam("foobaz") String foobaz) {
// Do some stuff
List<Fizz> fizzes = getFizzesByType(foobaz.type)
Widget w = new Widget(fizzes, true, blah)
// Do some more stuff
return w
}
}
当我从另一个端点 (determineWidgetByFoobaz
) 内部调用一个端点 (getFizzesByType
) 时会发生什么?
框架是否知道只进行 Java 方法调用?还是进行了实际的网络调用(对 localhost/loopback/etc.)?如果进行网络调用,框架是否提供任何方法来配置它以便只调用本地 Java 方法调用?
如果您将端点作为方法访问(即 this.getFizzesByType(type)
),那么它将像任何其他 Java 方法一样被调用。如果您通过 URI(例如 ClientBuilder.newClient().target("http://localhost/fizz/" + type).request().get()
)访问它,那么它将作为网络资源访问。
determineWidgetByFoobaz
中的 getFizzesByType
调用只是另一个本地方法调用。这些方法没有什么特别之处,您也可以安全地调用它们,比方说,单元测试。
Jersey 在其引导过程中所做的是扫描用 @Path
注释的 类,然后将每个用 HTTP 方法注释的方法绑定到它的端点(如果有的话)。这样,当有人向 /fizz
发出 GET 请求时,简而言之,Jersey 获取一个 FizzResource
实例,调用它的 getFizzesByType
方法,将返回的对象序列化为 JSON,创建适当的 HTTP 响应并将其发送回客户端。