谁说 Java 不能用来跑 Serverless?

谁说 Java 不能用来跑 Serverless?
2021年05月12日 19:19 CSDN

作者 | 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-quarkus

namespace:default

spec:

template:

spec:

containers:

- image: dev.local/quarkus/quarkus-getting-started:distroless

imagePullPolicy:Never

---

#spring

apiVersion: serving.knative.dev/v1

kind:Service

metadata:

name: hello-spring

namespace:default

spec:

template:

spec:

containers:

- image: dev.local/spring/spring-getting-started:latest

imagePullPolicy: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

++Ready9s

++ConfigurationsReady10s

++RoutesReady9s

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

++Ready31s

++ConfigurationsReady32s

++RoutesReady31s

从描述信息中可以拿到服务的访问地址,分别是 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 的创建和销毁。

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部