Java后端架构开荒实战(一)——基础设施
Java后端架構開荒實戰(一)——基礎設施
一、前言
之前的文章有講過后端架構演進系列,這個系列文章還是以一個經典的電商系統為例子,來講講Robben是如何在實際開發中一步一步打造出一個大型的后端架構的。本系列文章更多的一些實踐操作方面的操作和選型。
工欲善其事,必先利其器。在業務代碼開發前,讓我們先做好相關的基礎設置建設。
二、云平臺
云服務的選擇有阿里云、騰訊云、華為云等等。阿里云是老牌云服務商了,產品配套齊全,文檔豐富,價格也是相應的貴一點。騰訊云算是后起之秀,有騰訊背書,價格比阿里云便宜點。華為云沒用過就不評價。
運行環境可以選擇jar包直接運行在Linux環境上,也可以選擇使用Kubernets進行部署。
我們這里云服務商選擇騰訊云,然后平臺選擇Kubernetes去管理我們整個后端應用周期。
三、代碼管理
關于Git和Svn現在基本都是選擇Git了吧。可以使用私有的GitLab,或者使用云服務的Git倉庫也是一個不錯的選擇。大部分公司為了代碼安全考慮會選擇自建倉庫。
自建GitLab參考: TKE容器集群中部署GitLab服務器
云服務騰訊云coding:
本系列文章使用coding的代碼倉庫來管理。
四、文件服務
這里把文件服務單獨拎出來,因為文件存儲的安全和維護是比較重要和獨立的。
自建分布式文件服務fastdfs
fastdfs是開源的分布式文件系統,充分考慮了冗余備份、負載均衡、線性擴容等機制,并注重高可用、高性能等指標。一般用在圖片和音頻這種中小文件存儲,有自建需求的團隊可以考慮。
使用云服務商提供的文件服務
這種就沒什么好說的,像阿里云OSS,七牛云等等都可以。
綜合成本使用考慮本系列文章使用七牛云的文件服務。
五、統一依賴管理Maven
隨著依賴的不斷增多,內部服務的不斷產生。統一的版本管理就顯得十分重要。
Maven私服
用來統一管理依賴和內部二方庫。可以選擇自建,也可以用云服務的。
自建Nexus: 省略了,網上一搜以大把。
云服務:Coding的制品庫管理。
maven setting中指定
統一依賴項目
統一依賴項目結構
看下具體代碼
robbendev.maven/pom.xml主要是配置私服的地址
<groupId>com.robbendev</groupId> <artifactId>robbendev-maven</artifactId> <version>1.0-SNAPSHOT</version><modules><module>robbendev-bom</module><module>robbendev-dependencies</module><module>robbendev-parent</module> </modules><packaging>pom</packaging><name>robbendev-maven</name> <description>robbendev maven nexus 基礎配置</description><!-- omitted xml --> <distributionManagement><repository><!--必須與 settings.xml 的 id 一致--><id>robbendev-robbendev-robbendev</id><name>robbendev</name><url>https://robbendev-maven.pkg.coding.net/repository/robbendev/robbendev/</url></repository> </distributionManagement>robbendev-maven/robbendev-bom/pom.xml主要是統一內部二方庫的依賴版本
<parent><artifactId>robbendev-maven</artifactId><groupId>com.robbendev</groupId><version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion><artifactId>robbendev-bom</artifactId> <name>robbendev-bom</name> <description>robbendev二方庫依賴配置</description> <packaging>pom</packaging><properties><robbendev-common.version>1.0-SNAPSHOT</robbendev-common.version> </properties><dependencyManagement><dependencies><dependency><groupId>com.robbendev</groupId><artifactId>robbdendev-common</artifactId><version>${robbendev-common.version}</version></dependency></dependencies> </dependencyManagement>robbendev-maven/robbendev-dependencies/pom.xml主要是統一外部三方庫的依賴版本
<parent><artifactId>robbendev-maven</artifactId><groupId>com.robbendev</groupId><version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion><artifactId>robbendev-dependencies</artifactId> <name>robbendev-dependencies</name> <description>robbendev三方庫依賴配置</description> <packaging>pom</packaging><properties><spring-cloud.version>Hoxton.SR7</spring-cloud.version><spring-boot.version>2.3.3.RELEASE</spring-boot.version>... </properties><dependencyManagement><dependencies><!--spring cloud--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--spring boot--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency>...</dependencies></dependencyManagement>robbendev-maven/robbendev-parent/pom.xml聚合二方庫和三方庫依賴配置的pom作為所有項目的父pom文件
<properties><robbendev-bom.version>1.0-SNAPSHOT</robbendev-bom.version><robbendev-dependencies.version>1.0-SNAPSHOT</robbendev-dependencies.version></properties><dependencyManagement><dependencies><!--二方庫依賴管理--><dependency><groupId>com.robbendev</groupId><artifactId>robbendev-bom</artifactId><version>${robbendev-bom.version}</version><scope>import</scope><type>pom</type></dependency><!--一方庫依賴管理--><dependency><groupId>com.robbendev</groupId><artifactId>robbendev-dependencies</artifactId><version>${robbendev-dependencies.version}</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement>這樣我們的依賴管理就完成了,新的項目只用繼承
<parent><groupId>com.robbendev</groupId><artifactId>robbendev-parent</artifactId><version>1.0-SNAPSHOT</version> </parent>六、自動集成CI/CD
自定集成將開發人員從繁雜的打包發布過程解脫出來,能專注于業務代碼的開發。是團隊提效的有效方法。
二方庫的發布
以robbendev-maven項目為例子,我們在每次依賴版本有變更的時候,如何快速推送Maven私服呢? 以本項目為例業內有一下常見方案
gitlab-ci 如果使用的gitlab倉庫的話可以考慮這個方案。
自建jenkins 如果有自己的運維團隊,可以考慮使用自建的運維平臺。
使用云服務
這里簡單介紹下筆者使用的coding持續繼承,這個也是完全兼容jenkins的。 基本上也是在控制臺配置好:
可以使用流程配置,也可以使用倉庫中的Jenkinsfile
打包機器由于要配置maven的setting文件,所以選擇自定義節點構建。
選擇適合自己的觸發方式,現在提交代碼就可以看到觸發了自動集成和部署:
服務的發布
以一個最基礎的SpringBoot的程序為例子 在騰訊云鏡像倉庫獲取賬號密碼后 在maven setting中配置
應用代碼結構
├── pom.xml ├── src │ ├── main │ │ ├── docker │ │ │ └── Dockerfile │ │ ├── java │ └── testpom.xml使用docker插件,注意這里的serveId對應setting.xml中的配置,maven.build.timestamp.format屬性一定要指定。imageName的含義是使用時間戳作為版本號。
<properties><maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>... </properties><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><skipDockerBuild>false</skipDockerBuild><imageName>ccr.ccs.tencentyun.com/robbendev.hello-docker/robbendev-hello-docker:${maven.build.timestamp}</imageName><dockerDirectory>src/main/docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources><serverId>my-docker</serverId></configuration> </plugin>看一下jenkins關鍵代碼
stage('編譯打包部署') {steps {sh '''git checkout mastergit pullmvn clean package docker:build -DpushImage'''} }這樣在提交代碼的時候就可以自動打包鏡像推送到騰訊云鏡像倉庫,然后通過鏡像觸發器可以實現自動發布。
七、小結
這樣一套組合拳下來,Robben終于可以開始好好開發了。接下來會介紹Robben是如何從單體應用到集群再到微服務進行開發的。
繼續支持Remi醬哦~
文章來源:https://www.tuicool.com/articles/QZJzamF
總結
以上是生活随笔為你收集整理的Java后端架构开荒实战(一)——基础设施的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带你读懂Spring Bean 的生命周
- 下一篇: Java后端架构开荒实战(二)——单机到