微服务和模块化架构设计的权衡?

时间:2016-06-09 02:09:10

标签: osgi polymorphic-associations microservices modularity

在设计软件系统时,

MicroservicesModular Programming已被证明是一个合适的选择。它的好处包括可重用性,可分发性,可读性等。

我们是一个使用OSGI作为模块化实现的MOOC站点:

  • 每个功能都有自己的数据库,服务和独立的Web应用程序
  • 禁止直接访问其他功能的数据库

以3个功能为例:

     course               project         Q&A(question&answer)

+---------------+    +---------------+    +---------------+
|     web       |    |     web       |    |     web       |
|               |    |               |    |               |
+---------------+    +---------------+    +---------------+
|     service   |    |     service   |    |     service   |
|               |    |               |    |               |
+---------------+    +---------------+    +---------------+
|     dao       |    |     dao       |    |     dao       |
|               |    |               |    |               |
+---------------+    +---------------+    +---------------+
|     Database  |    |     Database  |    |     Database  |
|               |    |               |    |               |
+---------------+    +---------------+    +---------------+

要求:

  1. 每个课程/项目都有Q& A模块,参与的用户可以在这里询问有关此课程/项目的问题。
  2. 一个独立的全球(或常见)Q& A条目,列出了从所有课程/项目汇总的问题,用户可以在此处询问与上下文无关(也就是说,与任何课程/项目无关)的问题。
  3. 我不知道这种设计或架构(完全隔离每个功能的上下)是否合适,但我确实面临一些不便:

    1. 模块化Web应用程序

      Q& A功能是独立功能和课程/项目的一部分。目前,我认为将Q& A模块作为独立课程的web组件 - webapp / project-webapp,以及独立的qa-webapp本身,但我不知道什么是重用控制器的最佳方式避免在网络层上重复代码

    2. 理性数据库Polymorphic Association问题

      一个问题可能属于课程/项目,或者与上下文无关,而课程/项目的ID来自另一个数据库,多态关联是不可避免的。目前我在表格问题上使用额外的列post_to_type来解决这个问题。

    3. 让我说课程/项目可以是私人的或公共的。全球Q& A条目下列出的问题仅包括属于公共课程/项目的问题,而非私人问题。但同样,由于每个功能都有自己的数据库,并且禁止直接访问其他功能的数据库,我不知道处理这个问题的优雅和有效方法是什么。

    4. 使用OSGI时我们的模块化设计出了什么问题,或者只是我觉得这样不舒服?什么是设计微服务/模块化架构的最佳实践,特别是像Java这样的面向对象语言?

      谢谢!

1 个答案:

答案 0 :(得分:1)

微服务应该围绕有界上下文构建,这可能与你在这里调用的功能一致,但也可能没有;)找到边界是一项棘手而艰巨的任务,如果没有完整的话,几乎不可能正确完成你的系统的上下文。其他人可以根据自己的经验提供提示或分享见解,但无论您的模型是否正确,都无法给出答案。也不要担心"纠正"太多了,肯定有几种方法可以构建你的代码,所有这些方法都很有用。因此,专注于使模型有用并解决任何气味(例如代码变得难以维护,通信过于繁琐等)。

<{3}}中的Sam Newman建议从粗粒度有界上下文开始,如果将来需要,可以将其分成较小的上下文。他还有一个非常好的章节,谈论将巨石分解为服务。即使您正在开展绿地项目,我建议您查看他的书,以及其他人的帖子和谈话,将巨石打破成微服务。在我看来,这是了解如何找到这些界限,人们犯了什么错误以及如何做到正确的最佳方式。

我还建议您查看&#34; Modular monoliths&#34; Simon Brown的演讲。微服务不是模块化的唯一选择,Simon在那里分享了有用的见解。