You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/12/02 12:53:21 UTC
[shardingsphere] branch master updated: Fixes documentation for building GraalVM Native Image (#21341)
This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new b097f4db96b Fixes documentation for building GraalVM Native Image (#21341)
b097f4db96b is described below
commit b097f4db96b0fb65d80df086807a742a2f17b9c5
Author: Ling Hengqian <li...@outlook.com>
AuthorDate: Fri Dec 2 20:53:14 2022 +0800
Fixes documentation for building GraalVM Native Image (#21341)
---
.../startup/graalvm-native-image.cn.md | 87 +++++++++++++++-----
.../startup/graalvm-native-image.en.md | 92 ++++++++++++++++++----
2 files changed, 144 insertions(+), 35 deletions(-)
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
index f5446d1e9ac..8e523158383 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
@@ -11,7 +11,20 @@ weight = 2
## 注意事项
- ShardingSphere Proxy 尚未准备好与 GraalVM Native Image 集成。
- 其在 https://github.com/apache/shardingsphere/actions/ 存在每日构建的任务用于测试构建。
+ 其在 https://github.com/apache/shardingsphere/pkgs/container/shardingsphere-proxy-native 存在每夜构建。
+ 假设存在包含`server.yaml` 的 `conf` 文件夹为 `./custom/conf`,你可通过如下的 `docker-compose.yml` 文件进行测试。
+
+```yaml
+version: "3.8"
+
+services:
+ apache-shardingsphere-proxy-native:
+ image: ghcr.io/apache/shardingsphere-proxy-native:latest
+ volumes:
+ - ./custom/conf:/conf
+ ports:
+ - "3307:3307"
+```
- 若你发现构建过程存在缺失的 GraalVM Reachability Metadata,
应当在 https://github.com/oracle/graalvm-reachability-metadata 打开新的 issue ,
@@ -21,8 +34,8 @@ weight = 2
需要等待 Junit 5 Platform 的集成,你总是需要在构建 GraalVM Native Image 的过程中,
加上特定于 `GraalVM Native Build Tools` 的 `-DskipNativeTests` 或 `-DskipTests` 参数跳过 Native Image 中的单元测试。
-- 本节假定处于 Linux(amd64,aarch64), MacOS( amd64 )或 Windows(amd64)环境。
- 如果你位于 MacOS(aarch64/M1) 环境, 你需要关注尚未关闭的 https://github.com/oracle/graal/issues/2666 。
+- 本节假定处于 Linux(amd64,aarch64), MacOS(amd64)或 Windows(amd64)环境。
+ 如果你位于 MacOS(aarch64/M1) 环境,你需要关注尚未关闭的 https://github.com/oracle/graal/issues/2666。
## 前提条件
@@ -49,21 +62,21 @@ weight = 2
- 在 Git Source 同级目录下执行如下命令, 直接完成 Native Image 的构建。
```bash
-./mvnw -am -pl shardingsphere-distribution/shardingsphere-proxy-native-distribution -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
+./mvnw -am -pl distribution/proxy-native -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
```
- 情形二:需要使用存在 SPI 实现的 JAR 或 GPL V2 等 LICENSE 的第三方依赖的 JAR。
-- 在 `shardingsphere-distribution/shardingsphere-proxy-native-distribution/pom.xml` 的 `dependencies` 加入存在 SPI 实现的 JAR
+- 在 `distribution/proxy-native/pom.xml` 的 `dependencies` 加入存在 SPI 实现的 JAR
或第三方依赖的 JAR。示例如下
```xml
<dependencies>
<dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.30</version>
+ <groupId>com.mysql</groupId>
+ <artifactId>mysql-connector-j</artifactId>
+ <version>8.0.31</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
@@ -76,7 +89,7 @@ weight = 2
- 通过命令行构建 GraalVM Native Image。
```bash
-./mvnw -am -pl shardingsphere-distribution/shardingsphere-proxy-native-distribution -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
+./mvnw -am -pl distribution/proxy-native -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
```
3. 通过命令行启动 Native Image, 需要带上两个参数,
@@ -84,13 +97,13 @@ weight = 2
假设已存在文件夹`./custom/conf`,示例为
```bash
-./apache-shardingsphere-proxy 3307 ./custom/conf
+./apache-shardingsphere-proxy-native 3307 ./custom/conf
```
4. 如果需要构建 Docker Image, 在添加后存在 SPI 实现的依赖或第三方依赖后, 在命令行执行如下命令。
```shell
-./mvnw -am -pl shardingsphere-distribution/shardingsphere-proxy-native-distribution -B -Pnative,docker.native -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
+./mvnw -am -pl distribution/proxy-native -B -Pnative,docker.native -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
```
- 假设存在包含`server.yaml` 的 `conf` 文件夹为 `./custom/conf`,可通过如下的 `docker-compose.yml` 文件启动 GraalVM Native
@@ -108,11 +121,49 @@ services:
- "3307:3307"
```
-- 如果您使用默认构建配置, 你当然可以为 `shardingsphere-distribution/shardingsphere-proxy-native-distribution/Dockerfile`
- 使用 `scratch` 作为 base docker image。
- 但如果您主动为`pom.xml`的`native profile`添加`jvmArgs`为`-H:+StaticExecutableWithDynamicLibC`,
- 以静态链接除 `glic` 之外的所有内容,您应该切换 base image 到 `busybox:glic`。
- 参考 https://www.graalvm.org/22.2/reference-manual/native-image/guides/build-static-executables/ 。
- 另请注意,某些第三方依赖将需要更多系统库,例如 `libdl`。
- 因此请确保根据您的使用情况调整 base docker image 和`shardingsphere-distribution/shardingsphere-proxy-native-distribution`
+- 如果你不对 Git Source 做任何更改, 上文提及的命令将使用 `oraclelinux:9-slim` 作为 Base Docker Image。
+ 但如果你希望使用 `busybox:glic`,`gcr.io/distroless/base` 或 `scratch` 等更小体积的 Docker Image 作为 Base Docker
+ Image,你需要根据 https://www.graalvm.org/22.2/reference-manual/native-image/guides/build-static-executables/ 的要求,
+ 做为 `pom.xml`的 `native profile` 添加 `-H:+StaticExecutableWithDynamicLibC` 的 `jvmArgs` 等操作。
+ 另请注意,某些第三方依赖将需要在 `Dockerfile` 安装更多系统库,例如 `libdl`。
+ 因此请确保根据你的使用情况调整 `distribution/proxy-native`
下的 `pom.xml` 和 `Dockerfile` 的内容。
+
+# 可观察性
+
+- 针对 GraalVM Native Image 形态的 ShardingSphere
+ Proxy,其提供的可观察性的能力与 https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/observability/
+ 并不一致。
+
+- 你可以使用 https://www.graalvm.org/22.2/tools/ 提供的一系列命令行工具或可视化工具观察 GraalVM Native Image
+ 的内部行为,并根据其要求使用 VSCode 完成调试工作。
+ 如果你正在使用 IntelliJ IDEA 并且希望调试生成的 GraalVM Native Image,
+ 你可以关注 https://blog.jetbrains.com/idea/2022/06/intellij-idea-2022-2-eap-5/#Experimental_GraalVM_Native_Debugger_for_Java
+ 及其后继。
+
+- 对于使用 `ShardingSphere Agent` 等 APM Java Agent 的情形,
+ GraalVM 的 `native-image` 组件尚未完全支持在构建 Native Image 时使用
+ javaagent,你需要关注尚未关闭的 https://github.com/oracle/graal/issues/1065。
+
+- 以下部分采用 `Apache SkyWalking Java Agent` 作为示例,可用于跟踪 GraalVM 社区的对应 issue。
+
+1. 下载 https://dlcdn.apache.org/skywalking/java-agent/8.12.0/apache-skywalking-java-agent-8.12.0.tgz ,
+ 并解压到 ShardingSphere Git Source 的 `distribution/proxy-native`。
+
+2. 修改 `distribution/proxy-native/pom.xml` 的 `native profile`,
+ 为 `org.graalvm.buildtools:native-maven-plugin` 的 `configuration` 添加如下的 `jvmArgs`。
+
+```xml
+
+<jvmArgs>
+ <arg>-Dskywalking.agent.service_name="your service name"</arg>
+ <arg>-Dskywalking.collector.backend_service="your skywalking oap ip and port"</arg>
+ <arg>-javaagent:./skywalking-agent/skywalking-agent.jar</arg>
+</jvmArgs>
+```
+
+3. 通过命令行构建 GraalVM Native Image。
+
+```bash
+./mvnw -am -pl distribution/proxy-native -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
+```
\ No newline at end of file
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
index b253007729b..bf482eeb6f4 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
@@ -11,7 +11,22 @@ corresponding `Docker Image` through the `native-image` component of `GraalVM`.
## Notice
- ShardingSphere Proxy is not yet ready to integrate with GraalVM Native Image.
- It has daily build tasks at https://github.com/apache/shardingsphere/actions/ for testing builds.
+ Fixes documentation for building GraalVM Native Image It exists nightly builds
+ at https://github.com/apache/shardingsphere/pkgs/container/shardingsphere-proxy-native.
+ Assuming there is a `conf` folder containing `server.yaml` as `./custom/conf`, you can test it with the
+ following `docker-compose.yml` file.
+
+````yaml
+version: "3.8"
+
+services:
+ apache-shardingsphere-proxy-native:
+ image: ghcr.io/apache/shardingsphere-proxy-native:latest
+ volumes:
+ - ./custom/conf:/conf
+ ports:
+ - "3307:3307"
+````
- If you find that the build process has missing GraalVM Reachability Metadata,
A new issue should be opened at https://github.com/oracle/graalvm-reachability-metadata,
@@ -53,22 +68,22 @@ corresponding `Docker Image` through the `native-image` component of `GraalVM`.
Image.
```bash
-./mvnw -am -pl shardingsphere-distribution/shardingsphere-proxy-native-distribution -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
+./mvnw -am -pl distribution/proxy-native -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
```
- Scenario 2: It is necessary to use a JAR that has an SPI implementation or a third-party dependent JAR of a LICENSE
such as GPL V2.
- Add SPI implementation JARs or third-party dependent JARs to `dependencies`
- in `shardingsphere-distribution/shardingsphere-proxy-native-distribution/pom.xml`. Examples are as follows
+ in `distribution/proxy-native/pom.xml`. Examples are as follows
```xml
<dependencies>
<dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.30</version>
+ <groupId>com.mysql</groupId>
+ <artifactId>mysql-connector-j</artifactId>
+ <version>8.0.31</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
@@ -81,7 +96,7 @@ corresponding `Docker Image` through the `native-image` component of `GraalVM`.
- Build GraalVM Native Image via command line.
```bash
-./mvnw -am -pl shardingsphere-distribution/shardingsphere-proxy-native-distribution -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
+./mvnw -am -pl distribution/proxy-native -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip=true clean package
```
3. Start Native Image through the command line, you need to bring two parameters,
@@ -90,14 +105,14 @@ corresponding `Docker Image` through the `native-image` component of `GraalVM`.
Assuming the folder `./custom/conf` already exists, the example is
```bash
-./apache-shardingsphere-proxy 3307 ./custom/conf
+./apache-shardingsphere-proxy-native 3307 ./custom/conf
````
4. If you need to build a Docker Image, after adding the dependencies of the SPI implementation or third-party
dependencies, execute the following commands on the command line.
```shell
-./mvnw -am -pl shardingsphere-distribution/shardingsphere-proxy-native-distribution -B -Pnative,docker.native -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat .skip=true clean package
+./mvnw -am -pl distribution/proxy-native -B -Pnative,docker.native -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat .skip=true clean package
```
- Assuming that there is a `conf` folder containing `server.yaml` as `./custom/conf`, you can start the Docker Image
@@ -115,11 +130,54 @@ services:
- "3307:3307"
```
-- If you use the default build configuration, you can of course use `scratch` as the base docker image
- for `shardingsphere-distribution/shardingsphere-proxy-native-distribution/Dockerfile`.
- But if you actively add `jvmArgs` to `-H:+StaticExecutableWithDynamicLibC` for the `native profile` of `pom.xml`,
- To statically link everything except `glic`, you should switch the base image to `busybox:glic`. Refer
- to https://www.graalvm.org/22.2/reference-manual/native-image/guides/build-static-executables/.
- Also note that some third-party dependencies will require more system libraries, such as `libdl`.
- So make sure to adjust the base docker image and the content of `pom.xml` and `Dockerfile`
- under `shardingsphere-distribution/shardingsphere-proxy-native-distribution` according to your usage.
+- If you don't make any changes to the Git Source, the commands mentioned above will use `oraclelinux:9-slim` as the
+ Base Docker Image.
+ But if you want to use a smaller Docker Image like `busybox:glic`, `gcr.io/distroless/base` or `scratch` as the Base
+ Docker Image, you need according
+ to https://www.graalvm.org/22.2/reference-manual/native-image/guides/build-static-executables/,
+ Add operations such as `-H:+StaticExecutableWithDynamicLibC` to `jvmArgs` as the `native profile` of `pom.xml`.
+ Also note that some 3rd party dependencies will require more system libraries such as `libdl` to be installed in
+ the `Dockerfile`.
+ So make sure to tune `distribution/proxy-native` according to your usage
+ `pom.xml` and `Dockerfile` below.
+
+# Observability
+
+- ShardingSphere for GraalVM Native Image form Proxy, which provides observability capabilities
+ with https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/observability/
+ Not consistent.
+
+- You can observe GraalVM Native Image using a series of command line tools or visualization tools available
+ at https://www.graalvm.org/22.2/tools/, and use VSCode to debug it according to its requirements.
+ If you are using IntelliJ IDEA and want to debug the generated GraalVM Native Image,
+ You can
+ follow https://blog.jetbrains.com/idea/2022/06/intellij-idea-2022-2-eap-5/#Experimental_GraalVM_Native_Debugger_for_Java
+ and its successors.
+
+- In the case of using APM Java Agent such as `ShardingSphere Agent`,
+ GraalVM's `native-image` component is not yet fully supported when building Native Images
+ javaagent, you need to follow https://github.com/oracle/graal/issues/1065 which has not been closed.
+
+- The following sections use the `Apache SkyWalking Java Agent` as an example, which can be used to track corresponding
+ issues from the GraalVM community.
+
+1. Download https://dlcdn.apache.org/skywalking/java-agent/8.12.0/apache-skywalking-java-agent-8.12.0.tgz and `untar` it
+ to `distribution/proxy-native` in ShardingSphere Git Source.
+
+2. Modify the `native profile` of `distribution/proxy-native/pom.xml`,
+ Add the following `jvmArgs` to the `configuration` of `org.graalvm.buildtools:native-maven-plugin`.
+
+```xml
+
+<jvmArgs>
+ <arg>-Dskywalking.agent.service_name="your service name"</arg>
+ <arg>-Dskywalking.collector.backend_service="your skywalking oap ip and port"</arg>
+ <arg>-javaagent:./skywalking-agent/skywalking-agent.jar</arg>
+</jvmArgs>
+```
+
+3. Build the GraalVM Native Image from the command line.
+
+```bash
+./mvnw -am -pl distribution/proxy-native -B -Pnative -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Drat.skip =true clean package
+```
\ No newline at end of file