日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(Docker实战) 第六篇:建立持续集成环境03

發布時間:2024/9/27 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (Docker实战) 第六篇:建立持续集成环境03 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標簽: gblfy技術文檔

文章目錄

  • 六、 git核心概念
    • 6.1. git學習地址
    • 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. 看歷史記錄(所有的和單個文件的)
      • 6.3.5. revert 6.stash
      • 6.3.7. cherry pick
      • 6.3.8. reset curent branch
    • 6.4 git技巧
      • 6.4.1. 分支用法實戰
      • 6.4.2. 解決沖突
      • 6.4.3. rebase
      • 6.4.4. bug修復流程
        • 6.4.4.1. 暫存手頭工作(如果有沒完成的工作的話)
        • 6.4.4.2. 新建bugfix分支
        • 6.4.4.3. 測試bug是否修復完成
        • 6.4.4.4. 合并分支
        • 6.4.4.5. 繼續進行之前手頭上的工作
    • 6.5 maven知識點
      • 6.5.1. 倉庫的概念
      • 6.5.2. pom詳解
      • 6.5.3. maven命令
      • 6.5.4. 繼承
      • 6.5.5. 聚合
      • 6.5.6. 依賴沖突
      • 6.5.7. SNAPSHOT
    • 6.6 maven搭建多模塊項目
      • 6.6.1. 建立父模塊
      • 6.6.2. 整合兩個子模塊
      • 6.6.3. 模塊A依賴模塊B
    • 6.7. spring boot核心原理
      • 6.7.1. 自動配置
      • 6.7.2. 起步依賴
    • 6.8. 簡潔代碼
    • 6.8.1. 規范統一的類和方法注釋
    • 6.8.2. 邏輯的注釋
    • 6.9. 組織包結構
      • 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. 接口多用在制定規范
      • 6.11.2. 抽象類多用在封裝

六、 git核心概念

6.1. git學習地址

git是開發所需要必備的非常重要的基礎技能 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

6.2. github和碼云的介紹

watch,star和fork的作用,詳情見視頻

6.3. git常用命令和操作

6.3.1. 命令行常用命令

# 克隆倉庫 git clone xxx# 查看當前狀態 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 "正式發布1.0"# stash git stash# unstash git stash pop

6.3. IDEA操作方法(具體看視頻)

6.3.1. 合并分支

6.3.2. compare with

6.3.3. rename

6.3.4. 看歷史記錄(所有的和單個文件的)

6.3.5. revert 6.stash

6.3.7. cherry pick

6.3.8. reset curent branch

6.4 git技巧

6.4.1. 分支用法實戰

master分支:上線用,跟線上代碼保持一致。 dev分支:開發分支,開發人員寫完提到本分支。 test分支:相對穩定的分支,供上線前的測試。 feature分支:開發部分功能用的分支。 bug分支:修復線上bug用。 分支的作用:一方面分支的建立可以讓并行開發互不影響,另一方面,分支的建立可以讓代碼保留多種狀態。

6.4.2. 解決沖突

沖突產生于合并代碼,拉取遠程代碼的時候,會經常遇到。 產生沖突的時候建議用IDEA解決,很智能,很方便,如果你不用IDEA開發,同樣的我建議你用IDEA開發,感覺比Eclipse好些。
為了解決沖突時,不會丟失你自己寫的本地代碼,不要先pull代碼,再去提交代碼,每次要先commit你的代碼再去pull代碼,再去解決沖突。這和svn不一樣,svn是以一個文件為一個提交單位,git是以一整個commit為一個提交單位。

合并時候,重點是比對,你和別人代碼沖突的部分,如果你不確定該用誰的代碼,一定要詢問和你代碼沖突部分是誰寫的,你們商量一下,或者直接請示你的項目負責人。

在idea中,出現沖突會提示如下,

解決沖突過程如下,

6.4.3. rebase

merge和rebase都可以理解為合并的意思,merge合并之后會產生新的提交記錄,rebase不會產生新的記錄,而是把所有兩個分支的提交歸并為一條線上。

在拉取代碼的時候,我們一般選rebase,如下

但是在合并代碼的時候我們選merge,為了體現合并的過程,合并代碼的時候我們一般用–no-ff模式,禁用fast-forward模式,并加上注釋-m

