运行 一台机器上的多个 Quarkus 实例
Running multiple Quarkus instances on one machine
我有一个应用程序分离在多个 OSGI 包中,运行 在单个 Apache Karaf 实例上。但是,我想迁移到微服务框架,因为
- Apache Karaf 很难设置,因为它的依赖机制
- 我希望以后能够将应用程序带到云端(AWS、GCloud 等)
我做了一些研究,查看了各种框架并得出结论,Quarkus 可能是正确的选择,因为它基于容器的方法、性能和可能的云集成机会。
现在,我一度陷入困境,到目前为止我还没有找到解决方案,但也许我在这里也可能有一个误解:我的计划是将我应用程序的几乎每个 OSGI 包迁移到一个单独的微服务中.这样,我就可以只水平扩展需要这样做的服务,而且我还可以 update/deploy 单独地扩展它们,而不必重新启动整个应用程序。因此,我假设每个服务都需要 运行 在一个单独的 Quarkus 实例中。但是,Quarkus 似乎不支持开箱即用?!?相反,我需要为每个 Quarkus 实例创建一个单独的配置。
真的是这样吗?这些服务如何相互发现?有没有一种方法可以使服务 A 不仅可以通过 REST 调用与服务 B 进行通信,还可以使用 类 的对象和服务 B 的方法,为服务 A 合并对服务 B 的依赖?
非常感谢您对此的任何想法!
我认为您混淆了微服务和基于 osgi 的应用程序之间的一些要点。对于微服务,您通常有一个独立的进程 运行 每个微服务都可以部署在同一台其他机器上。因此,您可以像您所说的那样扩展并获得收益。但是通信模型不是进程到进程。它必须使用不同的方法,强烈建议您使用标准集成机制,可以使用 REST,可以使用 Json RPC、SOAP,或者队列或主题来使用事件驱动的通信。通过这种机制,您可以像在 osgi 中一样调用 'other' 服务操作,但您只是使用不同的接口,而不是本地调用,而是远程调用。
服务发现可以通过虚拟 IP 通过通用 dns 名称和负载均衡器访问其他服务,或者如果您选择 kubernetes 作为平台,则可以使用 kubernetes DNS。您还可以使用中央配置服务或让每个服务在中央注册表中自行注册。已经有很多不同风格的解决方案来解决这种复杂性。
同样更重要的是,您必须意识到新的复杂性,但有些您已经有了。
- 合同版本控制和设计
- 服务之间的同步或异步通信。
- 如何处理服务边界的安全性/我的大部分服务是否需要安全性,或者我只需要有关用户身份的信息。
- 常见功能的维护成本和冗余副代码增加(这里 quarkus 的扩展对您有很大帮助,而且您还具有 microprofile 兼容性)。
- ...
决定采用微服务并不是一个容易的决定,也不应该一步到位。我的建议是你分析你的应用程序域并尝试检查你的设计是否适合微服务(在关注点分离和模型内聚方面)并将你的 osgi 平台的小部分提取到微服务中,否则你大部分都会被迫在您的服务接口中进行更改,由于服务对服务合同的依赖性,这比更改方法和一些调用更难。
我有一个应用程序分离在多个 OSGI 包中,运行 在单个 Apache Karaf 实例上。但是,我想迁移到微服务框架,因为
- Apache Karaf 很难设置,因为它的依赖机制
- 我希望以后能够将应用程序带到云端(AWS、GCloud 等)
我做了一些研究,查看了各种框架并得出结论,Quarkus 可能是正确的选择,因为它基于容器的方法、性能和可能的云集成机会。
现在,我一度陷入困境,到目前为止我还没有找到解决方案,但也许我在这里也可能有一个误解:我的计划是将我应用程序的几乎每个 OSGI 包迁移到一个单独的微服务中.这样,我就可以只水平扩展需要这样做的服务,而且我还可以 update/deploy 单独地扩展它们,而不必重新启动整个应用程序。因此,我假设每个服务都需要 运行 在一个单独的 Quarkus 实例中。但是,Quarkus 似乎不支持开箱即用?!?相反,我需要为每个 Quarkus 实例创建一个单独的配置。
真的是这样吗?这些服务如何相互发现?有没有一种方法可以使服务 A 不仅可以通过 REST 调用与服务 B 进行通信,还可以使用 类 的对象和服务 B 的方法,为服务 A 合并对服务 B 的依赖?
非常感谢您对此的任何想法!
我认为您混淆了微服务和基于 osgi 的应用程序之间的一些要点。对于微服务,您通常有一个独立的进程 运行 每个微服务都可以部署在同一台其他机器上。因此,您可以像您所说的那样扩展并获得收益。但是通信模型不是进程到进程。它必须使用不同的方法,强烈建议您使用标准集成机制,可以使用 REST,可以使用 Json RPC、SOAP,或者队列或主题来使用事件驱动的通信。通过这种机制,您可以像在 osgi 中一样调用 'other' 服务操作,但您只是使用不同的接口,而不是本地调用,而是远程调用。
服务发现可以通过虚拟 IP 通过通用 dns 名称和负载均衡器访问其他服务,或者如果您选择 kubernetes 作为平台,则可以使用 kubernetes DNS。您还可以使用中央配置服务或让每个服务在中央注册表中自行注册。已经有很多不同风格的解决方案来解决这种复杂性。
同样更重要的是,您必须意识到新的复杂性,但有些您已经有了。
- 合同版本控制和设计
- 服务之间的同步或异步通信。
- 如何处理服务边界的安全性/我的大部分服务是否需要安全性,或者我只需要有关用户身份的信息。
- 常见功能的维护成本和冗余副代码增加(这里 quarkus 的扩展对您有很大帮助,而且您还具有 microprofile 兼容性)。
- ...
决定采用微服务并不是一个容易的决定,也不应该一步到位。我的建议是你分析你的应用程序域并尝试检查你的设计是否适合微服务(在关注点分离和模型内聚方面)并将你的 osgi 平台的小部分提取到微服务中,否则你大部分都会被迫在您的服务接口中进行更改,由于服务对服务合同的依赖性,这比更改方法和一些调用更难。