https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
[root@node1 template]# tree java11
java11
├── build.gradle
├── Dockerfile
├── function
│ ├── build.gradle
│ ├── gradle
│ │ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
│ ├── gradlew
│ ├── gradlew.bat
│ ├── settings.gradle
│ └── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── openfaas
│ │ └── function
│ │ └── Handler.java
│ └── test
│ └── java
│ └── HandlerTest.java
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── README.md
├── settings.gradle
└── template.yml
# 使用multi-stage builds特性,将整个镜像构建分为多个阶段
# 名为builder的镜像里面会生成java代码编译构建出来的结果
FROM openjdk:11-jdk-slim as builder
ENV GRADLE_VER=6.1.1
# 应用更新,并且安装后面要用到的应用
RUN apt-get update -qqy && apt-get install -qqy --no-install-recommends curl ca-certificates unzip
# 下载指定版本的gradle,并解压,再删除压缩包(避免镜像体积变大)
RUN mkdir -p /opt/ && cd /opt/ && echo "Downloading gradle.." && curl -sSfL "https://services.gradle.org/distributions/gradle-${GRADLE_VER}-bin.zip" -o gradle-$GRADLE_VER-bin.zip && unzip gradle-$GRADLE_VER-bin.zip -d /opt/ && rm gradle-$GRADLE_VER-bin.zip
# Export some environment variables
ENV GRADLE_HOME=/opt/gradle-$GRADLE_VER/
ENV PATH=$PATH:$GRADLE_HOME/bin
RUN mkdir -p /home/app/libs
ENV GRADLE_OPTS="-Dorg.gradle.daemon=false"
WORKDIR /home/app
# 把编译构建涉及的所有内容都复制到镜像的/home/app/目录,
# 包括配置文件、java源码等
COPY . /home/app/
# 开始编译构建
RUN gradle build
# 打印文件列表
RUN find .
# 名为watchdog的镜像,注意基础镜像是openfaas/of-watchdog
FROM openfaas/of-watchdog:0.7.6 as watchdog
# 这个ship才是最终的镜像,前面的builder和watchdog都是为ship准备内容的
# 为了控制体积,ship里面是jre,而非jdk
FROM openjdk:11-jre-slim as ship
RUN apt-get update -qqy && apt-get install -qqy --no-install-recommends unzip
# 为了安全起见不使用root帐号,这里增加名为app的群组和用户
RUN addgroup --system app && adduser --system --ingroup app app
# 从watchdog镜像获取可执行文件fwatchdog
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
# 增加可执行权限
RUN chmod +x /usr/bin/fwatchdog
# 设置执行命令的目录
WORKDIR /home/app
# 从builder获取整个gradle项目的构建结果
COPY --from=builder /home/app/function/build/distributions/function-1.0.zip ./function-1.0.zip
# 执行运行容器进程的帐号是app
user app
# 解压构建结果
RUN unzip ./function-1.0.zip
WORKDIR /home/app/
# of-watchdog转发的地址,也就是微服务监听的地址
ENV upstream_url="http://127.0.0.1:8082"
# of-watchdog的模式
ENV mode="http"
# 微服务是java应用,要用到这个classpath
ENV CLASSPATH="/home/app/function-1.0/function-1.0.jar:/home/app/function-1.0/lib/*"
# 启动微服务的命令
ENV fprocess="java -XX:+UseContainerSupport com.openfaas.entrypoint.App"
# 对外暴露的端口,of-watchdog监听的
EXPOSE 8080
# 监控检查
HEALTHCHECK --interval=5s CMD [ -e /tmp/.lock ] || exit 1
# 容器启动时执行的命令,既启动of-watchdog
CMD ["fwatchdog"]
java -XX:+UseContainerSupport com.openfaas.entrypoint.App
public static void main(String[] args) throws Exception {
// 监听8082端口,和Dockerfile中of-watchdog转发请求的端口保持一致
int port = 8082;
// handler是真正处理请求的实例
HandlerProvider p = HandlerProvider.getInstance();
IHandler handler = p.getHandler();
// 配置监听对象,并将handler绑定过来
HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
InvokeHandler invokeHandler = new InvokeHandler(handler);
// 设置path,开始监听
server.createContext("/", invokeHandler);
server.setExecutor(null); // creates a default executor
server.start();
}
// 把request内容封装到IRequest实例中
IRequest req = new Request(requestBody, reqHeadersMap,t.getRequestURI().getRawQuery(), t.getRequestURI().getPath());
// 执行业务逻辑处理请求
IResponse res = this.handler.Handle(req);
// 得到处理后的结果
String response = res.getBody();
...
最后做个小结,将前面展开的思路收敛起来,如下图:
看到这里,对于java11模板的内部实现及其执行原理,相信在您眼里应该没有什么秘密了,为了制作更好用的java模板,咱们已经做了充分准备,接下来的文章,请随欣宸一起实战自定义java模板;
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
原文:https://www.cnblogs.com/bolingcavalry/p/15106846.html