速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

机甲模式介绍及延伸

北京顺丰同城科技 杨坤

  • 2024-03-29
    北京
  • 本文字数:3380 字

    阅读完需:约 11 分钟

机甲模式介绍及延伸

一、背景


Service Mesh、云原生等概念已经出了五六年了。从实践落地来看,还没有得到广泛的推广普及,使用范围限制在亚马逊、微软、阿里云等云厂商内部。在各大厂商的实践过程中,Bilgin Ibryam 在其博客Multi-Runtime Microservices Architecture (infoq.com)中提出了微服务的一个新的设想:Multiple Runtime。在其设想中的微服务架构中,出现了 Mecha 层的划分。故我们将其提出的 Mutiple Runtime 微服务架构模式,翻译为“机甲模式”。


本文将对机甲模式(Bilgin Ibryam 的设想:Multiple Runtime)做出介绍,并对服务架构的演变历史进行回顾。


二、服务架构的演变

2.1、单体服务


业务功能集中在一个项目中开发,进行部署,通过单一后端应用提供并集成所有的服务。


2.2、分布式系统


根据业务功能对系统做拆分,每个业务模块作为独立项目进行开发,以服务形式部署。


2.3、微服务


微服务(Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic) 的 API 集相互通信。


图2.3.1-微服务架构图


2.4、Service Mesh


服务网格是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但对应用程序透明。whats-a-service-mesh-and-why-do-i-need-one


图2.4.1-Service Mesh架构图


三、分布式的核心问题及机甲模式


伴随着分布式系统的落地,需要解决分布式系统中:服务治理、分布式事务、打包部署等问题。下面我们一起来过一下分布式系统中需要关注的问题:


3.1、分布式应用程序需求


图3.1.1-分布式应用核心问题


3.1.1、生命周期(Lifecycle)


功能以代码的形式交付之后,编程语言会决定在这个生态中用什么样的库、打包方式、运行方式。例如,Java 生态中依赖的 Maven 库,JVM。在整个生命周期中,打包、部署、健康检查、配置、异常恢复,都是应用在整个生命周期中的重要组成部分。


3.1.2、网络(Networking)


当下,几乎所有的分布式应用程序都需要考虑到网络问题。而且网络的范围更广,不仅仅是通信问题,还包括服务发现、超时重试机制、网络安全问题等。

3.1.3、状态(State)


状态的概念,大部分情况下是指服务的状态,服务需要表现出无状态。服务编排、工作流、时间调度(定时任务)、幂等性、故障恢复、缓存等。


3.1.4、绑定(Binding)


分布式系统中,不仅需要考虑到系统内部的调用。还需要考虑到与外部系统、组件之间的连接、协议转换、消息的传递及路由、事务。


3.2、分布式的困境与现状


在容器(Docker)、服务编排(Kubernetes)的基础之上,随着行业内在分布式中的积累,Service Mesh、云原生(Cloud-Native)在各大云厂商的。


图3.2.1-分布式应用现状


3.2.1、分布式的困境


  • 不同语言的基础功能复用性不高或者比较困难,服务的开发者绑定在特定语言上

  •  强依赖 SDK,升级工作会变得复杂

  •  数据库等客户端配置、初始化需要在服务中进行,未完全解耦,抽离出来


3.2.2、分布式架构现状


传统中间件和云原生平台对比,传统中间件提供各种 SDK 的方式提供能力,而云原生则是提供各种外围 Runtime。云原生平台在业务逻辑从平台中解耦的方面已经做的比较好了,但是在未来还会有更多的可能性,应用中的过滤器、聚合器、内容路由,流式计算中的合并、滑动窗口等逻辑部分,依然是在业务逻辑中。


3.3、机甲模式对分布式的设想


基于现状,业界大佬(Bilgin Ibryam)在自己的博客Multi-Runtime Microservices Architecture中对当前的云原生的最佳实践进行归类划分


图3.3.1-机甲模式对当前分布式产品的归类


  • Kubernetes 和容器技术对多语言应用程序的生命周期管理,奠定了基础

  • Service Mesh 利用先进的网络功能对 Kubernetes 有了进一步提升

  • Dapr 基于 Kubertetes、Knative 和 Service Mesh 的理念,在分布式系统方面有了更先进的实践


3.3.1、机甲模式架构


图3.3.2-机甲模式架构及特点


