我正在研究微服务,以及将我们的一些代码迁移到此架构的可能性。我理解一般概念,但很难了解它如何适用于我们的示例。
假设我有一个名为 RatingEngine
的接口(interface)和一个名为 RatingEngineImpl
的实现,它们都在我的整体应用程序中运行。原理很简单 - RatingEngineImpl
可以在不同的机器上运行,并由整体应用程序通过(例如)REST API 访问,通过 http 使用 json 序列化 DTO。我们甚至有一个界面来帮助实现这种解耦。
但是我实际上该怎么做呢?据我所知,我需要为臀部整体(即现在的客户端)创建一个新的接口(interface)实现,它接受对接口(interface)方法的调用,将它们转换为 REST 调用,然后通过网络将它们发送到新的“评级引擎服务”。然后,我还需要实现一个新的 http 服务器,为每个接口(interface)方法提供一个端点,然后反序列化 DTO(方法参数)并将调用路由到位于服务器内部的原始 RatingEngineImpl
。然后它序列化响应并将其发送回客户端。
所以这看起来像是一个非常多的管道代码。它还增加了维护开销,因为如果您调整界面中的方法,则需要在另外两个地方进行更改。
我错过了什么吗?我们是否有一些聪明的方法可以自动构建样板代码?
最佳答案
微服务模式并不建议您将拥有的每一项服务都移至其自己的可部署位置。仅移动将从其自身的发布周期中受益的 self 维持的逻辑部分。 IE。如果您的评级引擎需要每周更新评级逻辑,但系统的其余部分非常稳定 - 它可能会受益于成为自己的服务。
是的 - 微服务增加了复杂性,但实际上并没有增加 HTTP 服务器的样板代码。有很多框架可以解决这个问题。 Vert.x是一件好事。其他还有 Spring Boot、Apache Camel 等。使用 Vert.x 时,完整的微服务设置可能如下所示。
public class RatingService extends AbstractVerticle implements RatingEngine{
public void start() {
vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "application/json")
.end(computeCurrentRating().encodePrettily());
}).listen(8080);
}
@Override
public int getRating(){
return 4; // or whatever.
}
protected JsonObject computeCurrentRating(){
return new JsonObject().put("rating", getRating());
}
}
甚至 Java 内置框架 JAX-RS 也可以帮助您用不多的代码行来创建微服务。
微服务真正困难的工作是在客户端添加错误处理逻辑。一些常见的陷阱
微服务可能会崩溃如果调用RatingService出现连接拒绝异常 - 您能处理吗?您能否估计客户端的“评级”而不妨碍进一步处理?您可以重复使用旧的回复来估计评级吗? ..或者至少 - 您需要向支持人员发出错误信号。
响应式应用?您可以等待响应多长时间?对内存方法的调用将在纳秒内返回,对外部 HTTP 服务的调用可能需要几秒或几分钟,具体取决于多种因素。只要应用程序是“响应式(Reactive)”的并且可以在没有“评级”的情况下继续工作 - 并在可用时向用户显示评级 - 就可以了。如果您正在等待对评级服务的阻塞调用,则需要超过几毫秒。 - 响应时间成为一个障碍。在 Java 中制作响应式应用程序并不像在 Node.js 中那样方便/常见。被动方法可能会触发整个系统的 reshape 。
宽容的客户端单个项目的单元/集成测试很容易。测试复杂的微服务网络则不然。对此你能做的最好的事情就是让你的客户打电话不那么挑剔。模式验证等实际上是坏事。在 XML 中,使用单个 XPath 从响应中获取所需的数据,不多不少。这样,微服务响应的更改将不需要更新所有客户端。在这方面,JSON 比 XML 更容易处理。
关于java - 如何将 Java 接口(interface)迁移到微服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33033834/