使用Docker安裝Apollo並使用SpringBoot連線設定中心

2023-07-27 18:00:35

上篇文章我們學習了Apollo的本地安裝,如果還不會本地安裝的朋友可以檢視之前的文章進行了解和學習連結地址(https://www.cnblogs.com/eternality/p/17583023.html),本篇我們學習怎麼使用Docker安裝Apollo及如何使用Java連線Apollo。閱讀本篇文章需要了解docker安裝容器相關的使用命令,還不懂docker的朋友請學習完docker後在來檢視本篇文章。

1、使用docker搜尋映象

執行docker命令進行映象搜尋

docker search apolloconfig/apollo

執行成功後,可以檢視到apollo的三個服務容器映象。

2、拉取apollo映象

執行docker pull命令進行映象拉取,版本自行選擇,預設拉取最新的映象資源。

docker pull apolloconfig/apollo-configservice:latest

docker pull apolloconfig/apollo-adminservice:latest

docker pull apolloconfig/apollo-portal:latest

3、啟動Apollo

拉取完docker映象後,就可以直接通過映象建立apollo相關容器了,不需要額外的設定apollo的資訊。可以在建立容器的時候設定相關引數。

3.1、建立容器apollo-configservice並啟動

docker run -d --name apollo-configservice -p 7800:8080 --privileged=true
-v 宿主機紀錄檔路徑:/opt/logs 
-e SPRING_DATASOURCE_URL="jdbc:mysql://資料庫地址:3306/ApolloConfigDB?characterEncoding=utf8" 
-e SPRING_DATASOURCE_USERNAME=資料庫賬號
-e SPRING_DATASOURCE_PASSWORD=資料庫密碼
--link mysql-server 
 apolloconfig/apollo-configservice

--link mysql-server  #由於mysql也是使用docker啟動的,所以可以使用該引數進行容器互聯,資料庫地址改為:mysql-server。即完整命令如下:

docker run -d --name apollo-configservice -p 7800:8080 --privileged=true
-v /apollo/apollo-docker/config/logs:/opt/logs 
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql-server:3306/ApolloConfigDB?characterEncoding=utf8" 
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=1234qwer
--link mysql-server 
 apolloconfig/apollo-configservice

執行命令之前需要我們改一下資料庫的Eureka服務連線地址Url,需要連線上configservice的設定中心,不然啟動會報錯。在ApolloConfigDB資料庫ServerConfig表的eureka.service.url的value的值進行修改。

3.2、建立容器apollo-adminservice並啟動

docker run -d --name apollo-adminservice  --net=host  --privileged=true
-v 宿主機紀錄檔路徑:/opt/logs  
-e SPRING_DATASOURCE_URL="jdbc:mysql://資料庫地址:3306/ApolloConfigDB?characterEncoding=utf8" 
-e SPRING_DATASOURCE_USERNAME=資料庫賬號
-e SPRING_DATASOURCE_PASSWORD=資料庫密碼
apolloconfig/apollo-adminservice

--net=host不需要再做埠對映,直接佔用宿主機的IP和埠號,adminservice使用預設埠8090。當然也可以和建立configservice一樣,在建立的時候使用埠對映 -p 引數,這樣在執行命令時把--net=host 去掉就可以了加上-p。之所以這樣寫的原因是因為我想試一下其他的建立方式。所以在我們建立容器的時候完全可以按照自己的方式進行建立適合自己使用的容器,我這裡只做引導。有句話做叫:能用就行 ~哈哈 。貼上下完整啟動命令:

docker run -d --name apollo-adminservice  --net=host --privileged=true
-v /apollo/apollo-docker/admin/logs:/opt/logs  
-e SPRING_DATASOURCE_URL="jdbc:mysql://172.25.96.1:3306/ApolloConfigDB?characterEncoding=utf8" 
-e SPRING_DATASOURCE_USERNAME=root 
-e SPRING_DATASOURCE_PASSWORD=1234qwer  
apolloconfig/apollo-adminservice

順便說一下:在不使用容器互聯的情況下,資料庫地址需要設定為安裝MySQL資料庫的地址,要保證容器可以連通MySQL資料庫。下面我們就改啟動最後一個服務了。

3.3 建立容器apollo-portal並啟動

docker run -d --name apollo-portal  -p 8000:8070 --privileged=true
-v 宿主機紀錄檔路徑:/opt/logs  
-e SPRING_DATASOURCE_URL="jdbc:mysql://資料庫地址:3306/ApolloPortalDB?characterEncoding=utf8" 
-e SPRING_DATASOURCE_USERNAME=資料庫賬號  
-e SPRING_DATASOURCE_PASSWORD=資料庫密碼
-e APOLLO_PORTAL_ENVS=dev  
-e DEV_META=http://伺服器ip地址:8070 \
apolloconfig/apollo-portal

APOLLO_PORTAL_ENVS:對應ApolloPortalDB中的apollo.portal.envs設定項,如果沒有在資料庫中設定,可以通過此環境引數設定
DEV_META:設定對應環境configservice的地址,以${ENV}_META命名,如果ApolloPortalDB中ServerConfig設定了apollo.portal.meta.servers,則以apollo.portal.meta.servers中的設定為準

完整命令

docker run -d --name apollo-portal  -p 8000:8070 --privileged=true
-v /apollo/apollo-docker/portal/logs:/opt/logs  
-e SPRING_DATASOURCE_URL="jdbc:mysql://172.25.96.1:3306/ApolloPortalDB?characterEncoding=utf8" 
-e SPRING_DATASOURCE_USERNAME=root 
-e SPRING_DATASOURCE_PASSWORD=1234qwer  
-e APOLLO_PORTAL_ENVS=dev  
-e DEV_META=http://172.25.96.1:7800  
apolloconfig/apollo-portal

設定Meta Servers地址,也就是configservice的連線地址,在ApolloPortalDB資料庫的ServerConfig表的apollo.portal.meta.servers的value中進行設定。和上面的DEV_META一致。

4、服務設定中心

執行完上面命令後,我們的設定中心就啟動了。可以檢視容器啟動命令

docker ps

輸出上面內容說明我們的容器啟動成功了,存取伺服器埠IP:8000可以進行存取,預設的使用者名稱是apollo,密碼是admin。

登入成功

 

5、建立應用

登入成功後,我們建立一個應用,在應用裡面新增一個設定資訊,並行布相關設定。下面會通過Spring boot連線設定中心,檢視是否可以獲取到相關設定資訊。

6、使用Spring boot連線設定中心

首先需要新增Maven依賴

        <properties>
            <apollo.version>1.1.0</apollo.version>
        </properties>

        <!--攜程開源框架 設定中心-->
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>${apollo.version}</version>
        </dependency>

在Resources資源下面建立application.properties組態檔進行連線設定中心

#阿波羅設定
app.id=spring-cloud-config-dev  #應用ID
apollo.meta=http://172.25.96.1:7800 #Meta Servers連線地址 ,即configservice連線地址
apollo.bootstrap.enabled=true  #springboot在啟動階段就會載入
apollo.bootstrap.namespaces=spring-cloud-management # namespace名稱
apollo.bootstrap.eagerLoad.enabled=true #將Apollo設定載入提到初始化紀錄檔系統之前。

建立一個controller進行測試

@RestController
public class ApolloController {

    @Value("${apollo.config.value}")
    private Boolean cache;

    @GetMapping("/apollo")
    public String quick(){
        return "服務設定獲取的值:" + cache;
    }
}

在啟動的時候,啟動類需要加上@EnableApolloConfig註解開啟設定中心

@SpringBootApplication
@EnableEurekaClient
//開啟設定中心
@EnableApolloConfig
//@EnableDiscoveryClient
public class ApolloApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(ApolloApplication.class, args);
    }

}

下面就需要啟動專案進行測試了,注意在啟動的時候會報一個錯誤,設定中心連線超時:

WARN 12344 --- [ngPollService-1] c.c.f.a.i.RemoteConfigLongPollService    : Long polling failed, will retry in 1 seconds. appId: spring-cloud-config-dev, cluster: default, namespaces: spring-cloud-management, 
long polling url: http://172.17.0.3:8080/notifications/v2?cluster=default&appId=spring-cloud-config-dev&ip=192.168.1.108&notifications=%5B%7B%22namespaceName%22%3A%22spring-cloud-management%22%2C%22notificationId%22%3A-1%7D%5D,
reason: Could not complete get operation [Cause: connect timed out]

原因是我們使用docker安裝,docker容器內部會分配一個ip地址,此時我們只需要在idea上啟動類新增 -Dapollo.configService=http://172.25.96.1:7800 指定config service地址。

設定完成後,再次啟動發現啟動成功了。我們使用postman呼叫剛剛寫的介面:

發現設定資訊已經獲取到了,在設定中心修改一下引數的值,改為false再次釋出:

再次呼叫postman:

發現值也已經更新成功了。到此我們的Apollo設定中心也就部署完畢了,感謝閱讀。