这是一种类似客户端-服务端架构的双组件模式,其中每个组件都独立运行。它与简单的客户端-服务端架构的不同点在于,这里的两个组件部署在同一台主机上,面向 localhost 通信。


  • 组件 Micrologic,包含了几乎所有分布式系统关注的最基本的业务逻辑

  • 组件 Mecha,提供了分布式系统的功能

  • Micrologic 与 Mecha 可以是一对一的部署,也可以是多个 Micrologic 共享一个 Mecha 部署

3.3.2、机甲模式特点


  •  Micrologic 组件本身不是微服务,它包含微服务的业务逻辑,并且只能跟 Mecha 组件配合一起使用,形成一个微服务

  • Micrologic 组件通过一些预定义的 API 与 Mecha 进行通信,Mecha 与外部系统进行通信

  • Mecha 组件是通用的、可配置的、可重复使用的组件

  • Mecha 组件适用于多语言微服务

  • Mecha 组件与多个代理不同,而是通过内部插件或者外部服务支持,作为一个整体提供一套能力

  • Mecha 组件通过简单文本声明方式配置,确定启用哪些功能及与 Micrologic 的绑定方式


所以说,机甲模式(Mecha)其实是对 Service Mesh 接下来发展的一种预测,未来的微服务部署模式,可以像电影中,人类穿上不同的机甲进行战斗一样。通过 Micrologic 与 Mecha 的组合,实现一个真正的微服务。


比较形象的描述,程序可以像钢铁侠的战甲一样,按需装配。如下图:


图3.3.3-钢铁侠战甲


3.4、问题解决案例及思考

3.4.1、案例一:本地开发环境遇到的服务调用问题


在一个调用关系复杂的微服务项目中,单次请求的处理,调用到微服务中多个模块,业务层面拆分粒度比较细的情况下,对于处在开发阶段的研发人员来说,则会很费力。服务发现、负载均衡没有做好,完成一次调试,本地可能需要启用多个服务。


为了专注于当前业务逻辑,总结以下经验:


  1. 未迭代的服务依赖 DEV 环境实例

  2. 借用 DEV 环境代理网关解决网络访问和请求转发问题

  3. 巧用 switch-host 配置 DNS,对不同环境的问题进行本地回放

 

3.4.2、案例二:插件式开发框架-Spring-brick


在许多 To-B 和 To-G 的项目中,为了应对特殊场景,例如:数据库需要用“指定厂商”的数据库,但是不同的厂商,SQL 的方言有所不同,所以同一个产品需要支持灵活切换数据库。如果可以将持久层以插件形式集成到项目中,实施的成本可以大大降低。


Spring-brick 框架就是一个很不错的实践产物,它可以解决如下痛点:


  1. 在 To-B 系统场景中,不同甲方会有不同的需求,在不打分支和改动系统核心代码的前提下,可以在插件中进行扩展开发特定功能,不同甲方使用不同插件,完美解决非核心系统的扩展功能开发,例如扩展中台系统的不同需求。

  2.  在 To-C 系统场景中,可以在主程序通过定义 java-interface,在插件中做不同实现,来达到动态扩展系统功能。

  3. 在开发中,由于引入了不同版本的依赖,导致系统无法运行,本框架可以完美解决在不同插件中定义不同版本的依赖,从底层进行隔离,以解决引入不同版本依赖冲突的问题。比如可以解决同一个程序同时连接 mysql-5 和 mysql-8 版本数据库。

  4. 在开发中,不同插件依赖不同框架的功能,可以按需引入。比如在插件 A 引入连接 mysql、在插件 B 引入连接 elasticsearch、在插件 C 引入连接 oracle。

  5. 在插件中,可以任意集成不同的非 web 类型的 springboot-xx-starter,然后将不同插件功能组装起来,以达到一个统一对外提供服务的完整系统,实现系统组装化、插拔化开发。

  6. 在不重启主程序的前提下,对插件进行动态的安装、卸载、启动、停止。

 

 图3.4.1-Brick框架架构图


 图3.4.2-Brick实践


3.4.3、思考

Service Mesh 的落地,离不开容器(Docker)和容器编排(Kunbernetes)支持,对团队组织能力和运维能力有很高的要求,开发负责人需要根据自身情况,选择适用自己的方案。例如,小规模软件的服务“硬拆”为微服务,反而会导致新架构与组织能力的不匹配,让架构升级得不到技术红利。


