【问题标题】:Application upgrade from monolithic to microservices应用程序从单体升级到微服务
【发布时间】:2019-07-18 02:36:05
【问题描述】:
我们有 13 年使用的单体 Java 应用程序
- 用于处理 UI 调用的 Struts 2
- 用于数据库调用的 JDBC/Spring JDBC 模板
- 弹簧DI
- 用于 UI 的 Tiles/JSP/Jquery
从这个单一的源代码创建了两个可部署。
- WAR 在线申请
- 用于运行后端作业的 JAR
当前的 UI 相当陈旧。我们的目标是使用微服务重新设计应用程序。我们已经确定了可以作为单独的微服务运行的模块。
我们心中有以下问题
- 我们应该选择哪个 UI 框架(Angular/React 或自制的)。 Angular 似乎很慢,就页面加载而言,我们需要更好的性能。
- 应该 UI/Javascript 直接调用后端 Web 服务,还是应该在部署的 WAR 中有一个 spring 控制器代理,它将 UI 调用转发到 API。如果单个 UI 调用需要从不同的微服务获取/更新数据,这也会有所帮助。
- 我们应该如何涵盖微服务安全方面
- 如果我们想要拥有相同微服务的多个实例,我们应该使用哪个负载均衡器。
- 由于它是一个银行应用程序,我们的组织不允许使用 Elastic Search/Lucene 进行搜索。因此需要单独使用 Oracle 报告的建议。
- 我们应该如何运行后端作业?
- 还将有一个主要的支付微服务来创建支付。由于支付量很大,因此需要多个实例。我们将如何管理用户登录会话。我们是否应该使用内存分布式会话存储(可能是 memcache)
【问题讨论】:
标签:
java
microservices
session-management
【解决方案1】:
正如您所提到的,它是一个银行网站,因此安全性是第一位的。这里我对 FE 和 BE 有几点建议。
FE:你最好使用preactjs,它是一个类似于库的反应,但与反应相比更轻、更快。对于 ui,您可以使用 styled components 而不是使用一些繁重的第三方库。这也将提高性能,并明显提高图像和大文件的 CDN。
BE:根据您的需要,您最好使用混合解决方案 node 可能是一个不错的选择。例如会话。
设置一个身份验证服务器并从那里为您提供服务验证用户,它将在未来用于任何种类的服务。例如您将公开一些客户端 API。
身份验证用户案例:您可以使用 redis 获取会话信息,从身份验证服务器获取用户验证,然后将信息添加到 redis,然后检查用户是否从 redis 登录,这将减少身份验证服务器的负载。 (我在加密交换中使用了相同的策略并且进展顺利)
负载平衡器:对 java 不太熟悉,但对于节点 JS PM2 来说,这对你来说没什么大不了的,只需一个命令,它将启动多个实例并在它自己的。
如果您的流量很大,那么您最好使用rabbitmq 之类的消息服务,这将通过阻止您扩展服务器来降低服务器成本。
BE Jobs :我已经使用node 完成了广泛的任务,并且进展顺利,您可以使用分叉或跨越这将为特定工作启动一个新实例,并在完成后被杀死它,您可以轻松地生成日志。
为了进一步澄清,我在这里:)
【解决方案2】:
这是一个非常广泛的问题。您需要让顾问架构师深入了解您的应用程序,因为您不太可能在这里获得有意义的深入答案。
然而,作为粗略的指导,这里有一些简短的答案:
- 我们应该选择哪个 UI 框架(Angular/React 或自制的)。 Angular 似乎很慢,就页面加载而言,我们需要更好的性能。
这取决于应用程序实际需要做什么。 Angular 是领先的框架之一,通常一点也不慢。你可能做错了什么(你做了太多细粒度的调用吗?你的后端慢吗?)。 React 也是一个强有力的竞争者,但似乎正在失去人气,尽管这只是一种主观意见并且可能是错误的。 Angular 是一个功能更完整的框架,而 React 更多的是工具的组合。如果您认为您可以自己制作一个并使其达到与这些现成工具相同的成熟度,那您就疯了。
- 应该 UI/Javascript 直接调用后端 Web 服务还是
部署的WAR中是否应该有一个spring控制器代理?
将 UI 调用转发到 API。如果单个 UI 调用,这也将有所帮助
需要从不同的微服务获取/更新数据。
许多大型微服务架构通常涉及 API 网关。然后再次取决于您的用例。您可能还遇到了 CORS 的问题,因此通过代理/API 网关集中调用,即使它是一个简单的反向代理(您不需要开发它)也可能是一个好主意。
- 我们应该如何涵盖微服务安全方面。
再次不知道您的设置是什么样的。 JWT 是一种常见的方法。我假设身份验证过程本身使用一些集中的 LDAP / Exchange 或类似的过程。身份验证后,您可以签署一个令牌,然后将其提供给客户端,然后将其传递给 HTTP 授权标头中的相应微服务。
- 如果我们想拥有多个负载均衡器,我们应该选择哪个负载均衡器
同一微服务的实例。
取决于你想要什么。您是否在 AWS 等基于云的解决方案上进行部署(在这种情况下,负载平衡由基础设施提供)?您是否要在 Kubernetes 设置上进行部署,其中负载平衡和扩展作为其部署结构的一部分进行处理?你想要客户端负载均衡(Spring Cloud 的一部分)吗?
- 由于它是一个银行应用程序,我们的组织不允许使用
用于搜索的 Elastic Search/Lucene。所以需要报告的建议
单独使用 Oracle。
如果不知道 Oracle 上的数据是什么样子以及报告要求是什么,那么所有解决方案都是可能的。
- 我们应该如何运行后端作业?
取决于您选择的基础架构。一切皆有可能,从简单的 cron 作业到云调度服务,或者像 Quartz 这样的集成 Java 调度机制。
- 还将有一个主要的支付微服务,它将创建
付款。由于支付量巨大,因此需要
多个实例。我们将如何管理用户登录会话。应该
我们使用内存中的分布式会话存储(可能是 memcache)
不是真的。它将破坏微服务的全部目的。 JWT 令牌将由客户端的浏览器管理并自动过期。您无需在此类架构中管理用户登录会话。