乐趣区

关于云计算:Quarkus谁说-Java-不能用来跑-Serverless

想到这个题目的时候,我第一工夫想到的就是星爷的《唐伯虎点秋香》的这一幕。

当探讨起世界上最好的开发语言是什么的时候,Java 的粉丝们总会遇到这种场景:

吹:“Java 语法简略,容易上手!”
黑:“Java 启动慢,性能差,耗资源!”
吹:“Java 有世界上最多的程序员!”
黑:“Java 启动慢,性能差,耗资源!”
吹:“Java 生态好!”
黑:“Java 启动慢,性能差,耗资源!”
吹:“滚!”

明天咱们持续说说 Quarkus,应“云”而生的 Java 框架。明天算是第三篇了,没看过的同学能够回顾一下:

  • Hello, Quarkus
  • 应 ” 云 ” 而生的 Java 框架 Quarkus:构建本机可执行文件

上一篇的结尾预报:试试 Quarkus 在 ArgoCD 中的利用,看下 Serverless 上的应用体验。不过不想用 ArgoCD 了,因为这 workflow 这种场景切实体现不出 Quarkus 到底有多快。但又想做 Serverless,那就想到了 Knative Serving 了。

其实,还有一个起因是比拟懒,上次的镜像还能够间接拿来用。

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
  ++ 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.iohttp://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….
http://hello-spring.default.n…

在测试的过程中,能够通过 watch -n 1 'kubectl get po -n default | grep hello' 命令来查看 pod 的创立和销毁。

文章对立公布在公众号 云原生指北

退出移动版