曾几何时,无论是在服务器还是个人电脑,CPU芯片领域一直是 Intel 独占鳌头,旗下的 X86_64 架构被广泛采用。然而王权没有永恒,近年来 Arm64 架构异军突起,服务器端有华为鲲鹏920高性能芯片做代表,个人电脑端则以苹果M1芯片惊艳世人。Arm64 架构芯片用低功耗和高性能炫耀着其市场价值,国产化替代的洪流也在不断将 Arm64 推向军队、政府、国企的供应商们。抓住先机,迅速拥抱与适配国产化芯片,是这个时代软件交付的新话题。

拥抱 Arm64 的难处

X86_64 迈向 Arm64 并非易事,指令集的改变,影响半径极大。

最直接的影响,是原来在 X86_64 环境中可以正常运行的业务系统需要基于 Arm64 重新编译才可以运行。即使开发时使用的语言具备跨架构的能力,重新编译本身就是一种很繁复的工作,需要投入大量的人力成本和时间成本。

Arm64 的开发语言生态并不是那么健全,这无形中会增加了本不该开发人员关心的负担。很多语言本身的运行环境都需要重新编译,更不要提很多开源中间件的适配工作。

以上仅仅是开发人员关注的重点。

在软件交付领域,软件交付到客户环境中运行起来,仅仅是个开始。业务系统的管理、监控、迭代、容灾都是交付团队需要持续关注的点。多数交付团队在 X86_64 架构下,都已经有了自己的解决方案。那么容器、Kubernetes、DevOps这些先进的工具方法,在 Arm64 架构下如何复刻?

解决之道

Rainbond 可以利用自身能力抹平芯片架构的差异,无论是开发人员,还是交付人员,都可以基于 Rainbond 找到拥抱 Arm64 的解决之道。Rainbond 通过不同层次的能力来解决从 X86_64Arm64 的迁移问题。

  • 既有能力:Rainbond 本身是一款适用于软件交付,或者应用运维管理的云原生应用管理平台。无论是快速交付部署,还是应用的管理、监控、迭代、容灾,既有的功能已经可以满足交付运维人员的日常需求。

  • 容器化技术:Rainbond基于容器化技术实现,容器这种轻量级的虚拟化技术在 Arm64领域已然大放异彩。自从容器支持多架构之后,绝大多数开源中间件都已经提供了基于不同架构的基础镜像,Arm64 自然是其中的标配。选择容器化技术,相当于选择了 Arm64 的生态支持。

  • 自身兼容 Arm64 :Rainbond 很早就开始落子国产化架构适配,自身适配了包含 Arm64 在内的多种架构。

  • 极简的开发环境部署: Rainbond 已经支持运行于各种个人平台的 Docker Desktop 环境中,开发者只需要借助一台具有 M1 芯片的 MacBook ,即可花十分钟搭建起自己的 Rainbond Arm64 开发环境,方便至极。

  • 源码构建兼容 Arm64 :这是打通迁移到 Arm64 架构的最后一环。在 Rainbond 中,开发人员可以不改一行代码,直接利用源码构建自己的业务组件,即可将之部署运行于 Arm64 环境中。目前Rainbond源码构建已经支持了市面上多种主流语言,围绕语言自身的各种扩展依赖已经趋于完整。

Rainbond 兼容 Arm64

Rainbond 云原生应用管理平台可以被部署在 Arm64 环境中。从 2020 年 1 月起,Rainbond 分别和华为、飞腾进行了适配测试。经过验证,Rainbond 在 Kunpeng 920 芯片以及 FT2000+/64 这两款 Arm64 芯片上均可以稳定运行, 达到生产可用的标准。

而对于个人开发领域,Rainbond 也在持续发力。目前,Rainbond 支持在各种个人 PC 平台下利用 Docker Desktop 运行。我们将 Rainbond 的所有组件集成进一个容器,这种方式可以使得个人开发者以最简化的方式,利用十分钟时间运行起个人的开发测试环境。而对于使用具有 M1 芯片的 MacBook 个人开发者而言,就已经相当于基于 Arm64 架构进行开发了。

  • 在Mac上运行Rainbond,10分钟快速安装

  • 在Windows上运行Rainbond,10分钟快速安装

