微服務(wù)實(shí)戰(zhàn)項(xiàng)目-學(xué)成在線-項(xiàng)目部署
1 什么是DevOps
一個(gè)軟件的生命周期包括:需求分析階、設(shè)計(jì)、開(kāi)發(fā)、測(cè)試、上線、維護(hù)、升級(jí)、廢棄。
通過(guò)示例說(shuō)明如下:
1、產(chǎn)品人員進(jìn)行需求分析
2、設(shè)計(jì)人員進(jìn)行軟件架構(gòu)設(shè)計(jì)和模塊設(shè)計(jì)。
3、每個(gè)模塊的開(kāi)發(fā)人員并行開(kāi)發(fā),設(shè)計(jì)接口、進(jìn)行編碼,并進(jìn)行單元測(cè)試
4、開(kāi)發(fā)完畢,將代碼集成部署到測(cè)試服務(wù)器,測(cè)試人員進(jìn)行測(cè)試。
5、測(cè)試人員發(fā)現(xiàn)bug,提交bug、開(kāi)發(fā)人員修改bug
6、bug修改完畢再次集成、測(cè)試。
7、測(cè)試完畢,項(xiàng)目上線。
8、運(yùn)維人員進(jìn)行安裝部署、培訓(xùn)。
9、用戶提出問(wèn)題,返回給運(yùn)維人員。
10、運(yùn)維人員反饋給開(kāi)發(fā)人員,開(kāi)發(fā)人員進(jìn)行問(wèn)題處理。
11、再次提交測(cè)試。
12、測(cè)試完畢再次部署升級(jí)。
…
最后軟件下線。
所以,在整體生命周期中比較核心的兩個(gè)階段是:開(kāi)發(fā)階段、維護(hù)階段,開(kāi)發(fā)階段的成果是軟件開(kāi)發(fā)完成并成功上線,運(yùn)維階段則負(fù)責(zé)對(duì)軟件進(jìn)行維護(hù)和升級(jí),而運(yùn)維階段通常在一個(gè)軟件
的生命周期中占比最多。
提高開(kāi)發(fā)階段、運(yùn)維階段的工作效率是企業(yè)在進(jìn)行軟件項(xiàng)目管理的重點(diǎn)。
因此,專家提出了DevOps,DevOps是什么呢?
下邊是摘自百度百科的定義:
DevOps(Development和Operations的組合詞)是一組過(guò)程、方法與系統(tǒng)的統(tǒng)稱,用于促進(jìn)開(kāi)發(fā)(應(yīng)用程序/軟件工程)、技術(shù)運(yùn)營(yíng)和質(zhì)量保障(QA)部門之間的溝通、協(xié)作與整合。
它是一種重視"軟件開(kāi)發(fā)人員(Dev)"和"IT運(yùn)維技術(shù)人員(Ops)"之間溝通合作的文化、運(yùn)動(dòng)或慣例。透過(guò)自動(dòng)化"軟件交付"和"架構(gòu)變更"的流程,來(lái)使得構(gòu)建、測(cè)試、發(fā)布軟件能夠更加地快捷、頻繁和可靠。
它的出現(xiàn)是由于軟件行業(yè)日益清晰地認(rèn)識(shí)到:為了按時(shí)交付軟件產(chǎn)品和服務(wù),開(kāi)發(fā)和運(yùn)維工作必須緊密合作。
DevOps是一個(gè)工具嗎?
DevOps是一個(gè)工作職位嗎?
都不是。
DevOps是一種思想理念,它涵蓋開(kāi)發(fā)、測(cè)試、運(yùn)維的整個(gè)過(guò)程。DevOps追求的目標(biāo)是提高軟件開(kāi)發(fā)、測(cè)試、運(yùn)維、運(yùn)營(yíng)等各部門的溝通與協(xié)作質(zhì)量,DevOps強(qiáng)調(diào)軟件開(kāi)發(fā)人員與軟件測(cè)試、軟件運(yùn)維、質(zhì)量保障(QA)部門之間有效的溝通與協(xié)作,強(qiáng)調(diào)通過(guò)自動(dòng)化的方法去管理軟件變更、軟件集成,使軟件從構(gòu)建到測(cè)試、發(fā)布更加快捷、可靠,最終按時(shí)交付軟件。
2 什么是CI/CD
如何來(lái)落地實(shí)現(xiàn)DevOps呢?
DevOps興起于2009年,近年來(lái)由于云計(jì)算、互聯(lián)網(wǎng)的發(fā)展,促進(jìn)了DevOps的基礎(chǔ)設(shè)施及工具鏈的發(fā)展,涌現(xiàn)了一大批優(yōu)秀的工具,這些工具包括開(kāi)發(fā)、測(cè)試、運(yùn)維的各各領(lǐng)域,例如:GitHub、Docker、Jenkins、Hudson、K8S、Ant/Maven/Gradle、Selenium、QUnit、JMeter等。下圖是DevOps相關(guān)的工具集:
好的工具有利于DevOps的實(shí)施,但并不代表實(shí)施DevOps就一定需要去引入一堆工具。
問(wèn)題的關(guān)鍵:如何解決問(wèn)題,而不是具體應(yīng)用工具。
CI/CD 是近年來(lái)企業(yè)有效實(shí)施DevOps的具體方案。
CI/CD 包含了一個(gè) CI 和兩個(gè) CD,CI全稱 Continuous
Integration,表示持續(xù)集成,CD包含 Continuous Delivery和 Continuous
Deployment,分別是持續(xù)交付和持續(xù)部署,三者具有前后依賴關(guān)系。
CI 持續(xù)集成:
持續(xù)集成倡導(dǎo)團(tuán)隊(duì)成員需要頻繁的集成他們的工作,將開(kāi)發(fā)分支合并到主分支,每次集成都通過(guò)自動(dòng)化構(gòu)建(包括編譯、構(gòu)建、自動(dòng)化測(cè)試)來(lái)驗(yàn)證,從而盡快地發(fā)現(xiàn)集成中的錯(cuò)誤,讓產(chǎn)品可以快速迭代,同時(shí)還能保持高質(zhì)量。
CD持續(xù)交付:
持續(xù)交付將集成后的代碼部署到類生產(chǎn)環(huán)境(預(yù)發(fā)布),除了交付到類生產(chǎn)環(huán)境之外,還會(huì)執(zhí)行一些集成測(cè)試、API測(cè)試。持續(xù)交付強(qiáng)調(diào)的是"交付",交付給測(cè)試、產(chǎn)品驗(yàn)收,不管怎么更新,軟件是隨時(shí)隨地可以交付的。
CD持續(xù)部署:
在持續(xù)交付的基礎(chǔ)上由開(kāi)發(fā)人員或運(yùn)維人員自助式的定期向生產(chǎn)環(huán)境部署穩(wěn)定的構(gòu)建版本,持續(xù)部署的目標(biāo)是代碼在任何時(shí)刻都是可部署的,并可自動(dòng)進(jìn)入到生產(chǎn)環(huán)境。
3 DevOps實(shí)戰(zhàn)
3.1 技術(shù)方案
下圖是比較流行的一種CI/CD的技術(shù)方案:
下邊我們參考該技術(shù)方案將學(xué)成在線項(xiàng)目使用Docker進(jìn)行部署。
本次項(xiàng)目部署實(shí)戰(zhàn)旨在理解CI/CD的流程,考慮Kubernates的復(fù)雜性課堂上我們用Jenkins代替Kubernates完成容器部署。
3.2 準(zhǔn)備環(huán)境
準(zhǔn)備一臺(tái)Centos7
虛擬機(jī),安裝Docker、jdk、maven,通過(guò)Docker容器安裝jenkins、Docker私服軟件,其它軟件為學(xué)成在線項(xiàng)目所需要的,如下:
Mysql | 8.x | docker |
nacos | 1.4.1 | docker |
rabbitmq | 3.8.34 | docker |
redis | 6.2.7 | docker |
xxl-job-admin | 2.3.1 | docker |
minio | RELEASE.2022-09-07 | docker |
elasticsearch | 7.12.1 | docker |
kibana 7.12.1 | docker | |
gogs | 0.13.0 | docker |
nginx | 1.12.2 | docker |
在課堂資料中提供了安裝以上軟件的虛擬機(jī),使用VMware導(dǎo)入即可使用。
3.3 人工部署方式
如果不使用CI/CD則需要人工手動(dòng)對(duì)工程進(jìn)行測(cè)試、打包、部署。使用CI/CD后通過(guò)自動(dòng)化的工具去完成。
下邊先演示手動(dòng)部署方式,之后采用工具進(jìn)行部署。
3.3.1 項(xiàng)目打包
1、在父工程聚合各模塊
首先在父工程添加models,聚合各各模塊
<modules>
<module>../xuecheng-plus-base</module>
<module>../xuecheng-plus-checkcode</module>
<module>../xuecheng-plus-gateway</module>
<module>../xuecheng-plus-auth</module>
<module>../xuecheng-plus-content</module>
<module>../xuecheng-plus-learning</module>
<module>../xuecheng-plus-media</module>
<module>../xuecheng-plus-orders</module>
<module>../xuecheng-plus-message-sdk</module>
<module>../xuecheng-plus-search</module>
<module>../xuecheng-plus-system</module>
</modules>
2、配置打包插件
使用springboot打包插件進(jìn)行打包,在需要打可執(zhí)行包的工程中配置spring-boot-maven-plugin插件否則報(bào)
“jar中沒(méi)有主清單屬性” 。
注意:在要打可執(zhí)行jar包的工程中配置該插件。
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
說(shuō)明:
配置了springboot打包插件即可在maven窗口顯示如下:
功能說(shuō)明:
build-info:生成項(xiàng)目的構(gòu)建信息文件 build-info.properties
repackage:這個(gè)是默認(rèn) goal,在 mvn package
執(zhí)行之后,這個(gè)命令再次打包生成可執(zhí)行的 jar,同時(shí)將 mvn package 生成的
jar 重命名為 *.origin
run:這個(gè)可以用來(lái)運(yùn)行 Spring Boot 應(yīng)用
start:這個(gè)在 mvn integration-test 階段,進(jìn)行 Spring Boot
應(yīng)用生命周期的管理
stop:這個(gè)在 mvn integration-test 階段,進(jìn)行 Spring Boot
應(yīng)用生命周期的管理
在父工程執(zhí)行:clean install -DskipTests -f pom.xml 對(duì)所有工程進(jìn)行打包
打包完成可在本地通過(guò)java -jar 運(yùn)行jar包觀察是否可以正常運(yùn)行。
下邊測(cè)試驗(yàn)證碼服務(wù):
進(jìn)入驗(yàn)證碼服務(wù)的target目錄,cmd運(yùn)行:
java -Dfile.encoding=utf-8 -jar
xuecheng-plus-checkcode-0.0.1-SNAPSHOT.jar
如下圖:
使用httpclient測(cè)試申請(qǐng)驗(yàn)證碼:
### 申請(qǐng)驗(yàn)證碼
POST localhost:63075/checkcode/pic
3.3.2 部署到Linux
將打成的jar包拷貝到Linux,生成鏡像,并創(chuàng)建容器。
1、編寫Dockerfile文件
FROM java:8u20
MAINTAINER docker_maven docker_maven@email.com
WORKDIR /ROOT
ADD xuecheng-plus-checkcode-0.0.1-SNAPSHOT.jar xuecheng-plus-checkcode.jar
CMD ["java", "-version"]
ENTRYPOINT ["java", "-Dfile.encoding=utf-8","-jar", "xuecheng-plus-checkcode.jar"]
EXPOSE 63075
2、創(chuàng)建鏡像
docker build -t checkcode:1.0 .
創(chuàng)建成功,查詢鏡像:
3、創(chuàng)建容器
docker run --name xuecheng-plus-checkcode -p 63075:63075 -idt checkcode:1.0
再次測(cè)試
### 申請(qǐng)驗(yàn)證碼
POST 192.168.101.65:63075/checkcode/pic
3.5 自動(dòng)部署
3.5.1 實(shí)戰(zhàn)流程
下邊使用jenkins實(shí)現(xiàn)CI/CD的流程。
1、將代碼 使用Git托管
2、在jenkins創(chuàng)建任務(wù),從Git拉取代碼。
3、拉取代碼后進(jìn)行自動(dòng)構(gòu)建:測(cè)試、打包、部署。
首先將代碼打成鏡像包上傳到docker私服。
自動(dòng)創(chuàng)建容器、啟動(dòng)容器。
4、當(dāng)有代碼push到git實(shí)現(xiàn)自動(dòng)構(gòu)建。
3.5.2 代碼提交至Git
3.5.3 修改pom.xml文件
在pom.xml添加docker-maven-plugin插件實(shí)現(xiàn)將springboot工程創(chuàng)建鏡像,
此pom.xml添加docker-maven-plugin插件用于生成鏡像。
分別修改system-api、content-api、media-api、gateway、auth、checkcode服務(wù)的pom.xml文件。
插件的坐標(biāo)如下:
<dependency>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
</dependency>
修改pom.xml文件,以xuecheng-plus-checkcode為例,如下:
Bash
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<!--修改imageName節(jié)點(diǎn)的內(nèi)容,改為私有倉(cāng)庫(kù)地址和端口,再加上鏡像id和 TAG,我們要直接傳到私服-->
<!--配置最后生成的鏡像名,docker images里的,我們這邊取項(xiàng)目名:版本-->
<!--<imageName>${project.artifactId}:${project.version}</imageName>-->
<imageName>192.168.101.65:5000/${project.artifactId}:${project.version}</imageName>
<!--也可以通過(guò)以下方式定義image的tag信息。 -->
<!-- <imageTags>
<imageTag>${project.version}</imageTag>
<!–build 時(shí)強(qiáng)制覆蓋 tag,配合 imageTags 使用–>
<forceTags>true</forceTags>
<!–build 完成后,push 指定 tag 的鏡像,配合 imageTags 使用–>
<pushImageTag>true</pushImageTag>
</imageTags>-->
<baseImage>java:8u20</baseImage>
<maintainer>docker_maven docker_maven@email.com</maintainer>
<workdir>/root</workdir>
<cmd>["java", "-version"]</cmd>
<!--來(lái)指明Dockerfile文件的所在目錄,如果配置了dockerDirectory則忽略baseImage,maintainer等配置-->
<!--<dockerDirectory>./</dockerDirectory>-->
<!--2375是docker的遠(yuǎn)程端口,插件生成鏡像時(shí)連接docker,這里需要指定docker遠(yuǎn)程端口-->
<dockerHost>http://192.168.101.65:2375</dockerHost>
<!--入口點(diǎn),project.build.finalName就是project標(biāo)簽下的build標(biāo)簽下 的filename標(biāo)簽內(nèi)容,testDocker-->
<!--相當(dāng)于啟動(dòng)容器后,會(huì)自動(dòng)執(zhí)行java -jar ...-->
<entryPoint>["java", "-Dfile.encoding=utf-8","-jar", "/root/${project.build.finalName}.jar"]</entryPoint>
<!--是否推送到docker私有倉(cāng)庫(kù),舊版本插件要配置maven的settings文件。 -->
<pushImage>true</pushImage>
<registryUrl>192.168.101.65:5000</registryUrl> <!-- 這里是復(fù)制 jar 包到 docker 容器指定目錄配置 -->
<resources>
<resource>
<targetPath>/root</targetPath>
<directory>${project.build.directory}</directory>
<!--把哪個(gè)文件上傳到docker,相當(dāng)于Dockerfile里的add app.jar /-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
其中system-api服務(wù)的bootstrap.yml修改如下:
server:
servlet:
context-path: /system
port: 63110
#微服務(wù)配置
spring:
application:
name: system-api
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.101.65:3306/xcplus_system?serverTimezone=UTC&userUnicode=true&useSSL=false&
username: root
password: mysql
cloud:
nacos:
server-addr: 192.168.101.65:8848
discovery:
namespace: dev166
group: xuecheng-plus-project
# 日志文件配置路徑
logging:
config: classpath:log4j2-dev.xml
# swagger 文檔配置
swagger:
title: "學(xué)成在線系統(tǒng)管理"
description: "系統(tǒng)管理接口"
base-package: com.xuecheng.system
enabled: true
version: 1.0.0
在system-api工程添加nacos的依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
刪除system-service工程下的配置文件。
以上內(nèi)容修改完畢再次提交Git.
3.5.4 自動(dòng)構(gòu)建測(cè)試
找到j(luò)enkins_02任務(wù),配置源碼管理
配置完畢,開(kāi)始構(gòu)建
)
通過(guò)控制臺(tái)輸出日志觀察構(gòu)建情況
如果控制臺(tái)有報(bào)錯(cuò),根據(jù)錯(cuò)誤信息進(jìn)行調(diào)試。
部署成功后,進(jìn)入服務(wù)器查看docker容器是否啟動(dòng)成功
3.5.5 部署前端門戶
在虛擬機(jī)的docker中已經(jīng)部署了nginx,修改nginx.conf的配置文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
server_names_hash_bucket_size 64;
client_max_body_size 100M; # 設(shè)置客戶端請(qǐng)求體最大值
client_body_buffer_size 128k; # 設(shè)置請(qǐng)求體緩存區(qū)大小
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#文件服務(wù)
upstream fileserver{
server 192.168.101.65:9000 weight=10;
}
#后臺(tái)網(wǎng)關(guān)
upstream gatewayserver{
server 192.168.101.65:63010 weight=10;
}
#gzip on;
server {
listen 80;
server_name www.51xuecheng.cn localhost;
#rewrite ^(.*) https://$server_name$1 permanent;
#charset koi8-r;
ssi on;
ssi_silent_errors on;
#access_log logs/host.access.log main;
location / {
alias /etc/nginx/html/;
index index.html index.htm;
}
#api
location /api/ {
proxy_pass http://gatewayserver/;
}
#靜態(tài)資源
location /static/img/ {
alias /etc/nginx/html/img/;
}
location /static/css/ {
alias /etc/nginx/html/css/;
}
location /static/js/ {
alias /etc/nginx/html/js/;
}
location /static/plugins/ {
alias /etc/nginx/html/plugins/;
add_header Access-Control-Allow-Origin http://ucenter.51xuecheng.cn;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods GET;
}
location /plugins/ {
alias /etc/nginx/html/plugins/;
}
location /course/preview/learning.html {
alias /etc/nginx/html/course/learning.html;
}
location /course/search.html {
root /etc/nginx/html;
}
location /course/learning.html {
root /etc/nginx/html;
}
location /course/ {
proxy_pass http://fileserver/mediafiles/course/;
}
#openapi
location /open/content/ {
proxy_pass http://gatewayserver/content/open/;
}
location /open/media/ {
proxy_pass http://gatewayserver/media/open/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
server {
listen 80;
server_name file.51xuecheng.cn;
#charset koi8-r;
ssi on;
ssi_silent_errors on;
#access_log logs/host.access.log main;
location /video {
proxy_pass http://fileserver;
}
location /mediafiles {
proxy_pass http://fileserver;
}
}
server {
listen 80;
server_name teacher.51xuecheng.cn;
#charset koi8-r;
ssi on;
ssi_silent_errors on;
#access_log logs/host.access.log main;
location / {
alias /etc/nginx/html/dist/;
index index.html index.htm;
}
#location / {
# proxy_pass http://uidevserver;
#}
location /api/ {
proxy_pass http://gatewayserver/;
}
}
server {
listen 80;
server_name ucenter.51xuecheng.cn;
#charset koi8-r;
ssi on;
ssi_silent_errors on;
#access_log logs/host.access.log main;
location / {
alias /etc/nginx/html/ucenter/;
index index.html index.htm;
}
location /include {
proxy_pass http://192.168.101.65;
}
location /img/ {
proxy_pass http://192.168.101.65/static/img/;
}
location /api/ {
proxy_pass http://gatewayserver/;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
將前端門戶的靜態(tài)頁(yè)面拷貝到 /data/soft/nginx/xuecheng_portal_static
啟動(dòng)nginx容器:
docker start nginx
修改本機(jī)hosts文件:
192.168.101.65 www.51xuecheng.cn 51xuecheng.cn ucenter.51xuecheng.cn teacher.51xuecheng.cn file.51xuecheng.cn
將本機(jī)的nginx服務(wù)停掉,訪問(wèn)www.51xuecheng.cn。
3.5.6 部署機(jī)構(gòu)端前端
將機(jī)構(gòu)端的前端工程打包,運(yùn)行yarn build
打包成功在工程目錄生成dist目錄
將此目錄的內(nèi)容拷貝到虛擬機(jī)的/data/soft/nginx/xuecheng_portal_static/dist
3.5.7 配置觸發(fā)器
當(dāng)向gogs提交代碼時(shí)進(jìn)行自動(dòng)構(gòu)建
在gogs配置鉤子
推送地址設(shè)置jenkins的接口:
http://192.168.101.65:8888/gogs-webhook/?job=jenkins_02
配置好可以測(cè)試一下:
測(cè)試后觀察jenkina是否重新構(gòu)建任務(wù)。
提交代碼測(cè)試:
修改代碼提交到gogs,觀察jenkins是否自動(dòng)構(gòu)建任務(wù)
3.6 功能測(cè)試
3.6.1 測(cè)試認(rèn)證功能
部署成功后對(duì)功能進(jìn)行測(cè)試。
1、首先測(cè)試認(rèn)證功能
進(jìn)入www.51xuecheng.cn,點(diǎn)擊登錄,輸入賬號(hào)和密碼進(jìn)行登錄。
賬號(hào)和密碼:t1/111111
3.6.2 測(cè)試內(nèi)容管理
1、測(cè)試課程列表
出現(xiàn) Request failed with status code 503 錯(cuò)誤
通過(guò)nacos排查,進(jìn)入服務(wù)列表
缺少system-api
排查system-api工程的bootstrap.yml配置文件、依賴包等內(nèi)容。
修改代碼后重新提交git
再次進(jìn)行jenkins構(gòu)建。
2、測(cè)試上傳課程圖片
首先測(cè)試修改課程,上傳一個(gè)新圖片。
3、測(cè)試課程發(fā)布
首先觀察xxl-job調(diào)度中心是否成功注冊(cè)執(zhí)行器
啟動(dòng)課程發(fā)布任務(wù)
發(fā)布一門課程,觀察content-api容器的日志
錯(cuò)誤日志:
java.io.FileNotFoundException: file:/root/xuecheng-plus-content-api-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/templates does not exist.
無(wú)法找到靜態(tài)化的模板
屏蔽原來(lái)的方式,改如下方式
// String classpath = this.getClass().getResource("/").getPath(); //打包jar無(wú)法獲取模板
// configuration.setDirectoryForTemplateLoading(new File(classpath + "/templates/"));
//更改為如下方式
configuration.setTemplateLoader(new ClassTemplateLoader(this.getClass().getClassLoader(),"/templates"));
3.6.3 測(cè)試媒資管理
1、配置ffmpeg的目錄
將linux版本的ffmpeg拷貝到 /data/soft/service 下,在nacos配置ffmpeg
的地址:
Ffmpeg linux版本下載地址:https://johnvansickle.com/ffmpeg/文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-644938.html
videoprocess:
ffmpegpath: /root/soft/ffmpeg
2、測(cè)試上傳視頻文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-644938.html
到了這里,關(guān)于微服務(wù)實(shí)戰(zhàn)項(xiàng)目-學(xué)成在線-項(xiàng)目部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!