您的位置:首頁>正文

從零開始搭建騰訊雲上的SpringBoot容器化應用

更多騰訊海量技術文章, 請關注雲+社區:https://cloud.tencent.com/developer

作者:李想

由於最近容器技術的火熱, 各大雲計算廠商都已經提供了獨立的容器服務, 騰訊雲也不例外。 騰訊雲容器服務的官方文檔提供了一個基於Node.js的簡單案例供大家上手, 考慮到官方的文檔並沒有提供基於Java的上手教程, 再加上容器/微服務技術在Java領域的各種衍生開源元件--如SpringCloud家族的各種神器應用極其廣泛, 今天有空拿一個簡單的帶增刪改查介面功能的SpringBoot應用外接騰訊雲CDB for MySQL來把玩容器服務, 正好以此來演示如何從零開始在騰訊雲上搭建基於SpringBoot的容器化應用。

關於為啥選用SpringBoot框架, 我想原因也不必多說, 主要還是因為其本身就是一個為容器而生的框架, 自帶Tomcat伺服器而且能以極簡的配置構建web服務(相對於SpringMVC而言)。

這裡以一個提供使用者管理的微服務為例進行搭建, 為了簡化步驟僅考慮使用者資料的增刪改查功能不考慮實際業務邏輯。 微服務本身基於SpringBoot框架, 資料庫保存在騰訊雲CDB for MySQL上, 同時利用Spring的JPA作為ORM框架, 最終發佈可以對使用者資料進行增刪改查的Restful介面。

1. 創建SpringBoot 項目

IntelliJ Idea默認可以創建SpringBoot應用, 新建項目裡面選擇Spring Initializer。

創建SpringBoot項目

修改對應的名字, 我們這裡就叫UserProvider

專案配置

修改專案的組織架構如圖所示, 各部分功能如下:

Controller/UserProviderController.java: HTTP請求的監聽入口, 為了簡化程式不再寫Service層, 直接調用DAO層

DAO/UserInfoDao.java: DAO層, 直接使用JPA實現

Model/UserProviderApplication.java: entity層, 映射到資料庫, 為了簡化程式只定義了名字, 年齡, 性別幾個欄位

專案組織架構

代碼本身不再做過多的解釋,

都是最基礎的SpringBoot代碼, 大家可以從下面的位址獲取代碼。 https://github.com/xianl/UserProvider

需要提到的是application.yml檔和專案根目錄下的MAVEN設定檔pom.xml。

application.yml 中通過${userprovider_mysql} 來獲取環境變數中配置好的資料庫位址傳給jdbc, 後面會演示如何通過騰訊雲的容器服務來傳入這個參數到容器內。

server:port: 8090spring:jpa:hibernate:ddl-auto: createdatasource:url: jdbc:mysql://${userprovider_mysql}/userdbusername: springuserpassword: Test01!info:app:name: @project.artifactId@encoding: @project.build.sourceEncoding@java:source: @java.version@target: @java.version@

pom.xml 需要引入JPA和mysql的依賴包, 同時加入docker-maven-plugin用於直接打包生成docker鏡像。

org.springframework.bootspring-boot-starter-data-jpamysqlmysql-connector-javaorg.springframework.bootspring-boot-maven-plugincom.spotifydocker-maven-pluginuserproviderjava["java", "-jar", "/${project.build.finalName}.jar"]/${project.build.directory}${project.build.finalName}.jar

首先在本地進行調試, 創建userdb資料庫並賦予使用者springuser對資料庫的存取權限。 同時需要設置本地環境變數userprovider_mysql的值為127.0.0.1。

mysql> create database userdb;Query OK, 1 row affected (0.00 sec)mysql> create user 'springuser'@'%' identified by 'Test01!';Query OK, 0 rows affected (0.00 sec)mysql> grant all on userdb.* to 'springuser'@'%';Query OK, 0 rows affected (0.00 sec)

訪問本地的8090埠, 調用add介面插入一條資料, 再次通過Users介面可以獲取之前插入的資料。 表明程式本身沒有問題, 本地調試成功之後可以進行後續的操作。

本地調試

2. 生成docker鏡像並上傳到騰訊雲鏡像倉庫