git merge dev --no-ff -m "合并dev到test,增加修改人員接口,修復多個bug,完善查看訂單功能,xxxxxxx"

6.4.4. bug修復流程

如果生產環境出現bug,若不是很緊急,可以在dev分支開發,等下次上線一起發布,如果bug需要緊急修復,請按以下步驟進行:

6.4.4.1. 暫存手頭工作(如果有沒完成的工作的話)

如果手頭有沒寫完的代碼,并且不能提交,提交后可能影響別人開發,那么可以把這些沒寫完的代碼進行暫存(git stash),等修復完bug之后,再恢復這些代碼(git stash pop),如果用的IDEA,可以選擇如下選項

然后填入備注信息:

6.4.4.2. 新建bugfix分支

stash完之后,切換到master分支(master為線上的代碼),在master分支新建一個bugfix分支,例如訂單詳情有個bug需要修復

image_1d2puvmr714d959e1lem1chkisp13.png-25.2kB

之后,在此分支修復bug,改完后可不提交到遠程倉庫,如果多人協作修改這個bug,需要提交到遠程分支。

6.4.4.3. 測試bug是否修復完成

代碼寫完之后,本地進行測試,也可以在jenkins上發布到test環境測試一下,確保bug修復完畢,并且沒有影響到其他業務運行。

6.4.4.4. 合并分支

合并剛才創建的bugfix_order_detail分支到master分支,并打標簽,如下

git merge bugfix_order_detail --no-ff -m "合并bugfix_order_detail到master,修復了訂單詳情顯示的問題"

上線成功后,可刪除掉本地的bugfix_order_detail分支。

6.4.4.5. 繼續進行之前手頭上的工作

恢復暫存的代碼,如下


或者直接用命令

git stash pop

6.5 maven知識點

6.5.1. 倉庫的概念

本地倉庫: 本地存放jar包的地方,默認存放路徑在路徑名為

.m2/respository/

,可以再settings.xml中配置。

  • 中央倉庫:
    Maven 中央倉庫是由 Maven 社區提供的倉庫,其中包含了大量常用的庫。中央倉庫包含了絕大多數流行的開源Java構件,以及源碼、作者信息、SCM、信息、許可證信息等。一般來說,簡單的Java項目依賴的構件都可以在這里下載到。

  • nexus私服:
    開發人員自己定制倉庫,包含了所需要的代碼庫或者其他工程中用到的 jar 文件。一般公司都會搭建一個自己的私服,加快jar包下載速度,也可以deploy公司內部的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"><!-- 父項目坐標 --><parent><!--被繼承的父項目的構件標識符 --><artifactId /><!--被繼承的父項目的全球唯一標識符 --><groupId /><!--被繼承的父項目的版本 --><version /><!-- 父項目的pom.xml文件的相對路徑 --><relativePath /></parent><!--項目的全球唯一標識符,通常使用全限定的包名區分該項目和其他項目。 --><groupId>asia.banseon</groupId><!-- 構件的標識符,它和group ID一起唯一標識一個構件 --><artifactId>banseon-maven2</artifactId><!--項目產生的構件類型,jar、war、pom。 --><packaging>jar</packaging><!--項目當前版本,格式為:主版本.次版本.增量版本-限定版本號 --><version>1.0-SNAPSHOT</version><!--項目的名稱, Maven產生的文檔用 --><name>banseon-maven</name><!-- 項目的詳細描述, Maven 產生的文檔用. --><description>A maven project to study maven.</description><!-- 項目內的一些常量 --><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><!-- 項目的依賴管理 --><dependencyManagement><dependencies></dependencies></dependencyManagement><!-- 項目的依賴 --><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><!-- 項目構建配置 --><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><!-- 不同環境構建參數 --><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. 編譯打包構建到本地倉庫 mvn install# 4. 發布到遠程倉庫 mvn deploy# 5. 跳過測試 -Dmaven.test.skip=true

6.5.4. 繼承

子maven模塊可以繼承父maven模塊的一些屬性。子模塊可以用如下一段配置來繼承某個父模塊。

<parent> <groupId>com.xxx</groupId><artifactId>parent-project</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../pom.xml</relativePath> </parent>

6.5.5. 聚合

