1. 程式人生 > >從零開始搭建騰訊雲上的 SpringBoot 容器化應用

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

歡迎大家前往雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

作者:李想

由於最近容器技術的火熱,各大雲端計算廠商都已經提供了獨立的容器服務,騰訊雲也不例外。騰訊雲容器服務的官方文件提供了一個基於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層,對映到資料庫,為了簡化程式只定義了名字,年齡,性別幾個欄位
專案組織架構

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

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

server:
  port: 8090
spring:
  jpa:
    hibernate:
      ddl-auto: create
  datasource:
    url: jdbc:mysql://${userprovider_mysql}/userdb
    username: springuser
    password: Test01!
info:
  app:
    name: @[email protected]
    encoding: @[email protected]
    java:
      source: @[email protected]
      target: @[email protected]

pom.xml 需要引入JPAmysql的依賴包,同時加入docker-maven-plugin用於直接打包生成docker映象。

    <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>

			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<configuration>
					<imageName>userprovider</imageName>
					<baseImage>java</baseImage>
					<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
					<resources>
						<resource>
							<targetPath>/</targetPath>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
			</plugin>

		</plugins>
	</build>

首先在本地進行除錯,建立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 /opt
git clone https://github.com/xianl/UserProvider.git
cd UserProvider
mvn clean package docker:build -DskipTests

執行docker images 可以看到剛才生成的userprovider映象。

[[email protected]_1_13_centos ~]# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
userprovider                                latest              53cdf5acf3a4        2 hours ago         673.6 MB
docker.io/java                              latest              d23bdf5b1b1b        11 months ago       643.1 MB

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

開通映象服務

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

	[[email protected]_1_13_centos UserProvider]# docker login --username=xxxxxxxxx ccr.ccs.tencentyun.com
	Password: 
	Login Succeeded
	[[email protected]_1_13_centos UserProvider]# docker tag userprovider:latest  ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1
	[[email protected]_1_13_centos UserProvider]# docker images
	REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
	ccr.ccs.tencentyun.com/mydocker/userimage   0.0.1               53cdf5acf3a4        13 minutes ago      673.6 MB
	userprovider                                latest              53cdf5acf3a4        13 minutes ago      673.6 MB
	docker.io/java                              latest              d23bdf5b1b1b        11 months ago       643.1 MB
	[[email protected]_1_13_centos UserProvider]# docker push ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1
	The push refers to a repository [ccr.ccs.tencentyun.com/mydocker/userimage]
	04e86a77317a: Pushed 
	35c20f26d188: Pushed 
	c3fe59dd9556: Pushed 
	6ed1a81ba5b6: Pushed 
	a3483ce177ce: Pushed 
	ce6c8756685b: Pushed 
	30339f20ced0: Pushed 
	0eb22bfb707d: Pushed 
	a2ae92ffcd29: Pushed 
	0.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/v1beta1
	kind: Deployment
	metadata:
	  name: userprovider
	spec:
	  replicas: 1
	  template:
	    metadata:
	      labels:
	        app: userprovider
	    spec:
	      containers:
	      - name: userprovider
	        image: ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1
	        ports:
	        - containerPort: 8090
	        env:
	        - name: userprovider_mysql
	          value: 10.98.1.9
	---
	apiVersion: v1
	kind: Service
	metadata:
	  name: userprovider
	spec:
	  type: NodePort
	  ports:
	  - nodePort: 30010
	    port: 8090
	    targetPort: 8090
	  selector:
	    app: userprovider

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

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

新建容器服務

因為我們選取了釋出服務到公網,系統會自動建立LB將公網埠8080對映到容器的服務埠8090, 檢視LB詳情可以看到自動生成的域名。

LB詳情

通過訪問繫結的域名的8080埠,介面測試成功。

通過LB介面測試
總結

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

相關閱讀

此文已由作者授權雲+社群釋出,轉載請註明原文出處

相關推薦

開始搭建SpringBoot 容器應用

歡迎大家前往雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 作者:李想 由於最近容器技術的火熱,各大雲端計算廠商都已經提供了獨立的容器服務,騰訊雲也不例外。騰訊雲容器服務的官方文件提供了一個基於Node.js的簡單案例供大家上手,考慮到官方的文件並沒有提供基於Java的

開始搭建伺服器

本篇博文旨在將近期搭建雲伺服器的步驟記錄下來。 1、定義 雲伺服器是一種簡單高效、安全可靠、處理能力可彈性伸縮的計算服務。其管理方式比物理伺服器更簡單高效。使用者無需提前購買硬體,即可迅速建立或釋放任意多臺雲伺服器。雲伺服器幫助您快速構建更穩定、

開始搭建伺服器 (一)

本篇博文旨在將近期搭建雲伺服器的步驟記錄下來。 1、定義 雲伺服器是一種簡單高效、安全可靠、處理能力可彈性伸縮的計算服務。其管理方式比物理伺服器更簡單高效。使用者無需提前購買硬體,即可迅速建立或釋放任意多臺雲伺服器。雲伺服器幫助您快速構建更穩定、安全的應用,降低開發運

0開始服務器搭建python3+flask+uwsgi+nginx服務器

