应用程序从单片升级到微服务

时间:2019-02-24 15:36:18

标签: java microservices session-management

我们有13年使用

的整体Java应用程序
  1. 用于处理UI调用的Struts 2
  2. 用于数据库调用的JDBC / Spring JDBC模板
  3. 春季DI
  4. Tiles / JSP / Jquery for UI

在此单一源代码中创建了两个可部署项。

  1. 在线申请的战争
  2. 用于运行后端作业的JAR

当前的UI很旧。我们的目标是使用微服务重新设计应用程序。我们已经确定了可以作为单独的微服务运行的模块。

我们的脑海中有以下问题

  1. 我们应该使用哪个UI框架(Angular / React或自行开发的UI框架)。 Angular似乎很慢,就页面加载而言,我们需要更好的性能。
  2. UI / Javascript应该直接调用后端Web服务,还是应该在已部署的WAR中存在spring控制器代理,以将UI调用转发给API。如果单个UI调用需要从不同的微服务获取/更新数据,这也将有所帮助。
  3. 我们应该如何涵盖微服务安全方面
  4. 如果要具有同一微服务的多个实例,应该使用哪个负载均衡器。
  5. 由于它是银行应用程序,因此我们组织不允许使用Elastic Search / Lucene进行搜索。因此需要单独使用Oracle报告的建议。
  6. 我们应该如何运行后端作业?
  7. 还将有一个主付款微服务将创建付款。由于付款量巨大,因此将需要多个实例。我们将如何管理用户登录的会话。我们是否应该去内存中的分布式会话存储(可能是内存缓存)

2 个答案:

答案 0 :(得分:3)

这是一个非常广泛的问题。您需要聘请顾问架构师来深入了解您的应用程序,因为您不太可能在这里获得有意义的深入答案。 但是,作为粗略的指导原则,这里有一些简短的答案:

  
      
  1. 我们应该使用哪个UI框架(Angular / React或自行开发的UI框架)。 Angular似乎很慢,就页面加载而言,我们需要更好的性能。
  2.   

这取决于应用程序实际需要执行的操作。 Angular是领先的框架之一,通常一点也不慢。您可能做错了什么(您进行了太多的细粒度调用吗?后端速度慢吗?)。 React也是一个强有力的竞争者,但似乎正在失去人气,尽管那只是主观意见,可能是错误的。 Angular是功能更完善的框架,而React是更多工具的组合。如果您认为自己可以做一个自制的工具,并使其与这些现成的工具一样成熟,就会发疯。

  
      
  1. UI / Javascript应该直接调用后端Web服务还是   部署的WAR中应该有一个spring控制器代理   将UI调用转发到API。如果单个UI调用,这也将有所帮助   需要从不同的微服务获取/更新数据。
  2.   

许多较大的微服务架构通常都包含API网关。然后再次取决于您的用例。您可能还会遇到CORS问题,因此即使是简单的反向代理(您无需开发它),也可以通过代理/ API网关集中调用。

  
      
  1. 我们应该如何涵盖微服务安全性方面。
  2.   

完全不知道您的设置是什么样子。 JWT是一种常见的方法。我假设身份验证过程本身使用一些集中的LDAP / Exchange或类似过程。身份验证一旦完成,您就可以签署您提供给客户端的令牌,然后将其传递到HTTP授权标头中的相应微服务。

  
      
  1. 如果要拥有多个负载均衡器,我们应该使用哪个负载均衡器   相同微服务的实例。
  2.   

取决于您想要的。您是否正在部署基于AWS的基于云的解决方案(在这种情况下,基础架构提供了负载平衡)?您是否打算在Kubernetes设置上进行部署,在该设置中,负载平衡和扩展是其部署结构的一部分?您是否需要客户端负载平衡(Spring Cloud的一部分)?

  
      
  1. 由于它是银行应用程序,因此我们组织不允许使用   弹性搜索/ Lucene搜索。因此需要报告建议   单独使用Oracle。
  2.   

如果不了解Oracle数据的外观以及报告要求是什么,所有解决方案都是可能的。

  
      
  1. 我们应该如何运行后端作业?
  2.   

取决于您选择的基础结构。从简单的cron作业到云调度服务,或诸如Quartz之类的集成Java调度机制,一切皆有可能。

  
      
  1. 还将有一个主要的支付微服务将创建   付款。由于付款金额巨大,因此需要   多个实例。我们将如何管理用户登录的会话。应该   我们去了内存中的分布式会话存储(可能是内存缓存)
  2.   

不是。它将破坏微服务的全部目的。 JWT令牌将由客户端的浏览器管理并自动过期。在这种架构中,您无需管理用户登录的会话。

答案 1 :(得分:2)

正如您所提到的,这是一个银行网站,因此安全将是首要任务。在这里,我对FE和BE的建议很少。

FE :最好使用preactjs,它像库一样有反应,但比起反应要轻便得多。对于ui,您可以使用styled components而不是使用一些笨拙的第三方lib。这还将提高性能,并明显提高图像和大文件的CDN。

BE :根据您的需要,最好使用混合解决方案node,例如。会议。 设置一个身份验证服务器并让您的服务从那里验证用户,以后它将用于任何种类的服务。您将公开一些客户端API。

Auth的用户案例:您可以将redis用于会话信息,以从auth服务器验证用户身份,然后将信息添加到redis,稍后再检查用户是否从redis登录,这将减少来自auth服务器的负载。 (我对加密货币交换使用了相同的策略,效果很好)

负载均衡器:对Java不太熟悉,但是对于节点JS PM2来说,这样做并不重要,只需一个命令即可启动多个实例,并且自己平衡。 如果流量巨大,那么最好使用rabbitmq之类的消息服务,这样可以防止扩展服务器,从而降低服务器成本。

BE Jobs :我已经使用node完成了广泛的任务,并且进展顺利,您可以使用派生或扩展操作来启动特定工作的新实例并被杀死完成后,您可以轻松生成日志。

为进一步澄清,我在这里:)