从分布式的发展来看,进化点:


  • 生命周期的自动化、高度的可运维

  • 业务逻辑与分布式系统问题之间的耦合性越来越低,业务模块中集成的 SDK 越来越薄

  •  业务层与基础能力层之间在 localhost 层面交互,甚至在同一个进程内部实现热加载、卸载

  • 基础层能力的复用性走高,平均成本走低


对于一些正在做数字化转型的传统企业,有自己的机房,但是又缺乏组织和运维能力,Service Mesh 甚至基本的微服务架构的落地都会比较困难。特别对于一些有沉重历史包袱的项目,采用插件式的开发框架,也是一种提升交付能力的方式。


技术演进的速度永远比开发者学习的速度快,但是演进的方向和思想,是开发者所必须要了解的。

 

参考资料:

Multi-Runtime Microservices Architecture (infoq.com)

什么是Service Mesh - 知乎 (zhihu.com)

The Twelve-Factor App (简体中文) (12factor.net)

2024-03-29 17:207891

评论

发布
暂无评论
发现更多内容

SpringBoot整合MybatisPlus基础教程

(-0 , +0)

springboot Mybatis Plus

分类树,我从2s优化到0.1s

Java你猿哥

Java 算法 ssm 分类树

支持GraalVM原生编译的开源低代码平台:Nop Platform

canonical

开源 低代码 GraalVM Quarkus 低代码平台

Y组合子的一个启发式推导

canonical

函数式编程 函数式 Lambda演算 Y组合子 不动点

系统学Java,看这篇Java综合笔记万字总结就够了!纯干货分享

Java你猿哥

Java spring 面试 ssm 多线程与高并发

一把王者的时间,带你吃透Java面试八股文(2023最新整理)

Java你猿哥

Java 面试 微服务 Spring Boot mybatis

再见!Fastjson!

Java你猿哥

Java ssm Fastjson

《银河护卫队3》观后感:AI、人生

无人之路

AI 电影

从可逆计算看开源低代码平台Skyve的设计

canonical

开源 低代码 架构设计 低代码平台 扩展机制

javaweb脚手架springboot基础入门

(-0 , +0)

一图看懂CodeArts Deploy 5大特性,带你玩转部署服务

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

如何在不修改基础产品源码的情况下实现定制化开发

canonical

开源 低代码 定制化 迭代增量开发 可扩展性

led大屏幕存在的问题

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

从张量积看低代码平台的设计

canonical

开源 低代码 架构设计 低代码平台 领域模型

采用Excel作为设计器的开源中国式报表引擎:NopReport

canonical

开源 低代码 报表 BI 报表 中国式报表

这份阿里逆天的Redis手册,于内卷中首次亮相了

Java你猿哥

Java redis 面试 Redis 核心技术与实战 redis 底层原理

Paxos的魔法学研究报告

canonical

paxos协议 共识算法 分布式, 分布式算法 深入理解分布式共识算法

springboot整合redis基础示例

(-0 , +0)

可逆计算:下一代软件构造理论

canonical

低代码 软件架构 函数式编程 领域驱动模型DDD 中台架构 低代码平台

XDSL:通用的领域特定语言设计

canonical

开源 低代码 dsl 领域特定语言 领域语言工作台

什么是策略模式?如何在Java项目中引入策略模式来优化代码结构

(-0 , +0)

如何用 ModelScope 实现 “AI 换脸” 视频

北桥苏

Python ModelScope

火山引擎DataTester:A/B实验平台数据集成技术分享

字节跳动数据平台

关于 ModelScope 的视频 “AI 换脸” 优化方案

北桥苏

Python ModelScope

问鼎CodeXGLUE榜单,华为云UniXcoder-VESO-v1算法取得突破

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 5 月 PK 榜

宝兰德应用服务器软件与华为云GaussDB完成兼容互认证

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

分库分表的 21 条法则,hold 住!

程序员小富

分库分表 springboot 分库表

简单聊聊MySQL索引优化的内容

(-0 , +0)

eBPF动手实践系列二:构建基于纯C语言的eBPF项目

阿里云大数据AI技术

运维 C语言 ebpf 企业号 5 月 PK 榜

中移链合约常用开发介绍(四)工程树目录

BSN研习社

不是单例的单例——巧用ClassLoader

PPPHUANG

单例模式 ClassLoader ContextClassLoader Java web

机甲模式介绍及延伸_架构_InfoQ精选文章