Arm64中的源码编译

Rainbond 具备的源码编译能力由来已久。该功能脱胎自 Heroku/buildpack 项目,并由 Rainbond 团队针对自身需求做了大量优化。借助其能力,使用者可以基于多种语言的源代码,跳过编写 Dockerfile 的过程,完成业务的容器化。源码编译是部署企业自行开发业务的最简单方式,仅需要提供源代码的仓库地址。

目前 Arm64 源码编译支持的语言及版本如下:

语言支持 版本支持 扩展支持
Java: Maven/Jar/War/Gradle openjdk 8 / 9 / 10 / 11 / 12 / 13 pinpoint agent
jmx-exporter
Node.js Node 4.9.1 / 5.12.0 / 6.14.4 / 7.10.1 / 8.9.3 / 8.12.0 / 9.11.2 / 10.13.0 / 11.1.0 Yarn 1.9.4
Node.js 前端项目
(VUE React)
Node 4.9.1 / 5.12.0 / 6.14.4 / 7.10.1 / 8.9.3 / 8.12.0 / 9.11.2 / 10.13.0 / 11.1.0 Yarn 1.9.4
Nginx 1.18.0
Golang Go 1.8 / 1.9 / 1.10 / 1.11 / 1.12 / 1.13 / 1.14 / 1.15 / 1.16
Python Python 2.7.9 / 2.7.17 / 3.4.9 / 3.5.7 / 3.6.6 / 3.6.10
PHP PHP 5.5.38 / 5.6.32~37 / 7.0.29 / 7.1.27 / 7.2.16 / 7.3.3 apcu / ev / event / imgick
memcached / mongodb
oauth / phalcon
pq / raphf / redis
Html Nginx 1.18.0 / Apache Httpd 2.2.19

在源码构建功能适配 Arm64 之后,使用者不需要自己对业务进行容器化,仅需要提供源码即可。这种体验,可以被称之为将业务零成本迁移至 Arm64 容器之中。极大的减轻了开发人员的技术负担,降低了迁移适配成本。而这一过程中,代码运行环境的处理、扩展依赖的处理都已经由 Rainbond Arm64 源码构建能力处理完成。

源码构建的原理并不复杂:

  • 基于 Builder 提供一个统一的构建环境,根据业务源代码的特征,选择对应语言的 buildpack 脚本。
  • 根据 buildpack 脚本的不同,以及用户在 Rainbond 控制台中指定的版本,会从第三方对象存储(Rainbond AliyunOSS)下载对应的语言运行环境预编译包(如 Openjdk)准备基础编译环境。
  • 执行预编译过程,根据用户在 Rainbond 控制台中定义的编译特性(如依赖仓库地址等)进行编译环境的配置。
  • 根据用户在 Rainbond 控制台指定的编译命令,或各语言的默认值,开始进行编译工作。期间会根据语言特征执行特定的操作,比如执行勾子函数、下载指定的扩展(PHP 扩展)等。
  • 将构建完成的产物统一打包,打包的格式,是 Heroku 风格的 Slug 包。
  • 基于 Runner 作为基础镜像,联合 Slug 包打包成为业务容器镜像,运行时自动解压 Slug 包,根据用户指定的启动命令,完成最终的运行。

整个构建过程拥有实时推送的日志,对于开发人员而言,和在自己的开发环境中编译操作没有太多差别。而编译过程中,需要提供 Arm64 支持的包括:语言运行环境预编译包、扩展、Nginx/Httpd 等中间价都已经由官方完成适配,免去了开发人员的辛劳,少掉了不少头发。

新安装的 Rainbond 平台,在首次进行源码构建时,会拉取 builder 和 runner 镜像,这个过程会花费几分钟时间。已经在 Arm64 环境中安装过 Rainbond 的用户,可以执行以下命令,拉取最新的镜像,来获取 Arm64 源码编译能力。

