[Java][Spring Cloud]DevOps

小黑-avatar-img
發佈於後端
更新 發佈閱讀 12 分鐘

這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。


環境建置


建立專案

spring:
application:
name: xxx
profiles:
active: debug
cloud:
consul:
discovery:
preferIpAddress: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}:@project.version@
healthCheckPath: /actuator/health
server:
port: xxx​


  • 在pom.xml增加Maven設定
  • 建立Spring Cloud微服務main,如下範例:
package xxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class DevopsDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DevopsDemoApplication.class, args);
}
}


打包設定

  • 於pom.xml設定打包Docker image
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定Dockerfile檔案位置-->
<dockerfile>docker/Dockerfile</dockerfile>
<repository>${docker.repository}/springcloud-action/${app.name}</repository>
<!--<tag>${project.version}</tag>-->
<buildArgs>
<!--傳遞參數給Dockerfile-->
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>


  • 建立Dockerfile
FROM openjdk:8u191-jre-alpine3.9
ENTRYPOINT ["/usr/bin/java", "-jar", "/app.jar"]
ARG JAR_FILE
ADD ${JAR_FILE} /app.jar
EXPOSE 8080


  • 於pom.xml設定存放Docker image
<properties>
<docker.repository>xxx​</docker.repository>
<app.name>devops-demo</app.name>
</properties>


部署設定

  • 在GitLab CI/CD server安裝kubectl
snap install kubectl -classic


  • 將Kubernetes Master設定檔複製到GitLab CI/CD server
scp root@網址:$HOME/.kube/config​ $HOME/.kube​


  • 建立檔案deploy.yaml,用於發佈
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: __APP_NAME__
spec:
replicas: __REPLICAS__
selector:
matchLabels:
app: __APP_NAME__
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: __APP_NAME__
spec:
imagePullSecrets:
- name: xxx
containers:
- name: __APP_NAME__
image: __IMAGE__
resources:
requests:
memory: "1000M"
limits:
memory: "1000M"
volumeMounts:
- name: time-zone
mountPath: /etc/localtime
- name: java-logs
mountPath: /opt/logs
ports:
- containerPort: __PORT__
env:
- name: SPRING_PROFILES_ACTIVE
value: __PROFILE__
- name: JAVA_OPTS
value: -Xms1G -Xmx1G -Dapp.home=/opt/
volumes:
- name: time-zone
hostPath:
path: /etc/localtime
- name: java-logs
hostPath:
path: /data/app/deployment/logs


  • 建立.gitlab-ci.yml,設定流程
#環境資訊
variables:
#Docker image倉庫地址和帳號密碼訊息
DOCKER_REPO_URL: "xxx"
DOCKER_REPO_USERNAME: admin
DOCKER_REPO_PASSWORD: admin
#Kubernetes配置
K8S_NAMESPACE: "xxx"
PORT: "xxx"

#定義CI/CD
stages:
- test
- build
- push
- deploy

#執行單元測試
maven-test:
stage: test
script:
- mvn clean test

#程式碼編譯打包image
maven-build:
stage: build
script:
- mvn clean package -DskipTests

#將打包好的Docker image上傳至私有image倉庫
docker-push:
stage: push
script:
#對打包的image進行tag
- docker tag $DOCKER_REPO_URL/$CI_PROJECT_PATH $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
#登入私有image倉庫
- docker login $DOCKER_REPO_URL -u $DOCKER_REPO_USERNAME -p $DOCKER_REPO_PASSWORD
#上傳應用程式image至image倉庫
- docker push $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
- docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
- docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH

#將應用程式發佈至Kubernetes測試叢集
deploy-test:
stage: deploy
when: manual
script:
- kubectl config use-context kubernetes-admin@kubernetes
- sed -e "s/__REPLICAS__/1/; s/__PORT__/$PORT/; s/__APP_NAME__/$CI_PROJECT_NAME/; s/__PROFILE__/test/; s/__IMAGE__/$DOCKER_REPO_URL\/${CI_PROJECT_PPf/ATH/ /\\/}\/${CI_BUILD_REF_NAME//\//\\/}:${CI_COMMIT_SHA:0:8}/" kubernetes/deploy.yaml | kubectl -n ${K8S_NAMESPACE} apply -f -


  • 部署Consul服務
docker run --name consul -p xxxx:xxxx -v /tmp/consul/conf/:/consul/conf/ -v /tmp/consul/data/:/consul/data/ -d consul


