而 Serverless 平台把计算部分(微服务中的 service)进一步拆分成了更小的粒度-- faas(函数即服务),同时相关存储、数据库、中间件等基础服务以 baas(后端即服务) 的形态提供;业务开发者只需要提交代码,不需要关注时如何运行起来的。
Serverless 平台的构建可以用前面提到的 Service mesh 或者标准 api 等方式作为其基础设施。
Serverless 平台往往也提供了弹性扩缩容,自动化容量评估,无人值守等等能力,但如果一个函数(业务代码)依赖的相关 sdk 以及初始化逻辑复杂影响了冷启动时间,那么会使得其弹性扩缩容非常受限,如果想真正发挥出其价值的话,需要让每个函数拆分的足够小,足够轻量;而函数拆分的粒度太小的话,整个系统相互调用时整体开销就会大幅增加(会出现更多的网络调用),所以目前 Serverless 用的较多的都是在前端 api 的业务聚合层,或者相对比较独立的业务系统(iot 设备上报,ai 算法计算等)。
展望
回顾整个历史的发展,应用被不断拆分的越来越细,且从前期的横向拆分到后面的 sidecar 等方式的纵向单节点内的拆分,而其背后的团队则越来越多也越来越复杂,职责边界越来越明确也驱动了架构的拆分(和组织拆分一样需要保持小而高效的团队,一个内聚的服务被太多的人同时维护效率也会降低效率);同时底层细节不断被屏蔽,编程门槛在不断的降低,似乎可以猜测将来几乎任何人都会将自己的想法快速变成代码执行。
下面是一些技术对未来更进一步的实现 Serverless 落地的猜想:
▐ WASI (系统 api 层面的标准化)
WebAssembly 最早期是被用于给 web 编程支持更多语言的扩展,把其他语言实现的代码能够直接被 JavaScript 所调用,并在浏览器运行。其定义了一套把其他语言编译成统一字节码规范的方式,并由 WebAssembly 虚拟机解释并运行(更多 WebAssembly 的细节不是本文重点,这里不再多介绍,如果不熟悉可以自行去了解)。
然后随着 WASI(WebAssembly System Interface) 的出现,使得 WebAssembly 可以在 web 之外运行,这让 WebAssembly 有了更多的想象空间,WASI 定义了一套类似 POISX 的标准编程协议,开发者不再直接面对内核提供的 POISX 标准编程(或者说不再关注内核来做相关编程)。
而这将会带来什么变化呢?于对运行在上的 runtime 提供的 WASI 标准,runtime 就是宿主机。也就是说开发者不再接触到具体的内核,对于开发者来说极机器就是 WASI 虚拟机!这使得编译成 WebAssembly 的代码可以被非常轻量的调度(一个 WASI 虚拟机进程可以随时替换和增加其所运行的 WebAssembly 代码)和启动。这给了 Serverless 的更大规模落地有了更多的想象空间。
当然目前 WASI 标准还处于比较早期,网络通讯和多线程都还未支持,这使得目前使用上比较受限,基本只能做纯计算,例如 Service mesh 中的 sidecar (envoy 以及蚂蚁的 mosn 等) 目前把 WebAssembly 当成了网络流量处理插件,而如果插件中涉及需要网络调用的部分则直接委托给了 sidecar 本身的实现。而同时 Java 等自带虚拟机的语言对支持 WebAssembly 难度更大,如正在尝试的 GraalVM,其把现有代码编译成 WebAssembly 还需要一些改造,目前现状是如果没有研究 GraalVM 专业人员的帮助,现有业务代码几乎很难成功编译。
WASI 和 WebAssembly 似乎可以解决 Serverless 计算中拆分过细导致的网络开销过大的问题(用 WebAssembly 虚拟机统一收敛出口,以及随时全局调度函数尽可能的本地化调用)。
如果将来 WASI 成了后端开发者的编程标准,那么将彻底屏蔽内核等传统"机器"的的概念,取而代之的是更加轻量化的"机器"-WASI运行时,在这之上将会开启一个全新的纪元(但这显然是个漫长的路程且不一定会走这个方向)。
▐ 统一编程平面 (业务 api 层面的标准化)
统一编程平面(标准业务 API) 则是以 dapr 等尝试的建立一套标准的业务开发所需的基础 api (前文已经提过),这是另外一种从业务 api 层面标准化的方向。这使得业务开发者只需要面向一组通用 api 来编程,而其背后的部署结构,实现方式则完全透明,并可随时替换。这看起来也给 Serverless 进一步落地带来了更大的可能性。
如果将来统一编程平面成了后端开发者的编程标准,那么将彻底屏蔽所有中间件以及基础设施和服务调用的差异,开发者的所有业务逻辑都将由标准 api 来组合完成,就像内核接口和系统调用一样,底层基础设施就变成了这个"庞大操作系统的内核"。
▐ 云原生编程语言 (编程语言层面的标准化)
既然 Serverless 目的是让业务不再关注服务器等基础设施的细节,那么能不能直接从编程语言下手,细到每一个对象的 new ,每一行语句的执行都能被整个集群内分布式的调度(比函数级别更细),而开发者方编程的时候只需要把这个集群都当成一个巨大的单机机器即可,底下的所有计算,存储等等全部由 Serverless 托管,相关的执行性能优化也都交给 Serverless,每一行代码再哪个机器执行,如何执行都交给 Serverless 平台。
例如下面 HelloWord 代码可能被运行在了不同的机器上:
public class HelloWorld {
public static void main(String[] args) {
String str = new String(“Hello, World”); // 运行在服务器 A
System.out.println(str); // 传递数据到服务器 B,并在服务器 B 运行
}
}
如果将来云原生编程语言能流行,并在语法上加以简化,似乎可以针对比较初级的程序员甚至是非程序员直接编写可以处理高并发,大流量,大数据等现在需要比较资深的程序员才能正确处理的工作,极大的降低互联网开发门槛。
而目前已经出现了两种云原生编程语言 Ballerina 和 Pulumi,他们都基于了IAC(基础设施即代码)的理念,在语言代码内可以直接非常简单的创建云基础设施,不再需要关注服务器等基础设施的部署。
例如 Pulumi 官方给出的创建一个 web server 的例子:
let aws = require(“@pulumi/aws”);
let sg = new aws.ec2.SecurityGroup(“web-sg”, {
ingress: [{ protocol: “tcp”, fromPort: 80, toPort: 80, cidrBlocks: [“0.0.0.0/0”]}],
});
for (let i = 0; i < 3; i++) {
new aws.ec2.Instance(web-${i}
, {
ami: “ami-7172b611”,
instanceType: “t2.micro”,
securityGroups: [ sg.name ],
userData: `#!/bin/bash
echo “Hello, World!” > index.html
nohup python -m SimpleHTTPServer 80 &`,
});
}
只要编译运行就创建出了相应的 aws 的 ecs 机器,并运行相关命令和配置。
初看似乎比较好,声称去掉了繁琐的 yaml 配置,把很多相关逻辑其实写到了编译器和语言运行时内,把相关的云服务都封装了一层自己的语法,开发者还是可以关注背后云基础设施(看起来只是简化了),但结合 faas 等服务后可以做到大部分情况不再需要关注底层基础设施。但整体发展还处在非常早期,目前看起来主要还是对各个云服务厂商能力的封装和抽象的一个工具,有自己的预发,同时也提供一些其他语言的类库(可以给别的现有编程语言调用)。距离理想的完全屏蔽基础设施还有很大的差距(也或许永远无法屏蔽吧)。
未来将走向何方,就交给时间和一滴滴改变世界的创作者们吧~
引用
-
https://zhuanlan.zhihu.com/p/42115757
-
https://www.redhat.com/zh/topics/cloud-native-apps/what-is-service-oriented-architecture
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。
对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。
你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:
请转发本文支持一下
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
4bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算