以 MacBook M1 电脑上安装的 Rainbond 为例,进入 rainbond-allinone 容器中操作:

docker exec -ti rainbond-allinone bash

获取内置镜像仓库的登录密码,登录镜像仓库:

hubpassword=$(kubectl get rainbondcluster -o yaml -n rbd-system | grep password | awk '{print $2}')
docker login --username=admin --password=${hubpassword} goodrain.me

处理镜像:

images=(builder runner)
for image in ${images[@]}dodocker pull registry.cn-hangzhou.aliyuncs.com/goodrain/${image}:v5.5.0-releasedocker tag registry.cn-hangzhou.aliyuncs.com/goodrain/${image}:v5.5.0-release goodrain.me/${image}docker push goodrain.me/${image}done

Rainbond 提供了示例代码,可供源码构建测试之用。

开始构建后,会自动弹出实时推送的构建日志,供开发人员了解构建进度。

当前日志中依次提供以下信息:

  • 代码仓库地址
  • 代码最新提交信息
  • 首次源码构建拉取 builder 镜像(该过程仅在首次构建中拉取)
  • 识别构建环境 CPU 架构,当前为 linux-arm64
  • 识别语言及构建方式,当前为 Java-maven
  • 语言运行环境版本,当前会下载 Arm64 环境可用的 openjdk1.8
  • 安装 Java 语言的能力扩展,包括 Pinpoint APM agent 和 jmx-exporter
  • 安装 Maven 构建环境,当前版本 3.3.9
  • 执行构建命令。

接下来的输出,和标准的 Java-maven 构建输出无二,是下载 pom 及依赖的过程。在构建完成后,输出日志:

代码编译过程到此完成,接下来,runner 会利用编译打包后的 slug 文件继续构建镜像,并完成向内置镜像仓库的推送:

首次构建,会拉取 runner 镜像,这个行为只会进行一次。

至此,源代码就已经变成了可以运行的容器镜像,该镜像可以在 Arm64 环境中运行。

持续交付

当开发者成功将自己的业务系统部署在 Rainbond Arm64 环境中后,Rainbond 已有的交付流程,就可以最大化的降低向 Arm64 环境交付的难度。通过将业务系统整体发布为应用模版,就得到了可以向最终生产环境交付的标准交付物。无论是导出为离线包,还是基于线上 RainStore 交付,都可以很方便的实现。后续的流程可以参考以往的文章或参考官方文档。

使用Rainbond实现离线环境软件交付

