使用Docker安装Apollo并使用SpringBoot连接配置中心

发布时间 2023-07-27 17:11:03作者: sowler

上篇文章我们学习了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配置中心也就部署完毕了,感谢阅读。