我們 mac make ssl 騰訊雲 sgi 配置文件 wsgi div 以ssh方式連接騰訊雲,以mac為例 一、安裝Python3、flask、uwsgi和nginx (一)安裝基礎包 1、因為缺少gcc,沒法make,所以安裝gcc yum -y install

centos7.0 開始搭建Java Web網站

本文的目的是記錄自己個人網站的搭建過程,同時達到知識共享的目的。其實自己動手做的時候會遇到很多問題,也是通過網站查詢資料來一步一步的完成自己的搭建工作的,重要的是自己能夠堅持的做下去,希望能夠在自

教務網爬蟲程序到的運行

pytho 創建 輸入 ubunt 雲服務 test CP user ann 從教務網爬蟲程序到騰訊雲上的運行 主要內容有以下幾方面: pip3以及相關python包的安裝 mysql數據庫的連接以及相關操作 騰訊雲服務器的設置與連接,文件傳輸等操作 pip3以及相關p

基礎利用伺服器搭建網站

騰訊雲地址:https://cloud.tencent.com/?fromSource=gwzcw.234976.234976.234976 大學生優惠地址:https://cloud.tencent.com/act/campus?utm_source=qcloud&utm_medium

開始搭建物聯網平臺(4):訂閱系統主題獲取裝置下線訊息

$SYS-系統主題 先來看一段EMQ對於系統主題的介紹:EMQ 訊息伺服器週期性釋出自身執行狀態、MQTT 協議統計、客戶端上下線狀態到 $SYS/ 開頭系統主題。$SYS 主題路徑以 “$SYS/brokers/{node}/” 開頭,’${node}’ 是 Erlang

開始 利用hexo在github快速搭建個人部落格

利用hexo在github上快速搭建個人部落格方案選型主流的三種部落格搭建方案:1. Git+Github+Markdown+jekyll (免費) 2. Git+Github+Markdown+hexo (免費) 3. 虛擬主機+外掛+Wordpress (付費)123我的選擇: Git+Github+Ma

搭建Ubuntu伺服器

首先在騰訊雲上重灌系統並且設定好密碼登入安裝apache2sudo apt-get install apache2安裝phpsudo apt-get install php連線apache2與phpsu

開始搭建阿里伺服器

1.註冊阿里雲賬號 阿里雲註冊 2.認證個人資訊 點選左上角你的使用者名稱進入賬號管理->安全設定,認證完成後可進入雲伺服器ECS幫助文件,根據幫助文件的內容建立雲伺服器,得到IP地址和

開始搭建個人網站(6)nginx+uWSGI部署Django專案(

  Django雖然自帶一個Server,但只能作為開發時測試使用,我們需要一個可以穩定而持續的伺服器對網站進行部署,比如Apache, Nginx, lighttpd等,本篇將利用nginx和uWSGI部署Django網站專案。 前言 n

Django+vue在搭建前後端分離項目

.gz attr 名稱 info 路由 run 天前 配置 靜態    最近打算用Django+vue搭建一個個人主站,在此記錄一下搭建項目的整個過程。 一 開發環境:   騰訊雲Centos 7   Python 3.7  

Java進階專題(二十二) 開始搭建一個微服務架構系統 ()

# 前言 "微服務”一詞源於 Martin Fowler的名為 Microservices的,博文,可以在他的官方部落格上找到http:/ /martinfowler . com/articles/microservices.html簡單地說,微服務是系統架構上的一種設計風格,它的主旨是將一個原本獨立的系統

開始搭建android框架系列(轉)

bsp andro hup 開始 blank class and lan com 網址:從零開始搭建android框架系列 githup:https://github.com/CameloeAnthony/Ant從零開始搭建android框架系列(轉)

開始搭建框架SSM+Redis+Mysql(二)之MAVEN項目搭建

blog 目的 定位 enc style log onf project 集成 從零開始搭建框架SSM+Redis+Mysql(二)之MAVEN項目搭建 廢話不說,直接擼步驟!!! 1.創建主項目:ncc-parent 選擇maven創建項目,註意在創建項目中,packi

開始搭建VUE項目

vue-cli ffffff -s 內容 nbsp 部分 腳本 ssr 項目配置 前言: 此樣板面向大型,嚴肅的項目,並假定您對Webpack和vue-loader有些熟悉。 請務必閱讀vue-loader的常見工作流配方的文檔。 如果您只想嘗試vue-load

開始搭建ELK+GPE監控預警系統

elasticsearch logstash kibana redis grafana prometheus exporter consul前言本文可能不會詳細記錄每一步實現的過程,但一定程度上可以引領小夥伴走向更開闊的視野,串聯每個環節,呈現予你不一樣的效果。業務規模8個平臺100+臺服務器10+個集群分

開始搭建輕量級個人XSS平臺

提示 不可 應用 編輯狀態 red rip 權限 以及 signature 一、 前言 決定搭建XSS平臺是因為自己想深入學習一下XSS相關的知識,多多進行實踐,上網搜索了一下XSS平臺有很多,但是總覺得不是很安全,這個畢竟敏感信息要傳輸到陌生人的服務器上,而且服務器端測試

開始搭建系統3.4——緩存組件開發

搭建 html OS get gpo target 開發 href 系統 從零開始搭建系統3.4——緩存組件開發從零開始搭建系統3.4——緩存組件開發