x86架构应用如何向Arm架构低成本迁移相关推荐

  1. 【Linux operation 23】Win 10 64位(X86 架构CPU)安装ARM架构的虚拟机(银河麒麟高级服务器操作系统 V10)

    1.银河麒麟高级服务器操作系统 V10(鲲鹏版)下载: 官网下载 https://www.kylinos.cn/scheme/server/1.html 1.银河麒麟高级服务器操作系统V10x86/兆 ...

  2. 【Android 逆向】ARM CPU 架构体系 ( ARM 内存模型 | ARM 架构堆的实现 | ARM 架构栈的实现 )

    文章目录 一.ARM 内存模型 二.ARM 架构堆的实现 三.ARM 架构栈的实现 一.ARM 内存模型 ARM 架构体系中 , CPU 直接访问内存 , 控制内存中的状态和数据 , 内存中映射外部设 ...

  3. x86的PC机上运行ARM架构开发板

    一.背景 1.当你需要基于arm + linux框架开发需求(如驱动,应用程序,调试等)时,但是没有相应的物理开发环境,只有一台装了虚拟机linux系统的X86电脑.如果是这种情况,可以继续往下看. ...

  4. ARM公版架构迭代迅速 国产ARM架构落伍

    近年来,ARM CPU性能可谓是突飞猛进,根据ARM官方消息,Cortex A78 CPU最高性能比5年前推出的Cortex A73 CPU提升2.5倍.ARM下一代的Matterhorn架构及Mak ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

    文章目录 前言 一.x86 架构的返回值获取 二.ARM 架构远程调用 前言 在之前的博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 ...

  6. 应用程序如何从X86快速换到ARM架构 | 瑞迅科技工控一体机解读

    前两天收到朋友私信,问我:应用程序如何从X86架构无缝移植到ARM架构?本期小瑞给大家盘一盘! 说到这,就要从X86和ARM的优劣势讲起了,长期以来大量的应用程序都是以X86架构为主,或者是在Wind ...

  7. 为何当初龙芯要用MIPS架构,而不是ARM或X86架构?

    众所周知,目前国内的芯片均是采用国外的架构,华为麒麟采用的是ARM架构,兆芯采用的是X86,申威采用的是Alpha.龙芯采用的是MIPS,还有些采用的是RISC-V架构. 而在这些芯片之中,似乎采用M ...

  8. win11 x86 系统部署arm架构的虚拟机(银河麒麟为例)

    文章目录 一.使用 win11 x86 系统部署arm架构的虚拟机(银河麒麟为例) 1.1.1.前言 1.1.2.准备环境 1.1.1.1.首先,需要一个银河麒麟的arm镜像 1.1.1.2.QEMU ...

  9. Android 设备 arm 架构和 x86 架构的区别

    我们在使用 AndroidStudio 创建模拟器并且在选择 Android 系统版本的时候会碰到 一个选项,需要你选择是基于 x86 架构的还是基于 ARM 架构的. 如下图所示: 那么这 2 个有 ...

  10. ARM、ARM架构、ARM架构芯片

    ARM是一种基于精简指令集(RISC)的处理器架构,它由英国的ARM公司设计和授权. ARM芯片具有低功耗.高性能.高集成度等特点,广泛应用于嵌入式系统.移动设备.物联网.服务器等领域.本文将介绍AR ...

最新文章

  1. Pytorch Lightning 完全攻略!
  2. Unity游戏暂停之Update与FixedUpdate区别
  3. java信息管理系统总结_java实现科研信息管理系统
  4. One sentence only!!
  5. python 一次性定时器_python 定时器每天就执行一次的实现代码
  6. ORACLE sqlplus set 命令速查
  7. python文本筛选html_python 正则表达式过滤文本中的html标签 源代码解析
  8. ApacheCN 深度学习译文集 20210112 更新
  9. Python 返回值、方法和函数的区别
  10. C++库介绍-标准库、类库
  11. Unity Shader - 车漆效果(基于MatCap)
  12. EtherCAT从站调试测试
  13. 中国程序员开发的远程桌面火了!Mac可用,只有9MB,支持自建中继器
  14. 近期研究方向 (内部参考)
  15. Lync 2010升级到Lync 2013之更新CU2!
  16. 计算机毕业设计 SSM+Vue宠物管理系统 宠物商城 宠物用品购物平台 宠物领养救助系统 Java Vue MySQL数据库 远程调试 代码讲解
  17. Anaconda下载及安装保姆级教程(详细图文)
  18. MBA 消费者行为学 大白兔故事以及换装变化给老字号的启示
  19. c语言输出字母abcd,有字母ABCD,请用C语言编写程序,输出由该四个字母组成的字符串.要求如下:...
  20. Jlink使用技巧系列教程索引

热门文章

  1. Google 展示广告
  2. CATIA二次开发—API梳理
  3. CSP/CCF计算机职业资格认证题目:[201903-1 小中大]【已解决】
  4. arduino编译失败_保存后,Arduino代码将无法编译
  5. Exploit编写教程1:栈溢出
  6. 小程序毕业设计 基于java后台微信在线考试小程序毕业设计参考
  7. 搬运:php入门安装教程
  8. 作为空降领导,该如何做?
  9. 如何下载历史版本和最新版本的iar
  10. 搜狗输入法的桌面图标消失,无法打开设置怎么办