分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster

前言

最近在回顾SpringCloud相关的知识点,有关于分布式配置中心这块还是决定总结一下携程开源的Apollo分布式配置中心。最初接触的时候是今年年初,当时刚到公司实习没多久,项目开始前培训框架的时候看技术架构介绍了解到新产品采用的分布式配置中心是Apollo,刚刚了解的时候就对这块很感兴趣,个人感觉比SpringCloud的ConfigServer要好用很多,自己做了一个简单的Demo,在毕业设计的项目中也有使用到,最后整理了一篇关于SpringBoot整合Apollo的博客。但是之前那篇博客中基本上使用的是一些比较基础的操作,像如何指定集群、指定多个namespaces、配置中心高可用以及配置信息的加密等操作都没有深入研究。在公司做项目的过程中也对Apollo有了新的理解,同时也学习了一个与Apollo相关的专栏和一篇公众号中的文章,这次也通过博客的形式再次进行梳理

一、Apollo分布式配置中心简介

Apollo(阿波罗)是携程的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景

1、Apollo基础模型

  • 用户在配置中心对配置进行修改并发布
  • 配置中心通知Apolllo客户端有配置更新
  • Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
    分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第1张图片

2、Apollo对比Spring Cloud Config

分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第2张图片

二、打包部署Apollo服务端

官方GitHub:https://github.com/ctripcorp/apollo(采用1.4.0版本)

1、将GitHub上的源码克隆到本地

git clone --branch v1.4.0 https://github.com/ctripcorp/apollo.git

其中几个比较重要的项目:

  • apollo-portal:提供Web界面供用户管理配置
  • apollo-adminservice:提供配置管理接口,提供配置修改、发布等接口,接口服务对象为Portal以及Eureka
  • apollo-configservice:提供配置获取接口,提供配置更新推送接口,接口服务对象为Apollo客户端
  • apollo-client:Apollo提供的客户端程序,为应用提供配置获取、实时更新等功能
    分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第3张图片
    配置发布的大致过程:用户在Portal操作配置发布,Portal调用Admin Service的接口操作发布,Admin Service发布配置后,发送ReleaseMessage给各个Config Service,Config Service收到ReleaseMessage后,通知对应的客户端

2、数据库初始化

ApolloPortalDB:执行scripts\docker-quick-start\sql\apolloportaldb.sql

ApolloConfigDB:执行scripts\docker-quick-start\sql\apolloconfigdb.sql

3、本地调整配置并打包

修改scripts中的配置文件build.bat或者build.sh

1)、数据库配置

# apollo config db info
apollo_config_db_url=jdbc:mysql://IP:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=123456

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://IP:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=123456

2)、修改环境调用地址

# meta server url, different environments should have different meta server addresses
dev_meta=http://IP:8080
fat_meta=http://IP:8080
uat_meta=http://IP:8080
pro_meta=http://IP:8080

3)、修改数据库数据

在ApolloConfigDB数据库中,找到表ServerConfig中的eureka.service.url配置项修改为http://IP:8080/eureka/

4)、编译打包

$ ./build.sh

该脚本会依次打包apollo-configservice, apollo-adminservice, apollo-portal和apollo-client

5)、获取apollo-configservice、apollo-adminservice、apollo-portal的安装包

位于apollo-configservice\target\目录下的apollo-configservice-1.4.0-github.zip

位于apollo-adminservice\target\目录下的apollo-adminservice-1.4.0-github.zip

位于apollo-portal\target\目录下的apollo-portal-1.4.0-github.zip

4、部署Apollo服务端

将apollo-configservice-1.4.0-github.zip、apollo-adminservice-1.4.0-github.zip、apollo-portal-1.4.0-github.zip上传到服务器中并解压

1)、修改apollo-configservice

SERVICE_NAME=apollo-configservice
## Adjust log dir if necessary
LOG_DIR=/apollo/apollo-configservice/log
## Adjust server port if necessary
SERVER_PORT=8080

2)、部署apollo-adminservice

SERVICE_NAME=apollo-adminservice
## Adjust log dir if necessary
LOG_DIR=/apollo/apollo-adminservice/log
## Adjust server port if necessary
SERVER_PORT=8090

3)、部署apollo-portal

SERVICE_NAME=apollo-portal
## Adjust log dir if necessary
LOG_DIR=/apollo/apollo-portal/log
## Adjust server port if necessary
SERVER_PORT=8070

如果部署在云服务器中可能需要添加额外配置,详细查看下面Apollo部署云服务器踩坑经历的内容

执行scripts目录下的startup.sh分别启动apollo-configservice、apollo-adminservice和apollo-portal(执行前确保LOG_DIR已经被创建)

nohup ./startup.sh &

启动成功后访问http://IP:8070/

默认用户名密码为:apollo/admin

查看系统信息确认configservice和adminservice是否启动成功
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第4张图片分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第5张图片