父模塊可以用如下一段配置來聚合多個子模塊,以便在clean和package等命令時,自動幫我們執行父子模塊的操作。一般父模塊的packaging屬性為pom。

<modules><module>moduleA</module> <module>moduleB</module> <module>moduleC</module> </modules>

6.5.6. 依賴沖突

Maven采用"最近獲勝策略"的方式處理依賴沖突。如下圖,resolev-web會依賴project-

解決方法: 第一種,顯式加入對project-common 2.0版本的依賴。

<dependency> <groupId>project-common</groupId> <artifactId>project-commmon</artifactId> <version>2.0</version> </dependency>

第二種,resolve-web對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

在框架持續開發期間,如果該框架被多個項目依賴,每次升級一個版本都要通知被調用的人,版本升級給調用者會帶來極大的不便,采用SNAPSHOT可以避免此問題。

正式版本和快照版本的主要區別在于,本地獲取這些依賴的機制有所不同。假設你依賴一個庫的正式版本,構建的時候構建工具會先在本次倉庫中查找是否已經有了這個依賴庫,如果沒有的話才會去遠程倉庫中去拉取。

快照版本會每隔一定時間去遠程倉庫拉去看有沒有更新的變化。頻率共有四種,分別是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搭建多模塊項目

6.6.1. 建立父模塊

<packing>改為pom,增加<modules>標簽

6.6.2. 整合兩個子模塊

將子模塊的parent設置為父模塊的坐標信息,相關的<version>可根據繼承,減少依賴。

6.6.3. 模塊A依賴模塊B

如果模塊之間需要引用,直接加入對方模塊坐標即可

6.7. spring boot核心原理

推薦一本系統講解spring boot的書籍《Spring Boot實戰》Craig Walls著

6.7.1. 自動配置

針對很多spring應用程序常見的應用功能,spring boot能自動提供相關配置。

如何覆蓋自動配置?

6.7.2. 起步依賴

告訴spring boot需要什么功能,他就能引入需要的庫。

6.8. 簡潔代碼

6.8.1. 規范統一的類和方法注釋

/*** 修改用戶狀態,返回修改生效的行數** @param userId 用戶id* @param status 用戶的狀態* @return 被修改的行數* @author fengshuonan* @Date 2019/2/24 21:34*/int setStatus(@Param("userId") Long userId, @Param("status") String status);/*** 跳轉到角色列表頁面** @author fengshuonan* @Date 2018/12/23 6:30 PM*/ @RequestMapping("") public String index() {return PREFIX + "/role.html"; }

6.8.2. 邏輯的注釋

//如果開啟了記住我功能 if ("on".equals(remember)) {token.setRememberMe(true); } else {token.setRememberMe(false); }//執行shiro登錄操作 currentUser.login(token);//登錄成功,記錄登錄日志 ShiroUser shiroUser = ShiroKit.getUserNotNull(); LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp()));

6.9. 組織包結構

在日常開發中,業務模塊的包結構劃分一般劃分為三個config、core、modular

6.9.1. config包

config包存放整個模塊的配置類,因為項目基于spring boot開發,大部分的spring配置都換成了java bean方式的配置,所以單獨分一個包來存放配置,config包中除了存放配置類,還有一些以Properties結尾的類,這些類的作用是啟動應用的時候把application.yml中的配置映射到類的屬性上

6.9.2. core包

core包存放當前模塊所運行的一些核心機制,例如全局的異常攔截器,日志AOP,權限的AOP,項目初始化后的監聽器,工具類等,還可以存放一些對某些框架的擴展,例如對beetl模板的擴展配置和工具類,對flowable的擴展類,shiro的一些拓展類等等

6.9.3. modular包

modular存放按業務劃分的業務代碼,若本模塊中包含多個模塊業務,則在modular中建立多個業務包,在具體的業務包下再建立controller、entity、service、factory、mapper、model、service、wrapper這幾個包,如果當前模塊中只存在一類業務,那么沒有必要在modular包下再建立多個業務模塊,可直接在modular模塊建立controller、entity、service等等

這樣拆分的好處在于把業務,配置和運行機制清晰的拆分開,提高項目的可維護性,加快項目的開發效率!

6.10. 常量和枚舉

目的:更優雅的寫出代碼,避免出現魔法值。

6.10.1. 常量

