(Docker实战) 第六篇:建立持续集成环境03
標(biāo)簽: gblfy技術(shù)文檔
文章目錄
- 六、 git核心概念
- 6.1. git學(xué)習(xí)地址
- 6.2. github和碼云的介紹
- 6.3. git常用命令和操作
- 6.3.1. 命令行常用命令
- 6.3. IDEA操作方法(具體看視頻)
- 6.3.1. 合并分支
- 6.3.2. compare with
- 6.3.3. rename
- 6.3.4. 看歷史記錄(所有的和單個(gè)文件的)
- 6.3.5. revert 6.stash
- 6.3.7. cherry pick
- 6.3.8. reset curent branch
- 6.4 git技巧
- 6.4.1. 分支用法實(shí)戰(zhàn)
- 6.4.2. 解決沖突
- 6.4.3. rebase
- 6.4.4. bug修復(fù)流程
- 6.4.4.1. 暫存手頭工作(如果有沒(méi)完成的工作的話)
- 6.4.4.2. 新建bugfix分支
- 6.4.4.3. 測(cè)試bug是否修復(fù)完成
- 6.4.4.4. 合并分支
- 6.4.4.5. 繼續(xù)進(jìn)行之前手頭上的工作
- 6.5 maven知識(shí)點(diǎn)
- 6.5.1. 倉(cāng)庫(kù)的概念
- 6.5.2. pom詳解
- 6.5.3. maven命令
- 6.5.4. 繼承
- 6.5.5. 聚合
- 6.5.6. 依賴沖突
- 6.5.7. SNAPSHOT
- 6.6 maven搭建多模塊項(xiàng)目
- 6.6.1. 建立父模塊
- 6.6.2. 整合兩個(gè)子模塊
- 6.6.3. 模塊A依賴模塊B
- 6.7. spring boot核心原理
- 6.7.1. 自動(dòng)配置
- 6.7.2. 起步依賴
- 6.8. 簡(jiǎn)潔代碼
- 6.8.1. 規(guī)范統(tǒng)一的類和方法注釋
- 6.8.2. 邏輯的注釋
- 6.9. 組織包結(jié)構(gòu)
- 6.9.1. config包
- 6.9.2. core包
- 6.9.3. modular包
- 6.10. 常量和枚舉
- 6.10.1. 常量
- 6.10.2. 枚舉
- 6.11. 接口和抽象類
- 6.11.1. 接口多用在制定規(guī)范
- 6.11.2. 抽象類多用在封裝
六、 git核心概念
6.1. git學(xué)習(xí)地址
git是開(kāi)發(fā)所需要必備的非常重要的基礎(chǔ)技能 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
6.2. github和碼云的介紹
watch,star和fork的作用,詳情見(jiàn)視頻
6.3. git常用命令和操作
6.3.1. 命令行常用命令
# 克隆倉(cāng)庫(kù) git clone xxx# 查看當(dāng)前狀態(tài) git status# 新建分支 git checkout -b dev# 切換分支 git checkout dev# 拉取代碼 git pull git pull origin master:master# 提交代碼 git push origin master# 打tag git tag -a v1.0 -m "正式發(fā)布1.0"# stash git stash# unstash git stash pop6.3. IDEA操作方法(具體看視頻)
6.3.1. 合并分支
6.3.2. compare with
6.3.3. rename
6.3.4. 看歷史記錄(所有的和單個(gè)文件的)
6.3.5. revert 6.stash
6.3.7. cherry pick
6.3.8. reset curent branch
6.4 git技巧
6.4.1. 分支用法實(shí)戰(zhàn)
master分支:上線用,跟線上代碼保持一致。 dev分支:開(kāi)發(fā)分支,開(kāi)發(fā)人員寫完提到本分支。 test分支:相對(duì)穩(wěn)定的分支,供上線前的測(cè)試。 feature分支:開(kāi)發(fā)部分功能用的分支。 bug分支:修復(fù)線上bug用。 分支的作用:一方面分支的建立可以讓并行開(kāi)發(fā)互不影響,另一方面,分支的建立可以讓代碼保留多種狀態(tài)。
6.4.2. 解決沖突
沖突產(chǎn)生于合并代碼,拉取遠(yuǎn)程代碼的時(shí)候,會(huì)經(jīng)常遇到。 產(chǎn)生沖突的時(shí)候建議用IDEA解決,很智能,很方便,如果你不用IDEA開(kāi)發(fā),同樣的我建議你用IDEA開(kāi)發(fā),感覺(jué)比Eclipse好些。
為了解決沖突時(shí),不會(huì)丟失你自己寫的本地代碼,不要先pull代碼,再去提交代碼,每次要先commit你的代碼再去pull代碼,再去解決沖突。這和svn不一樣,svn是以一個(gè)文件為一個(gè)提交單位,git是以一整個(gè)commit為一個(gè)提交單位。
合并時(shí)候,重點(diǎn)是比對(duì),你和別人代碼沖突的部分,如果你不確定該用誰(shuí)的代碼,一定要詢問(wèn)和你代碼沖突部分是誰(shuí)寫的,你們商量一下,或者直接請(qǐng)示你的項(xiàng)目負(fù)責(zé)人。
在idea中,出現(xiàn)沖突會(huì)提示如下,
解決沖突過(guò)程如下,
6.4.3. rebase
merge和rebase都可以理解為合并的意思,merge合并之后會(huì)產(chǎn)生新的提交記錄,rebase不會(huì)產(chǎn)生新的記錄,而是把所有兩個(gè)分支的提交歸并為一條線上。
在拉取代碼的時(shí)候,我們一般選rebase,如下
但是在合并代碼的時(shí)候我們選merge,為了體現(xiàn)合并的過(guò)程,合并代碼的時(shí)候我們一般用–no-ff模式,禁用fast-forward模式,并加上注釋-m
6.4.4. bug修復(fù)流程
如果生產(chǎn)環(huán)境出現(xiàn)bug,若不是很緊急,可以在dev分支開(kāi)發(fā),等下次上線一起發(fā)布,如果bug需要緊急修復(fù),請(qǐng)按以下步驟進(jìn)行:
6.4.4.1. 暫存手頭工作(如果有沒(méi)完成的工作的話)
如果手頭有沒(méi)寫完的代碼,并且不能提交,提交后可能影響別人開(kāi)發(fā),那么可以把這些沒(méi)寫完的代碼進(jìn)行暫存(git stash),等修復(fù)完bug之后,再恢復(fù)這些代碼(git stash pop),如果用的IDEA,可以選擇如下選項(xiàng)
然后填入備注信息:
6.4.4.2. 新建bugfix分支
stash完之后,切換到master分支(master為線上的代碼),在master分支新建一個(gè)bugfix分支,例如訂單詳情有個(gè)bug需要修復(fù)
image_1d2puvmr714d959e1lem1chkisp13.png-25.2kB
之后,在此分支修復(fù)bug,改完后可不提交到遠(yuǎn)程倉(cāng)庫(kù),如果多人協(xié)作修改這個(gè)bug,需要提交到遠(yuǎn)程分支。
6.4.4.3. 測(cè)試bug是否修復(fù)完成
代碼寫完之后,本地進(jìn)行測(cè)試,也可以在jenkins上發(fā)布到test環(huán)境測(cè)試一下,確保bug修復(fù)完畢,并且沒(méi)有影響到其他業(yè)務(wù)運(yùn)行。
6.4.4.4. 合并分支
合并剛才創(chuàng)建的bugfix_order_detail分支到master分支,并打標(biāo)簽,如下
git merge bugfix_order_detail --no-ff -m "合并bugfix_order_detail到master,修復(fù)了訂單詳情顯示的問(wèn)題"上線成功后,可刪除掉本地的bugfix_order_detail分支。
6.4.4.5. 繼續(xù)進(jìn)行之前手頭上的工作
恢復(fù)暫存的代碼,如下
或者直接用命令
6.5 maven知識(shí)點(diǎn)
6.5.1. 倉(cāng)庫(kù)的概念
本地倉(cāng)庫(kù): 本地存放jar包的地方,默認(rèn)存放路徑在路徑名為
.m2/respository/,可以再settings.xml中配置。
-
中央倉(cāng)庫(kù):
Maven 中央倉(cāng)庫(kù)是由 Maven 社區(qū)提供的倉(cāng)庫(kù),其中包含了大量常用的庫(kù)。中央倉(cāng)庫(kù)包含了絕大多數(shù)流行的開(kāi)源Java構(gòu)件,以及源碼、作者信息、SCM、信息、許可證信息等。一般來(lái)說(shuō),簡(jiǎn)單的Java項(xiàng)目依賴的構(gòu)件都可以在這里下載到。 -
nexus私服:
開(kāi)發(fā)人員自己定制倉(cāng)庫(kù),包含了所需要的代碼庫(kù)或者其他工程中用到的 jar 文件。一般公司都會(huì)搭建一個(gè)自己的私服,加快jar包下載速度,也可以deploy公司內(nèi)部的jar包。
6.5.2. pom詳解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"><!-- 父項(xiàng)目坐標(biāo) --><parent><!--被繼承的父項(xiàng)目的構(gòu)件標(biāo)識(shí)符 --><artifactId /><!--被繼承的父項(xiàng)目的全球唯一標(biāo)識(shí)符 --><groupId /><!--被繼承的父項(xiàng)目的版本 --><version /><!-- 父項(xiàng)目的pom.xml文件的相對(duì)路徑 --><relativePath /></parent><!--項(xiàng)目的全球唯一標(biāo)識(shí)符,通常使用全限定的包名區(qū)分該項(xiàng)目和其他項(xiàng)目。 --><groupId>asia.banseon</groupId><!-- 構(gòu)件的標(biāo)識(shí)符,它和group ID一起唯一標(biāo)識(shí)一個(gè)構(gòu)件 --><artifactId>banseon-maven2</artifactId><!--項(xiàng)目產(chǎn)生的構(gòu)件類型,jar、war、pom。 --><packaging>jar</packaging><!--項(xiàng)目當(dāng)前版本,格式為:主版本.次版本.增量版本-限定版本號(hào) --><version>1.0-SNAPSHOT</version><!--項(xiàng)目的名稱, Maven產(chǎn)生的文檔用 --><name>banseon-maven</name><!-- 項(xiàng)目的詳細(xì)描述, Maven 產(chǎn)生的文檔用. --><description>A maven project to study maven.</description><!-- 項(xiàng)目?jī)?nèi)的一些常量 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><jwt.version>0.9.0</jwt.version></properties><!-- 項(xiàng)目的依賴管理 --><dependencyManagement><dependencies></dependencies></dependencyManagement><!-- 項(xiàng)目的依賴 --><dependencies><dependency><groupId>cn.stylefeng.roses</groupId><artifactId>kernel-core</artifactId><version>1.1.0</version><!-- 排除依賴 --><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency></dependencies><!-- 項(xiàng)目構(gòu)建配置 --><build><!-- 插件 --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.7.0</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins><!-- 資源文件夾 --><resources><resource><directory>src/main/resources</directory></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources></build><!-- 不同環(huán)境構(gòu)建參數(shù) --><profiles><profile><id>local</id><properties><spring.active>local</spring.active></properties><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>dev</id><properties><spring.active>dev</spring.active></properties></profile></profiles></project>6.5.3. maven命令
# 1. 清除工作空間編譯的文件 mvn clean# 2. 編譯并打包 mvn package# 3. 編譯打包構(gòu)建到本地倉(cāng)庫(kù) mvn install# 4. 發(fā)布到遠(yuǎn)程倉(cāng)庫(kù) mvn deploy# 5. 跳過(guò)測(cè)試 -Dmaven.test.skip=true6.5.4. 繼承
子maven模塊可以繼承父maven模塊的一些屬性。子模塊可以用如下一段配置來(lái)繼承某個(gè)父模塊。
<parent> <groupId>com.xxx</groupId><artifactId>parent-project</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../pom.xml</relativePath> </parent>6.5.5. 聚合
父模塊可以用如下一段配置來(lái)聚合多個(gè)子模塊,以便在clean和package等命令時(shí),自動(dòng)幫我們執(zhí)行父子模塊的操作。一般父模塊的packaging屬性為pom。
<modules><module>moduleA</module> <module>moduleB</module> <module>moduleC</module> </modules>6.5.6. 依賴沖突
Maven采用"最近獲勝策略"的方式處理依賴沖突。如下圖,resolev-web會(huì)依賴project-
解決方法: 第一種,顯式加入對(duì)project-common 2.0版本的依賴。
<dependency> <groupId>project-common</groupId> <artifactId>project-commmon</artifactId> <version>2.0</version> </dependency>第二種,resolve-web對(duì)project-A的dependency聲明中,將project-common排除掉。
<dependency> <groupId>project-A</groupId> <artifactId>project-A</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>project-common</groupId> <artifactId>project-commmon</artifactId> </exclusion> </exclusions> </dependency>6.5.7. SNAPSHOT
在框架持續(xù)開(kāi)發(fā)期間,如果該框架被多個(gè)項(xiàng)目依賴,每次升級(jí)一個(gè)版本都要通知被調(diào)用的人,版本升級(jí)給調(diào)用者會(huì)帶來(lái)極大的不便,采用SNAPSHOT可以避免此問(wèn)題。
正式版本和快照版本的主要區(qū)別在于,本地獲取這些依賴的機(jī)制有所不同。假設(shè)你依賴一個(gè)庫(kù)的正式版本,構(gòu)建的時(shí)候構(gòu)建工具會(huì)先在本次倉(cāng)庫(kù)中查找是否已經(jīng)有了這個(gè)依賴庫(kù),如果沒(méi)有的話才會(huì)去遠(yuǎn)程倉(cāng)庫(kù)中去拉取。
快照版本會(huì)每隔一定時(shí)間去遠(yuǎn)程倉(cāng)庫(kù)拉去看有沒(méi)有更新的變化。頻率共有四種,分別是always、daily、interval(分鐘為單位)、never(跟正式版本一樣)。
<repositories><repository><id>xxx</id><url>xxx</url><snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots></repository> </repositories>6.6 maven搭建多模塊項(xiàng)目
6.6.1. 建立父模塊
<packing>改為pom,增加<modules>標(biāo)簽
6.6.2. 整合兩個(gè)子模塊
將子模塊的parent設(shè)置為父模塊的坐標(biāo)信息,相關(guān)的<version>可根據(jù)繼承,減少依賴。
6.6.3. 模塊A依賴模塊B
如果模塊之間需要引用,直接加入對(duì)方模塊坐標(biāo)即可
6.7. spring boot核心原理
推薦一本系統(tǒng)講解spring boot的書籍《Spring Boot實(shí)戰(zhàn)》Craig Walls著
6.7.1. 自動(dòng)配置
針對(duì)很多spring應(yīng)用程序常見(jiàn)的應(yīng)用功能,spring boot能自動(dòng)提供相關(guān)配置。
如何覆蓋自動(dòng)配置?
6.7.2. 起步依賴
告訴spring boot需要什么功能,他就能引入需要的庫(kù)。
6.8. 簡(jiǎn)潔代碼
6.8.1. 規(guī)范統(tǒng)一的類和方法注釋
/*** 修改用戶狀態(tài),返回修改生效的行數(shù)** @param userId 用戶id* @param status 用戶的狀態(tài)* @return 被修改的行數(shù)* @author fengshuonan* @Date 2019/2/24 21:34*/int setStatus(@Param("userId") Long userId, @Param("status") String status);/*** 跳轉(zhuǎn)到角色列表頁(yè)面** @author fengshuonan* @Date 2018/12/23 6:30 PM*/ @RequestMapping("") public String index() {return PREFIX + "/role.html"; }6.8.2. 邏輯的注釋
//如果開(kāi)啟了記住我功能 if ("on".equals(remember)) {token.setRememberMe(true); } else {token.setRememberMe(false); }//執(zhí)行shiro登錄操作 currentUser.login(token);//登錄成功,記錄登錄日志 ShiroUser shiroUser = ShiroKit.getUserNotNull(); LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp()));6.9. 組織包結(jié)構(gòu)
在日常開(kāi)發(fā)中,業(yè)務(wù)模塊的包結(jié)構(gòu)劃分一般劃分為三個(gè)config、core、modular
6.9.1. config包
config包存放整個(gè)模塊的配置類,因?yàn)轫?xiàng)目基于spring boot開(kāi)發(fā),大部分的spring配置都換成了java bean方式的配置,所以單獨(dú)分一個(gè)包來(lái)存放配置,config包中除了存放配置類,還有一些以Properties結(jié)尾的類,這些類的作用是啟動(dòng)應(yīng)用的時(shí)候把a(bǔ)pplication.yml中的配置映射到類的屬性上
6.9.2. core包
core包存放當(dāng)前模塊所運(yùn)行的一些核心機(jī)制,例如全局的異常攔截器,日志AOP,權(quán)限的AOP,項(xiàng)目初始化后的監(jiān)聽(tīng)器,工具類等,還可以存放一些對(duì)某些框架的擴(kuò)展,例如對(duì)beetl模板的擴(kuò)展配置和工具類,對(duì)flowable的擴(kuò)展類,shiro的一些拓展類等等
6.9.3. modular包
modular存放按業(yè)務(wù)劃分的業(yè)務(wù)代碼,若本模塊中包含多個(gè)模塊業(yè)務(wù),則在modular中建立多個(gè)業(yè)務(wù)包,在具體的業(yè)務(wù)包下再建立controller、entity、service、factory、mapper、model、service、wrapper這幾個(gè)包,如果當(dāng)前模塊中只存在一類業(yè)務(wù),那么沒(méi)有必要在modular包下再建立多個(gè)業(yè)務(wù)模塊,可直接在modular模塊建立controller、entity、service等等
這樣拆分的好處在于把業(yè)務(wù),配置和運(yùn)行機(jī)制清晰的拆分開(kāi),提高項(xiàng)目的可維護(hù)性,加快項(xiàng)目的開(kāi)發(fā)效率!
6.10. 常量和枚舉
目的:更優(yōu)雅的寫出代碼,避免出現(xiàn)魔法值。
6.10.1. 常量
代碼中的固定值,一般用public static final標(biāo)識(shí) 常用在某種標(biāo)識(shí)上,比如說(shuō)緩存前綴標(biāo)識(shí),系統(tǒng)環(huán)境常量等
表現(xiàn)的形勢(shì)一般分兩種:
public class DefaultSystem {public static final String DEFAULT_PWD = "111111"; } public interface DefaultSystem {String DEFAULT_PWD = "111111"; }6.10.2. 枚舉
一般用在狀態(tài)和類型等,這樣具有可列舉的項(xiàng)時(shí)使用。
- //第一種
- //第二種
- //第三種
6.11. 接口和抽象類
6.11.1. 接口多用在制定規(guī)范
1.Feign遠(yuǎn)程接口使用接口
@RequestMapping("/api/dict") public interface DictApi {@RequestMapping(value = "/addDict", method = RequestMethod.POST)void addDict(@RequestBody Dict dict);@RequestMapping(value = "/updateDict", method = RequestMethod.POST)void updateDict(@RequestBody Dict dict);@RequestMapping(value = "/deleteDict", method = RequestMethod.POST)void deleteDict(@RequestParam("dictId") Long dictId); }2.作為方法參數(shù),用一個(gè)接口,接收不同子類
public interface AbstractBaseExceptionEnum {/*** 獲取異常的狀態(tài)碼*/Integer getCode();/*** 獲取異常的提示信息*/String getMessage(); }3.為了拓展,寫不同的實(shí)現(xiàn),切換時(shí),減少代碼修改量
public interface SmsManager {/*** 發(fā)送短信** @param phoneNumber 電話號(hào)碼* @param templateCode 模板號(hào)碼* @param params 模板里參數(shù)的集合* @author fengshuonan* @Date 2018/7/6 下午2:32*/void sendSms(String phoneNumber, String templateCode, Map<String, Object> params);}有需要拓展的地方,預(yù)判是否需要接口。
6.11.2. 抽象類多用在封裝
1.封裝模板代碼,模板方法模式里常用
public abstract class AbstractTreeBuildFactory<T> {/*** 樹(shù)節(jié)點(diǎn)構(gòu)建整體過(guò)程** @author fengshuonan* @Date 2018/7/26 上午9:45*/public List<T> doTreeBuild(List<T> nodes) {//構(gòu)建之前的節(jié)點(diǎn)處理工作List<T> readyToBuild = beforeBuild(nodes);//具體構(gòu)建的過(guò)程List<T> builded = executeBuilding(readyToBuild);//構(gòu)建之后的處理工作return afterBuild(builded);}/*** 構(gòu)建之前的處理工作** @author fengshuonan* @Date 2018/7/26 上午10:10*/protected abstract List<T> beforeBuild(List<T> nodes);/*** 具體的構(gòu)建過(guò)程** @author fengshuonan* @Date 2018/7/26 上午10:11*/protected abstract List<T> executeBuilding(List<T> nodes);/*** 構(gòu)建之后的處理工作** @author fengshuonan* @Date 2018/7/26 上午10:11*/protected abstract List<T> afterBuild(List<T> nodes); }2.封裝核心算法到抽象類,子類只需繼承,并編寫一小部分邏輯實(shí)現(xiàn)整個(gè)類功能
public abstract class BaseControllerWrapper {...@SuppressWarnings("unchecked")public <T> T wrap() {/*** 包裝結(jié)果*/if (single != null) {wrapTheMap(single);}if (multi != null) {for (Map<String, Object> map : multi) {wrapTheMap(map);}}/*** 根據(jù)請(qǐng)求的參數(shù)響應(yīng)*/if (page != null) {return (T) page;}if (pageResult != null) {return (T) pageResult;}if (single != null) {return (T) single;}if (multi != null) {return (T) multi;}return null;}protected abstract void wrapTheMap(Map<String, Object> map); }5.5 業(yè)務(wù)異常
試著想象一下下面的場(chǎng)景
例如一個(gè)下單邏輯,首先經(jīng)過(guò)Controller,之后Controller調(diào)用了AService,Aservice調(diào)用了BService,Bservice調(diào)用了CService
經(jīng)過(guò)了這4層的業(yè)務(wù)邏輯后,在CService的代碼里有個(gè)判斷,如下
if(用戶余額 < 0){
直接返回這個(gè)“用戶余額”為0的消息給前端
}
常規(guī)的方法,CService返回給BService,B返回給A,A返回給控制器
那么,有沒(méi)有更方便的方法?
有的,那就是用自定義異常
首先,創(chuàng)建一個(gè)屬于系統(tǒng)的自定義異常
那么,如何使用,在程序的控制器層,service層都可以拋出異常
//判斷當(dāng)前用戶id不是超級(jí)管理員的用戶id,一言不合就拋出異常
if (userId.equals(Const.ADMIN_ID)) {
throw new ServiceException(BizExceptionEnum.CANT_CHANGE_ADMIN);
}
如果程序制定到這個(gè)邏輯,判斷成立的話,看一下前端接收到內(nèi)容是啥
{
“code”:600,
“data”:"",
“exceptionClazz”:"",
“message”:“不能刪除超級(jí)管理員”,
“success”:false
}
疑問(wèn)?在哪里攔截的異常
全局統(tǒng)一攔截的異常,cn.stylefeng.guns.core.aop.GlobalExceptionHandler
@ControllerAdvice控制器加強(qiáng)
@ExceptionHandler(ServiceException.class)攔截制定參數(shù)的異常,攔截到之后執(zhí)行方法內(nèi)的邏輯
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)返回前端的http狀態(tài)碼
整體寫法跟spring mvc的控制器很相似
@ControllerAdvice
@Order(-1)
public class GlobalExceptionHandler {
}
6.1 項(xiàng)目導(dǎo)入和運(yùn)行
1.項(xiàng)目導(dǎo)入
登錄https://gitee.com/stylefeng/roses,找到子項(xiàng)目地址 image.png-48.6kB
可fork之后clone,也可直接下載zip包 image.png-86kB
之后打開(kāi)idea點(diǎn)open,選擇下載的項(xiàng)目即可 image.png-16.5kB
2.項(xiàng)目的運(yùn)行
導(dǎo)入完所有項(xiàng)目后,可按如下步驟啟動(dòng)各個(gè)組件
啟動(dòng)roses-config-server配置中心
啟動(dòng)roses-cloud-register注冊(cè)中心
啟動(dòng)roses-spring-boot-admin監(jiān)控中心
啟動(dòng)roses-system系統(tǒng)管理基礎(chǔ)服務(wù)
啟動(dòng)roses-gateway網(wǎng)關(guān)
3.如何修改roses-kernel核心框架
如果公司業(yè)務(wù)的開(kāi)發(fā),需要涉及到框架的修改,則可以導(dǎo)入roses-kernel項(xiàng)目,然后修改,升級(jí)版本,mvn install到本地倉(cāng)庫(kù)或者公司的私服(推薦)即可。
6.2 快速開(kāi)發(fā)微服務(wù)
1.服務(wù)提供者
在roses-system開(kāi)發(fā)一個(gè)provider作為服務(wù)提供者。
1.編寫api
/**
-
示例服務(wù)
-
@author fengshuonan
-
@Date 2019/3/7 8:17 PM
*/
@RequestMapping("/api/example")
public interface ExampleSysApi {/**
- 測(cè)試遠(yuǎn)程接口
- @author fengshuonan
- @Date 2019/3/7 8:17 PM
*/
@RequestMapping(value = “/test1”, method = RequestMethod.POST)
ResponseData test1(@RequestParam(“param”) String param);
}
2.編寫provider
2.服務(wù)消費(fèi)者
1.引入openfeign包
4.編寫消費(fèi)者接口
/*** 測(cè)試服務(wù)消費(fèi)者** @author fengshuonan* @date 2018-08-07-下午3:12*/ @FeignClient("roses-system") public interface ExampleServiceConsumer extends ExampleSysApi {}5.注入消費(fèi)者,調(diào)用接口,編寫測(cè)試
/*** 網(wǎng)關(guān)服務(wù)** @author fengshuonan* @Date 2017/11/10 上午11:24*/ @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableFeignClients(basePackages = "cn.stylefeng.roses.gateway.modular.consumer") @EnableZuulProxy public class RosesGatewayApplication {@Autowiredprivate ExampleServiceConsumer exampleServiceConsumer;public static void main(String[] args) {SpringApplication.run(RosesGatewayApplication.class, args);}@Beanpublic CommandLineRunner commandLineRunner() {return new CommandLineRunner() {@Overridepublic void run(String... args) throws Exception {System.out.println(exampleServiceConsumer.test1("123"));}};}}想學(xué)習(xí)更多微服務(wù)、分布式、中間件、數(shù)據(jù)庫(kù)、項(xiàng)目快速構(gòu)建等系列技術(shù)
請(qǐng)?jiān)L問(wèn)http://gblfy.com
讓我們一起進(jìn)步!!!
總結(jié)
以上是生活随笔為你收集整理的(Docker实战) 第六篇:建立持续集成环境03的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CentOS 7 CentOS7查看开
- 下一篇: Swagger的描述注释配置详解