三、SpringBoot集成Apollo

1、添加相关依赖

        <dependency>
            <groupId>com.ctrip.framework.apollogroupId>
            <artifactId>apollo-clientartifactId>
            <version>1.4.0version>
        dependency>

2、在Apollo中维护配置信息

这是在使用Apollo之前项目中的一些配置信息,现在需要将一些配置迁移到Apollo上
在这里插入图片描述
在Apollo主界面点击创建项目,填写相关信息(这里应用id后面会用到),点击提交
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第6张图片
进到如下界面
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第7张图片
选择文本,点击修改配置,添加项目中需要Apollo来维护的配置,点击提交修改(也可以选择表格,点击新增配置一个一个新增)
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第8张图片
这时新增的配置状态为未发布,点击发布即可生效
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第9张图片

3、修改项目中配置

1)、application.properties配置文件

spring.application.name=hello-service
#项目信息中的AppId
app.id=hello-service
#apollo-configservice地址
apollo.meta=http://IP:Port
#指定集群,没有新建集群默认为default
apollo.cluster=default
#在项目启动的bootstrap阶段,向Spring容器注入配置信息
apollo.bootstrap.enabled=true
#默认会有一个名为application的namespace,多个使用,分隔
apollo.bootstrap.namespaces=application

2)、在主类上添加@EnableApolloConfig注解并启动项目即可

4、Apollo部署云服务器踩坑经历

在实际部署到云服务器的过程中遇到如下问题:

本地拉取云服务器中配置信息连接超时,日志中显示拉取配置的地址为内网IP地址

具体原因如下:

Apollo部署的时候,apollo-configservice和apollo-adminservice会把自己的IP和端口注册到Meta Server中(apollo-configservice本身),然后Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问

由于apollo-configservice和apollo-adminservice注册到MetaService中的IP为内网IP,导致Apollo客户端拉取配置的地址为内网地址

1)、方案一:

通过本地配置apollo.configService=http://config-service的公网IP:端口来跳过Meta Server的服务发现
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第10张图片
2)、方案二:

修改startup.sh指定要注册的IP,通过JVM System Property在运行时传入,如-Deureka.instance.ip-address=${指定的IP}

export JAVA_OPTS="$JAVA_OPTS -Deureka.instance.ip-address=IP -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.lo
g -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"

也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置

eureka:
  instance:
    ip-address: IP

3)、方案三:

修改startup.sh指定要注册的IP+PORT,通过JVM System Property在运行时传入,如-Deureka.instance.homePageUrl=http://${指定的IP}:${指定的Port}

export JAVA_OPTS="$JAVA_OPTS -Deureka.instance.homePageUrl=http://IP:Port -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.lo
g -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"

也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置

eureka:
  instance:
    homePageUrl: http://${指定的IP}:${指定的Port}
    preferIpAddress: false

使用方案二和方案三,在Apollo启动成功后,查看系统信息,如果Config Services和Admin Services中的Home Page Url为外网IP地址表示配置成功,然后在本地操作即可拉取到配置信息

详细参考官方文档的分布式部署指南中的网络策略

四、Apollo操作namespace、cluster

1、多个项目通过namespace共用配置

分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第11张图片分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第12张图片
上图中,AppId为hello-service和feign-consumer的两个项目的配置中,存在相同的配置信息,实际工作中不同的项目中会存在很多相同的配置信息,可以通过namespace来共用配置

首先,在Apollo中新建一个应用Id为common的项目,然后点击添加Namespace,选择创建Namespace,类型为public,并添加其他相关信息,点击提交
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第13张图片
在名为common的Namespace中,添加其他项目共用的配置信息
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第14张图片
然后分别到AppId为hello-service和feign-consumer的两个项目,点击添加Namespace,选择关联公共Namespace,关联到名为common的Namespace
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第15张图片
以hello-service为例,效果如下图,也可以在common中覆盖公共的配置
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第16张图片
修改项目的配置文件,还是以hello-service为例,hello-service项目中有一个名为application的私有namespace,还关联了一个名为common的namespace,在配置文件中指定apollo.bootstrap.namespaces属性存在多个namespace时使用,进行分隔

spring.application.name=hello-service
app.id=hello-service
apollo.meta=http://IP:Port
apollo.cluster=default
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application,common

2、Apollo操作cluster

在feign-consumer项目中,点击添加集群,添加相关信息,点击提交
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第17张图片
选择ali-test集群,添加相关配置并发布
分布式配置中心Apollo详解(一):简介、云服务器部署实践、SpringBoot集成、操作namespace和cluster_第18张图片
修改项目中的application.properties配置文件apollo.cluster属性为刚刚创建的集群名称ali-test

spring.application.name=feign-consumer
app.id=feign-consumer
apollo.meta=http://IP:Port
apollo.cluster=ali-test
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application

你可能感兴趣的:(微服务相关技术详解)