谁说 Java 不能用来跑 Serverless?
作者 | AddoZhang 责编 | 欧阳姝黎
当讨论起世界上最好的开发语言是什么的时候,Java 的粉丝们总会遇到这种场景:
吹:“Java 语法简单,容易上手!” 黑:“Java 启动慢,性能差,耗资源!” 吹:“Java 有世界上最多的程序员!” 黑:“Java 启动慢,性能差,耗资源!” 吹:“Java 生态好!” 黑:“Java 启动慢,性能差,耗资源!” 吹:“滚!”
在对 Java 语言的评价中,往往少不了“启动慢”的字眼。但对着汇编语言的发展,更快的 Java 架构——Quarkus 出现了,今天我们就来说说应“云”而生的 Quarkus。
TL;DR
废话不多说,先上结论。Quarkus 与 Spring 首个请求的响应耗时:2.5s vs 5.7s。
注:为了忽略拉取镜像的时间差异,提前 pull 镜像。
验证
环境准备
Kubernetes 1.18+ via minikube
Istio 1.9.2
Knative 0.22.0
Knative CLI (brew 安装)
watch (brew 安装)
环境的安装准备参考官方的文档。
镜像
资源镜像就使用上一篇文章构建的,但需要做下调整:
docker tag quarkus/quarkus-getting-started:distroless dev.local/quarkus/quarkus-getting-started:distroless
docker tag spring/spring-getting-started:latest dev.local/spring/spring-getting-started:latest
注:knative 会忽略 dev.local 镜像的预加载,不会在创建 knative service 的时候拉取。
然后使用 minikube image load 加载到 minikube环境中:
minikube image load dev.local/quarkus/quarkus-getting-started:distroless
minikube image load dev.local/spring/spring-getting-started:latest
knative 配置(可选)
修改 istio-system namespace 下的 configmap config-domain,增加新的 domain:nip.io
注:这个操作纯属个人喜好,不喜欢那个 example.com,可跳过。
获取 Istio Ingress 地址
使用命令获取 Ingress 的访问方式,这里 http2/80 后的 http://192.168.64.2:31608 就是我们需要的,记下这个 ip 和端口。
minikube service list
|------------------|----------------------------|-------------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|------------------|----------------------------|-------------------|---------------------------|
| default | kubernetes | No node port |
| istio-system | istio-egressgateway | No node port |
| istio-system | istio-ingressgateway | status-port/15021 | http://192.168.64.2:32431 |
| | | http2/80 | http://192.168.64.2:31608 |
| | | https/443 | http://192.168.64.2:31795 |
| | | tcp/31400 | http://192.168.64.2:31369 |
| | | tls/15443 | http://192.168.64.2:30293 |
| istio-system | istiod | No node port |
| istio-system | knative-local-gateway | No node port |
| knative-eventing | broker-filter | No node port |
| knative-eventing | broker-ingress | No node port |
| knative-eventing | eventing-webhook | No node port |
| knative-eventing | imc-dispatcher | No node port |
| knative-serving | activator-service | No node port |
| knative-serving | autoscaler | No node port |
| knative-serving | autoscaler-bucket-00-of-01 | No node port |
| knative-serving | autoscaler-hpa | No node port |
| knative-serving | controller | No node port |
| knative-serving | istio-webhook | No node port |
| knative-serving | webhook | No node port |
| kube-system | kube-dns | No node port |
|------------------|----------------------------|-------------------|---------------------------|
创建 Knative service
#quarkus
apiVersion: serving.knative.dev/v1
kind: Service
metadata:name: hello-quarkusnamespace: default
spec:template:spec:containers:- image: dev.local/quarkus/quarkus-getting-started:distrolessimagePullPolicy: Never
---
#spring
apiVersion: serving.knative.dev/v1
kind: Service
metadata:name: hello-springnamespace: default
spec:template:spec:containers:- image: dev.local/spring/spring-getting-started:latestimagePullPolicy: Never
通过 cli kn 命令查看下 service 的信息:
kn service describe hello-quarkus -n default
Name: hello-quarkus
Namespace: default
Age: 21s
URL: http://hello-quarkus.default.nip.io
Revisions:100% @latest (hello-quarkus-00001) [1] (21s)Image: dev.local/quarkus/quarkus-getting-started:distroless
Conditions:OK TYPE AGE REASON++ Ready 9s++ ConfigurationsReady 10s++ RoutesReady 9s
kn service describe hello-spring -n default
Name: hello-spring
Namespace: default
Age: 44s
URL: http://hello-spring.default.nip.io
Revisions:100% @latest (hello-spring-00001) [1] (44s)Image: dev.local/spring/spring-getting-started:latest
Conditions:OK TYPE AGE REASON++ Ready 31s++ ConfigurationsReady 32s++ RoutesReady 31s
从描述信息中可以拿到服务的访问地址,分别是 http://hello-quarkus.default.nip.io 和 http://hello-spring.default.nip.io。
接下来就需要在本地主机的 hosts 中加入解析:
192.168.64.2 hello-quarkus.default.nip.io
192.168.64.2 hello-spring.default.nip.io
测试
上面操作完之后,就可以使用下面的地址访问服务了。
http://hello-quarkus.default.nip.io:31608/hello/greeting/quarkus http://hello-spring.default.nip.io:31608/hello/greeting/spring
在测试的过程中,可以通过 watch -n 1 'kubectl get po -n default | grep hello' 命令来查看 pod 的创建和销毁。
☞95后大学生利用漏洞免费吃肯德基获刑;Linux内核初步支持苹果M1;Android Studio 4.2 发布|极客头条☞从“玩具”到“工具”,低代码能否完全替换纯代码?☞运行 Java、Python、Go 等 25 种代码后,发现性能最强的竟然是它!
谁说 Java 不能用来跑 Serverless?相关推荐
- 天天酷跑php源码_使用Java实现天天酷跑(附源码)
首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的 ...
- Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存
前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...
- 用Java实现天天酷跑(附源码),这个真的有点强了!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:MyHuey https://blog.csdn.n ...
- 用Java实现天天酷跑(附源码),只能用牛逼来形容了!
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:M ...
- element 密码输入框用*显示_用 Java 实现天天酷跑,这个真的有点强了
一.登录界面 界面功能需求图如下: 接下来我们再做一些准备工作:导入相关图片素材. 将天天酷跑的图片(Image)资源解压到桌面后,(Image文件如下图所示:) 复制到Eclipse中,单击src, ...
- 天天酷跑电脑版代码C语言,Java实现天天酷跑小游戏完整代码(附源码).pdf
Java实实现现天天天天酷酷跑跑小小游游戏戏完完整整代代码码(附附源源码码) 首首先先,,写写一一个个需需求求文文档档:: 一.项目名称: <天天酷跑> (RunDay ) 二.功能介绍: ...
- java实现天天酷跑开发_Java项目实战之天天酷跑
作者:MyHuey 来源:blog.csdn.net/qq_45909299 首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍:闯关类游戏,玩家登录后,选择 ...
- 用 Java 实现天天酷跑(附源码),这个真的有点强了!
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...
- 上班摸鱼,用Java实现天天酷跑!
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 blog.csdn.net/qq_45909299 推荐:https://www ...
最新文章
- python读取文件某一行-python和shell读取文件某一行
- numpy.absolute详解
- 第十一章 图形视图、动画、状态机框架
- uitableView group模式下的间距问题
- Python3 Tkinter 之 (1) 主窗口框架
- matlab中的ftell函数,Matlab之文件操作函数fclose | ferror | fopen | frewind | fseek | ftell函数...
- talib 安装与使用
- 手写minist的DataLoader
- Java面试之爱立信
- 小白的理财之道:赚钱人生第一桶金
- 数据可视化Error:matplotlib is required for plotting when the default backend “matplotlib“ is selected
- Pandoc 安装与使用
- linux kvm切换器,PS2系列KVM切换器
- 计算机读光盘出现乱码,解决刻录音乐光盘mp3出现中文乱码的方法
- 微服务选择Spring Cloud还是Dubbo?
- 如何查找视频文件 android,如何扫描出android手机中所有的视频文件
- 检测ip和port是否可连接
- 登录页面渗透测试思路总结
- Helios Ethereum Client for Wallets and Dapp
- [***Model mj_objectArrayWithKeyValuesArray:]: unrecognized selector sent to class 0x10ace5df0
热门文章
- 面试北京XX数通总结
- extract()和extact_first()的区别
- POJ 3352 无向图边双连通分量,缩点,无重边
- 利用pagespeed插件优化网站css层叠样式文件
- Hive从一个表向另一个表插入数据的注意事项
- [vscode] 禁止 pylance 插件自动添加 import
- 在矩池云中如何使用TensorBoard?
- 汉语语法分析的重点是_语法特定句式 |现代汉语专题研讨(15)
- server接收dtu透传代码_Swoole学习笔记二:初探server与client(Client同步)
- 网站爬取工具_Python项目:结合Django和爬虫开发小说网站,免安装,无广告