Microservices和Modular Programming已被证明是一个合适的选择。它的好处包括可重用性,可分发性,可读性等。
我们是一个使用OSGI作为模块化实现的MOOC站点:
以3个功能为例:
course project Q&A(question&answer)
+---------------+ +---------------+ +---------------+
| web | | web | | web |
| | | | | |
+---------------+ +---------------+ +---------------+
| service | | service | | service |
| | | | | |
+---------------+ +---------------+ +---------------+
| dao | | dao | | dao |
| | | | | |
+---------------+ +---------------+ +---------------+
| Database | | Database | | Database |
| | | | | |
+---------------+ +---------------+ +---------------+
要求:
我不知道这种设计或架构(完全隔离每个功能的上下)是否合适,但我确实面临一些不便:
模块化Web应用程序
Q& A功能是独立功能和课程/项目的一部分。目前,我认为将Q& A模块作为独立课程的web组件 - webapp / project-webapp,以及独立的qa-webapp本身,但我不知道什么是重用控制器的最佳方式避免在网络层上重复代码
理性数据库Polymorphic Association问题
一个问题可能属于课程/项目,或者与上下文无关,而课程/项目的ID来自另一个数据库,多态关联是不可避免的。目前我在表格问题上使用额外的列post_to_type来解决这个问题。
让我说课程/项目可以是私人的或公共的。全球Q& A条目下列出的问题仅包括属于公共课程/项目的问题,而非私人问题。但同样,由于每个功能都有自己的数据库,并且禁止直接访问其他功能的数据库,我不知道处理这个问题的优雅和有效方法是什么。
使用OSGI时我们的模块化设计出了什么问题,或者只是我觉得这样不舒服?什么是设计微服务/模块化架构的最佳实践,特别是像Java这样的面向对象语言?
谢谢!
答案 0 :(得分:1)
微服务应该围绕有界上下文构建,这可能与你在这里调用的功能一致,但也可能没有;)找到边界是一项棘手而艰巨的任务,如果没有完整的话,几乎不可能正确完成你的系统的上下文。其他人可以根据自己的经验提供提示或分享见解,但无论您的模型是否正确,都无法给出答案。也不要担心"纠正"太多了,肯定有几种方法可以构建你的代码,所有这些方法都很有用。因此,专注于使模型有用并解决任何气味(例如代码变得难以维护,通信过于繁琐等)。
<{3}}中的Sam Newman建议从粗粒度有界上下文开始,如果将来需要,可以将其分成较小的上下文。他还有一个非常好的章节,谈论将巨石分解为服务。即使您正在开展绿地项目,我建议您查看他的书,以及其他人的帖子和谈话,将巨石打破成微服务。在我看来,这是了解如何找到这些界限,人们犯了什么错误以及如何做到正确的最佳方式。我还建议您查看&#34; Modular monoliths&#34; Simon Brown的演讲。微服务不是模块化的唯一选择,Simon在那里分享了有用的见解。