当前位置: 首页 > 科技观察

微服务:如何分解服务?

时间:2023-03-15 19:36:19 科技观察

在微服务的实现中,第一步是对微服务进行拆分。服务的拆分是非常困难和重要的。本文将讨论如何拆分服务。随着技术的发展,目前还没有一个具体的、设计良好的标准方法来完成服务的拆分。服务的拆分是一门技术,也是一门艺术。对于服务的拆分,有两种情况:1、从头开发新产品,采用微服务架构,拆分服务。2、将现有单体架构产品重构为微服务架构,拆分服务。如果你做的是ToB业务,最后私有化部署在企业内部,那么在大多数场景下,系统的复杂性和微服务拆分带来的新问题会得不偿失。随着业务的发展,产品需要向SaaS转型,团队也引入了多种技术栈。拆分微服务应该势在必行。那么下面就是如何将现有的单体架构拆分成微服务。服务的划分不取决于代码量或项目大小,而是根据当前的业务情况和团队的情况。我们以零代码平台为例。零代码平台有菜单、流程、表单、页面等模型。这些模型中的每一个都可以独立形成一个服务。但为了前期快速交付,可以全部放在一个项目中。但是在代码组织和架构层面,为了后续的Splitting可以在逻辑上隔离,物理文件可以通过目录来区分,整体还是在一个大项目中,如下图:最大的功能之一服务拆分就是解耦,但不代表一定要Disassembly就是解耦。在项目中,合理运用一些面向对象的原则,如依赖倒置、接口隔离等,也可以实现解耦。平台的功能在不断迭代,现在需要增加BI模块,整个架构也调整为支持多租户模式。同时,还需要开发应用商店,将零代码平台推向互联网,构建应用生态。用户可以直接安装应用,也可以将自己的应用发布到应用商店。这里添加的BI和应用商店可以作为单独的服务使用,而原来的零代码平台可以先作为一个大服务存在。修改后的架构图如下:上面的例子是从全局的角度考虑如何去做拆分不一定对,但是从我目前的认知和现有的场景来看,我觉得是合适的。具体到一个具体的服务,最基本的要求就是有一个可以独立部署的可访问的API。至于数据库是独立的还是与其他服务共享,也需要具体问题具体分析。如果跨服务查询操作较多,建议多个服务共享一个数据库。服务需要实现高内聚和低耦合。如果你的服务因为其他服务的变化需要频繁更新,或者你的服务一个小的变化会导致很多其他服务同步修改,那么就说明服务之间的耦合度太高了,微服务的好处发挥不出来了分手后享受,缺点却被无限放大。因此,在拆分服务时要遵循两个原则:1、对于通用功能,使用共享库,如工具类,将其抽取到NuGet包或Maven包中,在服务中引用;2、对于业务相关的公共部分,使用单独的Service,提供API方法供其他服务调用。每个服务都可以使用不同的架构和技术栈来实现。一种推荐的方法是使用六边形架构。六边形架构在一些DDD书籍和微服务书籍中都有提到。下面是一个六边形架构的架构图:六边形架构也叫端口适配器架构,可以替代传统的三层架构,解决三层架构的一些不足。端口和适配器都分为入站和出站。Inboundadapter:通常是外部的RestAPI,通过调用inbound端口来处理外部请求,也可以是消息队列的消费者,监听一些事件来处理异步业务。当收到消息时,它也会调用入站适配器端口进行处理。入端口:业务服务暴露的公共方法。OutboundAdapter:OutboundAdapter实现了Outbound接口,调用外部服务实现了完整的业务逻辑。出站适配器也可以是消息队列的生产者。出站端口:出站端口是一组方法的接口定义,为出站适配器提供规范以实现。举个例子:在零代码平台中,在窗体上拖一个控件保存后,最后的效果是这个列也会出现在列表中,窗体和列表属于两个独立的服务。根据六边形架构,调用关系如下图所示:六边形架构最大的好处之一就是将业务逻辑与适配器包含的表现层和数据访问层的逻辑分离,实现解耦。学习微服务,我觉得有必要同时学习领域驱动开发(DDD)。微服务是一种架构风格,DDD是一种具体的架构设计方法。它们可以更好的实现是因为:1.DDDneutrondomainandboundedcontext的概念可以对应微服务中的一个服务。2、微服务中的一个服务可以团队开发,DDD的领域模型也推荐独立团队负责。服务拆分后,以前可以在一个进程中完成的事情现在需要进程之间进行通信,进程间的通信以后会继续共享。零代码现在越来越流行。通过高度抽象,将基础设施和重复性工作作为平台自身的能力提供,让用户只专注于业务。这其实是另一个层次的脱钩和分裂。