在一台安裝好git+java+maven+docker的Linux主機上執行下麵的命令生成docker鏡像。

由於我們的application.yml檔需要讀取環境變數來獲取資料庫的位址, 所以我們在打包jar包和docker鏡像的時候需要指定參數-DskipTests, 否則在測試的時候會報資料庫連接的錯誤。

cd /optgit clone https://github.com/xianl/UserProvider.gitcd UserProvidermvn clean package docker:build -DskipTests

執行docker images 可以看到剛才生成的userprovider鏡像。

[root@VM_1_13_centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEuserprovider latest 53cdf5acf3a4 2 hours ago 673.6 MBdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 MB

騰訊雲的鏡像倉庫服務是包含在容器服務內而不像其他雲廠商專門列出一項服務, 使用前需要先開通。

開通鏡像服務

通之後按照慣例先login再打tag最後上傳。

[root@VM_1_13_centos UserProvider]# docker login --username=xxxxxxxxx ccr.ccs.tencentyun.comPassword:Login Succeeded[root@VM_1_13_centos UserProvider]# docker tag userprovider:latest ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1[root@VM_1_13_centos UserProvider]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEccr.ccs.tencentyun.com/mydocker/userimage 0.0.1 53cdf5acf3a4 13 minutes ago 673.6 MBuserprovider latest 53cdf5acf3a4 13 minutes ago 673.6 MBdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 MB[root@VM_1_13_centos UserProvider]# docker push ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1The push refers to a repository [ccr.ccs.tencentyun.com/mydocker/userimage]04e86a77317a: Pushed35c20f26d188: Pushedc3fe59dd9556: Pushed6ed1a81ba5b6: Pusheda3483ce177ce: Pushedce6c8756685b: Pushed30339f20ced0: Pushed0eb22bfb707d: Pusheda2ae92ffcd29: Pushed0.0.1: digest: sha256:30361f7235797976d196473374a4b16c39fe614753d1801b329be7ea55a7e6fa size: 2212

登錄管理介面也能看到剛才上傳的userimage鏡像。

鏡像列表

3. 搭建容器群集並部署服務

騰訊雲上的容器集群搭建非常之簡單,可以任意添加新建的節點甚至已有的CVM虛擬機器。具體步驟我這裡不再贅述,官方文檔上寫的都很清楚大家可以查看。

群集管理

同時我們在容器集群所在的VPC內部再建立一台Mysql資料庫,按照之前處理本地資料庫的步驟同樣創建userdb資料庫和使用者springuser,資料庫的內網位址為10.98.1.9,後面我們需要把這個位址傳進容器服務裡。

MySQL實例

對於k8s集群,一般來說我們可以使用kubectl來下發如下的yml檔來進行部署,yml檔中主要指定了鏡像的位址,埠號以及我們需要配置的環境變數等。

---apiVersion: apps/v1beta1kind: Deploymentmetadata:name: userproviderspec:replicas: 1template:metadata:labels:app: userproviderspec:containers:- name: userproviderimage: ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1ports:- containerPort: 8090env:- name: userprovider_mysqlvalue: 10.98.1.9---apiVersion: v1kind: Servicemetadata:name: userproviderspec:type: NodePortports:- nodePort: 30010port: 8090targetPort: 8090selector:app: userprovider

騰訊雲容器服務為使用者提供了更為方便的操作方法,只需在添加服務介面進行一定配置就能進行服務部署,等於是把ymal檔的配置做了視覺化,減輕了用戶的工作量。

注意一下環境變數的部分,我們這裡指定了userprovider_mysql為我們內網資料庫的位址10.98.1.9。

新建容器服務

因為我們選取了發佈服務到公網,系統會自動創建LB將公網埠8080映射到容器的服務埠8090, 查看LB詳情可以看到自動生成的功能變數名稱。

LB詳情

通過訪問綁定的功能變數名稱的8080埠,介面測試成功。

通過LB介面測試

總結

從上面的測試步驟可以看到,騰訊雲的容器服務從最大程度上做到了人性化,用戶甚至可以在完全不用登陸群集節點的情況下快速進行容器服務部署。同時騰訊雲容器服務本身就是基於k8s做服務編排並相容kubernetes標準API,又使得其通用性和易用性更強。本例提供的生成鏡像的方法還是以手動為主,在客戶的實際環境中如果結合Jenkins等CI/CD的工具就能夠進一步提高效率和自動化程度。另外本文未提及的日誌管理、監控告警功能也能為用戶提供更多的便利,使開發人員將時間更多的投入在業務邏輯本身,也使運維人員能更多的把時間投入在應用本身的異常上面。

開通鏡像服務

通之後按照慣例先login再打tag最後上傳。

[root@VM_1_13_centos UserProvider]# docker login --username=xxxxxxxxx ccr.ccs.tencentyun.comPassword:Login Succeeded[root@VM_1_13_centos UserProvider]# docker tag userprovider:latest ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1[root@VM_1_13_centos UserProvider]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEccr.ccs.tencentyun.com/mydocker/userimage 0.0.1 53cdf5acf3a4 13 minutes ago 673.6 MBuserprovider latest 53cdf5acf3a4 13 minutes ago 673.6 MBdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 MB[root@VM_1_13_centos UserProvider]# docker push ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1The push refers to a repository [ccr.ccs.tencentyun.com/mydocker/userimage]04e86a77317a: Pushed35c20f26d188: Pushedc3fe59dd9556: Pushed6ed1a81ba5b6: Pusheda3483ce177ce: Pushedce6c8756685b: Pushed30339f20ced0: Pushed0eb22bfb707d: Pusheda2ae92ffcd29: Pushed0.0.1: digest: sha256:30361f7235797976d196473374a4b16c39fe614753d1801b329be7ea55a7e6fa size: 2212

登錄管理介面也能看到剛才上傳的userimage鏡像。

鏡像列表

3. 搭建容器群集並部署服務

騰訊雲上的容器集群搭建非常之簡單,可以任意添加新建的節點甚至已有的CVM虛擬機器。具體步驟我這裡不再贅述,官方文檔上寫的都很清楚大家可以查看。

群集管理

同時我們在容器集群所在的VPC內部再建立一台Mysql資料庫,按照之前處理本地資料庫的步驟同樣創建userdb資料庫和使用者springuser,資料庫的內網位址為10.98.1.9,後面我們需要把這個位址傳進容器服務裡。

MySQL實例

對於k8s集群,一般來說我們可以使用kubectl來下發如下的yml檔來進行部署,yml檔中主要指定了鏡像的位址,埠號以及我們需要配置的環境變數等。

---apiVersion: apps/v1beta1kind: Deploymentmetadata:name: userproviderspec:replicas: 1template:metadata:labels:app: userproviderspec:containers:- name: userproviderimage: ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1ports:- containerPort: 8090env:- name: userprovider_mysqlvalue: 10.98.1.9---apiVersion: v1kind: Servicemetadata:name: userproviderspec:type: NodePortports:- nodePort: 30010port: 8090targetPort: 8090selector:app: userprovider

騰訊雲容器服務為使用者提供了更為方便的操作方法,只需在添加服務介面進行一定配置就能進行服務部署,等於是把ymal檔的配置做了視覺化,減輕了用戶的工作量。

注意一下環境變數的部分,我們這裡指定了userprovider_mysql為我們內網資料庫的位址10.98.1.9。

新建容器服務

因為我們選取了發佈服務到公網,系統會自動創建LB將公網埠8080映射到容器的服務埠8090, 查看LB詳情可以看到自動生成的功能變數名稱。

LB詳情

通過訪問綁定的功能變數名稱的8080埠,介面測試成功。

通過LB介面測試

總結

從上面的測試步驟可以看到,騰訊雲的容器服務從最大程度上做到了人性化,用戶甚至可以在完全不用登陸群集節點的情況下快速進行容器服務部署。同時騰訊雲容器服務本身就是基於k8s做服務編排並相容kubernetes標準API,又使得其通用性和易用性更強。本例提供的生成鏡像的方法還是以手動為主,在客戶的實際環境中如果結合Jenkins等CI/CD的工具就能夠進一步提高效率和自動化程度。另外本文未提及的日誌管理、監控告警功能也能為用戶提供更多的便利,使開發人員將時間更多的投入在業務邏輯本身,也使運維人員能更多的把時間投入在應用本身的異常上面。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示