大纲
生产环境:
关于quarkus2.13.7脚手架工程配置可以直接参考上一篇文章 《quarkus 搭建与基础开发环境配置总结》
这里默认已经存在一个可以运行的my-quarkus-demo项目,并且 docker环境 kubernetes环境 都安装完成
quarkus2.13.7.Final (my-quarkus-demo)项目
1 需要java版本11
2 需要GraalVM版本为22.3.0
GraalVM下载地址: https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-22.3.0
GraalVM 选择对应的版本
native-image 注意需要和GraalVM 版本 平台一致
linux环境
创建一个空的文件夹ops 解压graalvm-ce-java11-linux-amd64-22.3.0.tar.gz
root@note4:/ops# tar -zxvf graalvm-ce-java11-linux-amd64-22.3.0.tar.gz
使用jlink 添加jre
./bin/jlink --module-path jmods --add-modules com.oracle.graal.graal_enterprise,com.oracle.svm_enterprise.ml_dataset,com.oracle.svm.svm_enterprise,com.oracle.truffle.regex,com.oracle.truffle.truffle_nfi,com.oracle.truffle.truffle_nfi_libffi,java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.management.rmi,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.security.jgss,java.security.sasl,java.se,java.smartcardio,java.sql,java.sql.rowset,java.transaction.xa,java.xml.crypto,java.xml,jdk.accessibility,jdk.attach,jdk.charsets,jdk.compiler,jdk.crypto.cryptoki,jdk.crypto.ec,jdk.dynalink,jdk.editpad,jdk.hotspot.agent,jdk.httpserver,jdk.internal.ed,jdk.internal.jvmstat,jdk.internal.le,jdk.internal.opt,jdk.internal.vm.ci,jdk.internal.vm.compiler,jdk.internal.vm.compiler.management,jdk.internal.vm.compiler.truffle.jfr,jdk.jartool,jdk.javadoc,jdk.jcmd,jdk.jconsole,jdk.jdeps,jdk.jdi,jdk.jdwp.agent,jdk.jfr,jdk.jlink,jdk.jshell,jdk.jsobject,jdk.jstatd,jdk.localedata,jdk.management.agent,jdk.management.jfr,jdk.management,jdk.naming.dns,jdk.naming.ldap,jdk.naming.rmi,jdk.net,jdk.pack,jdk.rmic,jdk.scripting.nashorn,jdk.scripting.nashorn.shell,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported.desktop,jdk.unsupported,jdk.xml.dom,jdk.zipfs,org.graalvm.js.scriptengine,org.graalvm.locator,org.graalvm.sdk,org.graalvm.truffle --output jre
vi /etc/profile添加环境变量
export JAVA_HOME=/ops/graalvm-ce-java11-22.3.0
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jresource /etc/profile
使用 gu install 命令安装native-image 注意需要在 native-image.jar 所在文件夹执行命令
gu install -L native-image-installable-svm-java11-linux-amd64-22.3.0.jar
native-image --version
GraalVM 22.3.0 Java 11 CE (Java Version 11.0.17+8-jvmci-22.3-b08)
表示安装完成
到此GraalVM环境配置完成
下载maven-3.8.7
https://archive.apache.org/dist/maven/maven-3/3.8.7/binaries/apache-maven-3.8.7-bin.tar.gz
创建/ops/repository 文件夹作为本地仓库
解压maven3.8.7 修改setting.xml
指定本地仓库
/ops/repository 配置镜像仓库huaweicloud huaweicloud maven * https://mirrors.huaweicloud.com/repository/maven/
添加环境变量
vi /etc/profile
添加环境变量
export PATH=/ops/apache-maven-3.8.7/bin:$PATHsource /etc/profile
到此maven环境配置完成
ubuntu环境GraalVM静态编译注意事项
ubuntu环境GraalVM静态编译 可参考 《Java GraalVM 环境搭建 class文件springboot项目 静态编译二进制文件 入门就看这一篇》
安装编译工具
apt-get install gcc
apt-get install zlib1g-dev
apt-get install build-essential libz-dev
缺乏相关编译工具quarkus -Pnative 编译时会出现一些如下错误
缺乏 gcc
Error: Default native-compiler executable 'gcc' not found via environment variable PATH
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1
缺乏 zlib1g-dev
1. It appears as though libz.a is missing. Please install it.
缺乏 libz-dev
1. It appears as though libstdc++.a is missing. Please install it.
linux 环境打包需要指定quarkus.native.builder-image路径
mvn package -Dquarkus.native.builder-image=/ops/graalvm-ce-java11-22.3.0/bin
也可以在application.properties写入配置
quarkus.native.builder-image=/ops/graalvm-ce-java11-22.3.0/bin
否则报错
SRCFG00011: Could not expand value platform.quarkus.native.builder-image in property quarkus.native.
使用git clone 拉取项目 my-quarkus-demo (quarkus2.13.7.Final)
编译项目 第一次会下载大量的jar
执行
mvn clean install
编译生成二进制文件
mvn clean package -Pnative -Dquarkus.native.builder-image=/ops/graalvm-ce-java11-22.3.0/bin
**编译成功 得到my-quarkus-demo-1.0.0-SNAPSHOT-runner **
运行程序 看到成功访问
创建Dockerfile 可参考项目 src/main/docker 下面的各种Dockerfile
创建一个文件夹保存数据
Dockerfile内容如下
FROM ubuntu:18.04
MAINTAINER liuyijiang
WORKDIR "/data/service"
EXPOSE 8848
COPY my-quarkus-demo-1.0.0-SNAPSHOT-runner my-quarkus-demo-1.0.0-SNAPSHOT-runner
CMD ["./my-quarkus-demo-1.0.0-SNAPSHOT-runner", "-Dquarkus.http.host=0.0.0.0"]
使用my-quarkus-demo-1.0.0-SNAPSHOT-runner 创建镜像
运行镜像 成功
将创建的my-quarkus-demo镜像推送到阿里云私库
阿里云私库配置见文章 《阿里云docker私库使用总结》
将镜像推送到私库
docker tag my-quarkus-demo registry.cn-hangzhou.aliyuncs.com/jimliu/my-quarkus-demo
docker push registry.cn-hangzhou.aliyuncs.com/jimliu/my-quarkus-demo:latest
deploy.yaml 文件内容如下
apiVersion: apps/v1
kind: Deployment
metadata:name: my-quarkus-demo
spec:replicas: 1selector:matchLabels: app: my-quarkus-demotemplate:metadata:labels:app: my-quarkus-demospec:imagePullSecrets:- name: myaliyunsecretcontainers:- name: my-quarkus-demo-runtime image: registry.cn-hangzhou.aliyuncs.com/jimliu/my-quarkus-demo:latestimagePullPolicy: Alwaysports: #定义容器端口列表- containerPort: 8848 protocol: TCP name: http ---apiVersion: v1
kind: Service
metadata:name: my-quarkus-demo-service
spec:ports:- protocol: TCPport: 18848targetPort: 8848nodePort: 28848name: httpselector:app: my-quarkus-demotype: NodePort
kubectl apply -f deploy.yaml 部署应用
集群内部访问
外部访问