https://github.com/zq2599/blog_demosjava
內容:全部原創文章分類彙總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;node
[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(); ...
最後作個小結,將前面展開的思路收斂起來,以下圖:git
看到這裏,對於java11模板的內部實現及其執行原理,相信在您眼裏應該沒有什麼祕密了,爲了製做更好用的java模板,我們已經作了充分準備,接下來的文章,請隨欣宸一塊兒實戰自定義java模板;程序員
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos