前言
在11月的前兩周我總結了每天5分鍾玩轉容器技術的基礎部分,對容器有了一些基礎的認識和實踐經驗,但是容器技術不能只學不用,需要結合實際項目的部署來進一步學習並加深理解,所以我購買了慕課網的 基於SpringCloud+Kubernetes微服務的容器化持續交付實戰 這門實戰課,既可以了解微服務,又能夠學習DevOps並加深對容器的理解。這系列的筆記就是針對這個實戰課程編寫的,目前只更新到了第6章,筆記同樣也采用了問題-解答 的形式,方便大家准備面試,希望對大家有所幫助。
持續集成
-
敏捷開發,持續集成,持續交付,持續部署,DevOps的區別?
- 敏捷開發:關注任務的分配和實際開發和本地環境的構建
- 持續集成:敏捷開發+自動化測試
- 持續交付:持續集成+包發布到內部的庫中
- 持續部署:持續交付+部署環節
- DevOps:持續部署+運維(包含了軟件生命周期的所有環節)
-
需要進行持續集成的原因?
- 單體應用的部署相對簡單,部署服務停服務都只需要控制一個jar包即可
- 微服務模式下應用部署的復雜度高,部署服務可能需要部署微服務相關的很多支持服務
-
如何設計持續交付流水線?(學習完再完成)
-
需要持續部署的原因?
- 手動部署出錯率高
- 需要熬夜加班部署
-
持續部署的要素
- 自動化部署:Ansible
- VaultServer:存儲敏感信息服務器
- 應用與配置分離,一次構建,多次運行-Spring cloud Config
- 提供應用健康檢測接口-Spring cloud Actuator
- 自動化部署:Ansible
-
新版本發布時的方式
- 藍綠發布:同時保持兩個環境,一個老版本,一個新版本,通過一個調度程序把所有客戶端流量負載到新版本環境下,一旦出現問題,無縫切換到老版本
- 金絲雀發布:和藍綠發布類似,也同時有兩套環境,區別在於客戶端流量是逐步切換到新版本的,按照10%~100%逐步切換
- 功能開關:適用於前后端開發進度不匹配的時候,如果后端先開發完畢,可以通過設置一個全局的開關,先關閉部分新功能,等到前端都開發完畢后,再把功能開關打開
-
簡單說說一個敏捷項目的管理架構
- Release:發布,單位為月,比如:6月需要發布一個促銷的功能
- Sprint:迭代(包含本次迭代需要實現的需求點),單位為周
- Story:根據需求產生的一個個用戶故事(產品經理做)
- Task:根據用戶故事拆分出來的開發任務(程序員做)
- Sprint:迭代(包含本次迭代需要實現的需求點),單位為周
- Release:發布,單位為月,比如:6月需要發布一個促銷的功能
-
Story point的作用是什么?
Story Point的作用是給每個用戶故事進行打分,保證每個開發者按照能力來分配分數,打分的評測維度有如下:
- 工作量
- 復雜度
- 風險和不確定性
-
每日站會的目的是什么?
每日站會最主要的目的是及時的消除項目的風險。每個人通過說明以下的事項,項目經理能夠很有效的把控項目的進度。
- 昨日工作
- 今日工作
- 是否有阻塞的issuse
-
簡單說說 GitFlow和TrunkBase開發模式的區別,開發團隊如何選擇開發模型?
- GitFlow和TrunkBase模型的核心區別在於,提交的新功能是否可以立即發布到主干分支或者Release分支,立即合並並且分支較少的優點和缺點如下:
- 優點:可以快速迭代
- 缺點:如果團隊開發水平不高,很可能出現線上bug
- 總結:如果對版本穩定性要求高,建議使用GitFlow;如果需要快速迭代,建議使用TrunkBase
- GitFlow和TrunkBase模型的核心區別在於,提交的新功能是否可以立即發布到主干分支或者Release分支,立即合並並且分支較少的優點和缺點如下:
-
微服務網關的作用
- 服務路由:作為統一路徑的路由入口
- 服務認證:提供session等校驗工作
- 服務負載均衡調度:可以配置負載均衡策略
- 安全管理:支持配置某些路徑的白名單
-
Zuul網關的兩種用法
-
service通過ribbon向eureka注冊,zuul通過serviceId來通過eureka找到服務
zuul: routes: guestbook: path: /** serviceId: guestbook-service
-
Zuul通過uri進行http跳轉:適用於不用eureka作為注冊中心的情況
zuul: routes: guestbook: path: /** uri: http://service:8080/guestbook/
-
-
maven私服的作用
- 公司的依賴統一管理,提供緩存,減少網絡傳輸
- 制品倉庫(自己編寫的jar,可以由其他人訪問到)
-
如何搭建maven私服?(使用artifactory)
-
使用docker直接搭建最簡單,命令如下:
sudo docker run --name artifactory-oss-6.18.1 -p 8083:8081 docker.bintray.io/jfrog/artifactory-oss:6.18.1
-
然后訪問localhost:8083 admin/password進入artifactory的UI界面
- 建立遠程倉庫
- 建立本地倉庫
- 建立聚合遠程倉庫本地倉庫的虛擬倉庫
-
使用Artifactory自動生成maven的setting.xml文件,替換本地 ~/.m2的setting.xml文件即可
-
-
Snapshot版本和Release版本的區別?(使用artifactory)
- Snapshot在maven中可以存在同一個版本號的多個不同時間戳的版本,相當於開發階段
- Release版本(version不帶snapshot),同一個版本號在私服中只能存在一份,使用別人的jar包時盡量使用release版本的
-
(使用artifactory)的倉庫結構圖
-
如何把本地的jar包發布到maven的私服?(使用artifactory)
- 點擊虛擬倉庫的Set me up,里面提供了pom文件中的發布部分
- 在本地pom文件中加入這部分即可
- mvn depoly就可以發布到私服了
-
為什么使用Jenkins?
- 軟件項目的統一自動化構建(統一意味着一切環境的一致性;自動意味着可重復)
- 通過許多插件,可以方便的集成 代碼掃描 自動化測試 和 自動化部署的任務
-
Jenkins的核心概念?
- Project:項目,定義一個構建菜譜
- Build:構建,利用Project來執行一次構建
- Workspace:工作空間,構建是基於哪個工作目錄,存儲代碼和一些中間臨時文件
- Credentials:憑據,一些敏感信息可以存儲在Jenkins,通過定義變量來獲取
-
Jenkins持續集成使用pipeline流水線模式有什么好處?
- pipeline as code:代碼(配置信息)可以存儲在git倉庫,如果jenkins服務器不可用,配置項就丟失了
- 和第三方集成更容易(可以不依賴插件,直接使用接口調用)
-
你知道有哪些pipeline流水線模式的語法?
- Scripted腳本式:可以使用Groovy腳本,比較靈活
- Declarative聲明式:通過預定義的標簽進行結構化的編寫,功能受限但更加標准化
-
Jenkins如何集成Artifactory?
- 下載Jenkins Artifactory插件
- 在Configure System中配置插件和相關Credential信息
- 在流水線使用Atrifactory進行依賴下載和制品上傳
-
Jenkins集成Jira的原理?
Jenkins之所以需要集成Jira是因為,提交的構建在測試和Release經理的角度,都需要知道本次構建的修改對應的是Jira的哪個需求。
Jenkins集成Jira的原理是:
- 開發者在commit消息里增加jira的任務id
- Jenkins可以在構建中自動創建Jira的鏈接
- 測試可以在構建中方便的獲取需求相關信息
-
Sonarqube是什么?
- 功能:源代碼掃描工具,可以識別代碼的質量漏洞重復率等等,提升代碼質量
- 原理:需要建立掃描規則庫,如果掃描過程中命中規則,則會生成一個issue,提示開發者進行修復。
-
Jenkins和Sonarqube集成的原理圖,如何集成?
- docker 運行一個Sonarqube的server
- 創建項目,生成一個token
- Jenkins腳本中需要傳遞token