代碼中的固定值,一般用public static final標識 常用在某種標識上,比如說緩存前綴標識,系統環境常量等

表現的形勢一般分兩種:

public class DefaultSystem {public static final String DEFAULT_PWD = "111111"; } public interface DefaultSystem {String DEFAULT_PWD = "111111"; }

6.10.2. 枚舉

一般用在狀態和類型等,這樣具有可列舉的項時使用。

  • //第一種
public enum Color { RED, GREEN, BLANK, YELLOW }
  • //第二種
public enum ManagerStatus {OK("ENABLE", "啟用"), FREEZED("LOCKED", "凍結"), DELETED("DELETED", "被刪除");String code;String message;ManagerStatus(String code, String message) {this.code = code;this.message = message;}public static String getDescription(String value) {...} }
  • //第三種
public enum BizExceptionEnum implements AbstractBaseExceptionEnum {TOKEN_EXPIRED(700, "token過期"),TOKEN_ERROR(700, "token驗證失敗");...@Overridepublic Integer getCode() {return code;}@Overridepublic String getMessage() {return message;} }

6.11. 接口和抽象類

6.11.1. 接口多用在制定規范

1.Feign遠程接口使用接口

@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.作為方法參數,用一個接口,接收不同子類

public interface AbstractBaseExceptionEnum {/*** 獲取異常的狀態碼*/Integer getCode();/*** 獲取異常的提示信息*/String getMessage(); }

3.為了拓展,寫不同的實現,切換時,減少代碼修改量

public interface SmsManager {/*** 發送短信** @param phoneNumber 電話號碼* @param templateCode 模板號碼* @param params 模板里參數的集合* @author fengshuonan* @Date 2018/7/6 下午2:32*/void sendSms(String phoneNumber, String templateCode, Map<String, Object> params);}

有需要拓展的地方,預判是否需要接口。

6.11.2. 抽象類多用在封裝

1.封裝模板代碼,模板方法模式里常用

public abstract class AbstractTreeBuildFactory<T> {/*** 樹節點構建整體過程** @author fengshuonan* @Date 2018/7/26 上午9:45*/public List<T> doTreeBuild(List<T> nodes) {//構建之前的節點處理工作List<T> readyToBuild = beforeBuild(nodes);//具體構建的過程List<T> builded = executeBuilding(readyToBuild);//構建之后的處理工作return afterBuild(builded);}/*** 構建之前的處理工作** @author fengshuonan* @Date 2018/7/26 上午10:10*/protected abstract List<T> beforeBuild(List<T> nodes);/*** 具體的構建過程** @author fengshuonan* @Date 2018/7/26 上午10:11*/protected abstract List<T> executeBuilding(List<T> nodes);/*** 構建之后的處理工作** @author fengshuonan* @Date 2018/7/26 上午10:11*/protected abstract List<T> afterBuild(List<T> nodes); }

2.封裝核心算法到抽象類,子類只需繼承,并編寫一小部分邏輯實現整個類功能

public abstract class BaseControllerWrapper {...@SuppressWarnings("unchecked")public <T> T wrap() {/*** 包裝結果*/if (single != null) {wrapTheMap(single);}if (multi != null) {for (Map<String, Object> map : multi) {wrapTheMap(map);}}/*** 根據請求的參數響應*/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 業務異常

  • 場景
    試著想象一下下面的場景
  • 例如一個下單邏輯,首先經過Controller,之后Controller調用了AService,Aservice調用了BService,Bservice調用了CService

    經過了這4層的業務邏輯后,在CService的代碼里有個判斷,如下

    if(用戶余額 < 0){
    直接返回這個“用戶余額”為0的消息給前端
    }
    常規的方法,CService返回給BService,B返回給A,A返回給控制器

    那么,有沒有更方便的方法?

    有的,那就是用自定義異常

  • 如何使用
    首先,創建一個屬于系統的自定義異常
  • /*** 業務異常的封裝** @author fengshuonan* @date 2016年11月12日 下午5:05:10*/ public class ServiceException extends RuntimeException {private Integer code;private String errorMessage;public ServiceException(Integer code, String errorMessage) {super(errorMessage);this.code = code;this.errorMessage = errorMessage;}public ServiceException(AbstractBaseExceptionEnum exception) {super(exception.getMessage());this.code = exception.getCode();this.errorMessage = exception.getMessage();}... }