留言
avatar-img
留言分享你的想法!
avatar-img
小黑與程式的邂逅
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
2024/06/02
在高平行流量下,服務的鏈路中有某個服務無法使用,則可能出現大量網路呼叫延遲,這有可能造成資源被用盡,因此需要有「熔斷降級」的機制來保護服務。 熔斷 在服務呼叫端,需要將服務呼叫設定一個服務時間。在服務逾時或失敗時進行熔斷,並作fallback處理。 降級 在服務提供端,要根據整個服務的負
2024/06/02
在高平行流量下,服務的鏈路中有某個服務無法使用,則可能出現大量網路呼叫延遲,這有可能造成資源被用盡,因此需要有「熔斷降級」的機制來保護服務。 熔斷 在服務呼叫端,需要將服務呼叫設定一個服務時間。在服務逾時或失敗時進行熔斷,並作fallback處理。 降級 在服務提供端,要根據整個服務的負
2024/05/31
電子錢包提供獨立的餘額帳戶系統:開戶、交易明細等。 系統流程 使用者介面使用充值,電子錢包系統將會生成充值訂單,然後呼叫支付系統。 支付系統結束後,會將結果告知電子錢包系統,然後更新餘額。 系統結構 Controller:定義服務介面。 Service:處理業務邏輯並透過Dao完
2024/05/31
電子錢包提供獨立的餘額帳戶系統:開戶、交易明細等。 系統流程 使用者介面使用充值,電子錢包系統將會生成充值訂單,然後呼叫支付系統。 支付系統結束後,會將結果告知電子錢包系統,然後更新餘額。 系統結構 Controller:定義服務介面。 Service:處理業務邏輯並透過Dao完
2024/05/27
核心元件 Spring Boot:Spring Cloud的基礎框架。 Spring Cloud Starters:Spring Boot的依賴管理。 Consul:微服務系統的註冊中心。 Eureka:微服務系統的註冊中心。 Feign:簡化微服務之間的溝通方式。 Ribbon:處理程
Thumbnail
2024/05/27
核心元件 Spring Boot:Spring Cloud的基礎框架。 Spring Cloud Starters:Spring Boot的依賴管理。 Consul:微服務系統的註冊中心。 Eureka:微服務系統的註冊中心。 Feign:簡化微服務之間的溝通方式。 Ribbon:處理程
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
Thumbnail
核心元件 Spring Boot:Spring Cloud的基礎框架。 Spring Cloud Starters:Spring Boot的依賴管理。 Consul:微服務系統的註冊中心。 Eureka:微服務系統的註冊中心。 Feign:簡化微服務之間的溝通方式。 Ribbon:處理程
Thumbnail
核心元件 Spring Boot:Spring Cloud的基礎框架。 Spring Cloud Starters:Spring Boot的依賴管理。 Consul:微服務系統的註冊中心。 Eureka:微服務系統的註冊中心。 Feign:簡化微服務之間的溝通方式。 Ribbon:處理程
Thumbnail
部署Consul服務 docker run --name consul -p xxxx:xxxx -v /tmp/consul/conf/:/consul/conf/ -v /tmp/consul/data/:/consul/data/ -d consul 於pom.xml設定Spring
Thumbnail
部署Consul服務 docker run --name consul -p xxxx:xxxx -v /tmp/consul/conf/:/consul/conf/ -v /tmp/consul/data/:/consul/data/ -d consul 於pom.xml設定Spring
Thumbnail
在Spring Cloud微服務中,透過Maven與Docker,將專案打包成Docker Image,並部署。 安裝Maven apt install maven​ 安裝Docker apt install docker.io 啟動Docker service docker s
Thumbnail
在Spring Cloud微服務中,透過Maven與Docker,將專案打包成Docker Image,並部署。 安裝Maven apt install maven​ 安裝Docker apt install docker.io 啟動Docker service docker s
Thumbnail
Harbor是企業級的私有Docker Repository,提供管理使用者介面、角色存取控制等企業級特性。 安裝 更新apt sudo apt-get update 安裝https的支援工具 sudo apt-get install apt-transport-https ca-ce
Thumbnail
Harbor是企業級的私有Docker Repository,提供管理使用者介面、角色存取控制等企業級特性。 安裝 更新apt sudo apt-get update 安裝https的支援工具 sudo apt-get install apt-transport-https ca-ce
Thumbnail
Docker是由GO語言實現,是一個在GitHub上開發原始碼的專案。它的目標是實現羽量級的作業系統虛擬化。讓使用者操作Docker,就像是操作一個羽量級的虛擬機器。 優勢 快速發表和部署 高效的部署和擴充 資源使用率高 管理簡單 核心 Image映像檔 Docker
Thumbnail
Docker是由GO語言實現,是一個在GitHub上開發原始碼的專案。它的目標是實現羽量級的作業系統虛擬化。讓使用者操作Docker,就像是操作一個羽量級的虛擬機器。 優勢 快速發表和部署 高效的部署和擴充 資源使用率高 管理簡單 核心 Image映像檔 Docker
Thumbnail
前年第一次藉公司機會,參加了DevOpsDay的活動。雖然devOps一詞各自表述,大多狀況還是偏向維運會遇到的技術為主,做為平時開發、跟使用者訪談需求的工作內容來說,參加聚會如果沒有一定的知識,對講者所提到的狀況比較難有共鳴...
Thumbnail
前年第一次藉公司機會,參加了DevOpsDay的活動。雖然devOps一詞各自表述,大多狀況還是偏向維運會遇到的技術為主,做為平時開發、跟使用者訪談需求的工作內容來說,參加聚會如果沒有一定的知識,對講者所提到的狀況比較難有共鳴...
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News