    那么,如何使用,在程序的控制器層,service層都可以拋出異常

    //判斷當前用戶id不是超級管理員的用戶id,一言不合就拋出異常
    if (userId.equals(Const.ADMIN_ID)) {
    throw new ServiceException(BizExceptionEnum.CANT_CHANGE_ADMIN);
    }
    如果程序制定到這個邏輯,判斷成立的話,看一下前端接收到內容是啥

    {
    “code”:600,
    “data”:"",
    “exceptionClazz”:"",
    “message”:“不能刪除超級管理員”,
    “success”:false
    }
    疑問?在哪里攔截的異常

  • 統一攔截異常
    全局統一攔截的異常,cn.stylefeng.guns.core.aop.GlobalExceptionHandler
  • @ControllerAdvice控制器加強

    @ExceptionHandler(ServiceException.class)攔截制定參數的異常,攔截到之后執行方法內的邏輯

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)返回前端的http狀態碼

    整體寫法跟spring mvc的控制器很相似

    @ControllerAdvice
    @Order(-1)
    public class GlobalExceptionHandler {

    /*** 攔截業務異常*/ @ExceptionHandler(ServiceException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public ErrorResponseData bussiness(ServiceException e) {return new ErrorResponseData(e.getCode(), e.getMessage()); }...

    }
    6.1 項目導入和運行
    1.項目導入
    登錄https://gitee.com/stylefeng/roses,找到子項目地址 image.png-48.6kB

    可fork之后clone,也可直接下載zip包 image.png-86kB

    之后打開idea點open,選擇下載的項目即可 image.png-16.5kB

    2.項目的運行
    導入完所有項目后,可按如下步驟啟動各個組件

    啟動roses-config-server配置中心
    啟動roses-cloud-register注冊中心
    啟動roses-spring-boot-admin監控中心
    啟動roses-system系統管理基礎服務
    啟動roses-gateway網關

    3.如何修改roses-kernel核心框架
    如果公司業務的開發,需要涉及到框架的修改,則可以導入roses-kernel項目,然后修改,升級版本,mvn install到本地倉庫或者公司的私服(推薦)即可。

    6.2 快速開發微服務
    1.服務提供者
    在roses-system開發一個provider作為服務提供者。

    1.編寫api

    /**

    • 示例服務

    • @author fengshuonan

    • @Date 2019/3/7 8:17 PM
      */
      @RequestMapping("/api/example")
      public interface ExampleSysApi {

      /**

      • 測試遠程接口
      • @author fengshuonan
      • @Date 2019/3/7 8:17 PM
        */
        @RequestMapping(value = “/test1”, method = RequestMethod.POST)
        ResponseData test1(@RequestParam(“param”) String param);

    }
    2.編寫provider

    /*** 測試提供者** @author fengshuonan* @Date 2019/3/7 8:18 PM*/ @RestController public class ExampleSysProvider implements ExampleSysApi {@Autowiredprivate SysUserService sysUserService;@Overridepublic ResponseData test1(String param) {List<SysUser> list = sysUserService.list();return ResponseData.success(list);} }

    2.服務消費者
    1.引入openfeign包

    org.springframework.cloud spring-cloud-starter-openfeign 2.啟動類增加注解 @EnableFeignClients @EnableDiscoveryClient 3.配置eureka注冊地址eureka:instance:prefer-ip-address: truelease-expiration-duration-in-seconds: 20 lease-renewal-interval-in-seconds: 5 client:service-url:defaultZone: http://127.0.0.1:8761/eurekaregistry-fetch-interval-seconds: 10

    4.編寫消費者接口

    /*** 測試服務消費者** @author fengshuonan* @date 2018-08-07-下午3:12*/ @FeignClient("roses-system") public interface ExampleServiceConsumer extends ExampleSysApi {}

    5.注入消費者,調用接口,編寫測試

    /*** 網關服務** @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"));}};}}

    想學習更多微服務、分布式、中間件、數據庫、項目快速構建等系列技術
    請訪問http://gblfy.com
    讓我們一起進步!!!

    總結

    以上是生活随笔為你收集整理的(Docker实战) 第六篇:建立持续集成环境03的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。