SpringCloud - Spring Cloud 之 Apollo Config携程阿波罗配置中心(二十一)

2023-11-12

由于Spring Cloud自带的Config 需要配合 Bus 使用,且不能实时刷新,因此市面上出现了很多开元的配置中心

市面上开源的配置中心

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

diamond : 淘宝开源的持久配置中心,支持各种持久信息(比如各种规则,数据库配置等)的发布和订阅;(更新稍微落后一点)

XDiamond:全局配置中心,存储应用的配置项,解决配置混乱分散的问题,名字来源于淘宝的开源项目diamond,前面加上一个字母X以示区别。

Qconf: 奇虎360内部分布式配置管理工具,用来替代传统的配置文件,使得配置信息和程序代码分离,同时配置变化能够实时同步到客户端,而且保证用户高效读取配置,这使的工程师从琐碎的配置修改、代码提交、配置上线流程中解放出来,极大地简化了配置管理工作;

Disconf:百度的分布式配置管理平台,专注于各种分布式系统配置管理的通用组件和通用平台, 提供统一的配置管理服务

Apollo(GitHub - apolloconfig/apollo: Apollo is a reliable configuration management system suitable for microservice configuration management scenarios.)是一个配置中心,支持从应用、环境、集群维度去管理配置,也支持从公共,私有维度去管理配置。 满足了大部分的配置场景。 

Apollo官网Apollo

以下是 Spring Cloud Config 和 Apollo对比

一、部署Apollo运行环境

官网 Quick Start 文档Apollo

1、环境准备

1、Java

  • Apollo服务端:1.8+
  • Apollo客户端:1.8+
    • 如需运行在 Java 1.7 运行时环境,请使用 1.x 版本的 apollo 客户端,如 1.9.1

在配置好后,可以通过如下命令检查:

java -version

样例输出:

java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

Windows用户请确保JAVA_HOME环境变量已经设置 

2、MySQL

  • 版本要求:5.6.5+

Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。

连接上MySQL后,可以通过如下命令检查:

SHOW VARIABLES WHERE Variable_name = 'version';
Variable_name Value
version 5.7.11

2、下载Quick Start安装包

官网准备好了一个Quick Start安装包,大家只需要下载到本地,就可以直接使用,免去了编译、打包过程。

安装包共50M,如果访问github网速不给力的话,可以从百度网盘下载。

  1. 从GitHub下载
  2. 从百度网盘下载
    • 通过网盘链接下载,提取码: 9wwe
    • 下载到本地后,在本地解压apollo-quick-start.zip
  3. 为啥安装包要58M这么大?
    • 因为这是一个可以自启动的jar包,里面包含了所有依赖jar包以及一个内置的tomcat容器

手动打包 Quick Start安装包

Quick Start只针对本地测试使用,所以一般用户不需要自己下载源码打包,只需要下载已经打好的包即可。不过也有部分用户希望在修改代码后重新打包,那么可以参考如下步骤:

  1. 修改apollo-configservice, apollo-adminservice和apollo-portal的pom.xml,注释掉spring-boot-maven-plugin和maven-assembly-plugin
  2. 在根目录下执行mvn clean package -pl apollo-assembly -am -DskipTests=true
  3. 复制apollo-assembly/target下的jar包,rename为apollo-all-in-one.jar

二、安装步骤

1、创建数据库

Apollo服务端共需要两个数据库:ApolloPortalDBApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可

导入成功后,可以通过执行如下sql语句来验证:

select `Id`, `AppId`, `Name` from ApolloPortalDB.App;

select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;

2、配置数据库连接信息 

#!/bin/bash

# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?useSSL=false&&characterEncoding=utf8&&serverTimezone=Asia/Shanghai
apollo_config_db_username=root
apollo_config_db_password=admin123456

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?useSSL=false&&characterEncoding=utf8&&serverTimezone=Asia/Shanghai
apollo_portal_db_username=root
apollo_portal_db_password=admin123456

注意:不要修改demo.sh的其它部分

这里可能会出现一个问题

demo.sh 启动 报错

==== starting service ====
Service logging file is ./service/apollo-service.log
Started [3120]
Waiting for config service startup........................
Config service failed to start in 120 seconds! Please check ./service/apollo-service.log for more information.

这里有两种解决办法

1、mysql禁用SSL

(1)由于我的mysql是5.7之后的,后面得加useSSL=false,禁用SSL(安全套接字协议)

(2)属性之间的连接得用&&,用&还是启动失败

#!/bin/bash
 
# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?useSSL=false&&characterEncoding=utf8&&serverTimezone=Asia/Shanghai
apollo_config_db_username=root
apollo_config_db_password=admin123456
 
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?useSSL=false&&characterEncoding=utf8&&serverTimezone=Asia/Shanghai
apollo_portal_db_username=root
apollo_portal_db_password=admin123456

2、 mysql修改URL

刚开始配置数据库连接url是 localhost,一直报错连接不上,回想了一下,博主是将Apollo配置在Linux端,因此将数据库 连接url换成 Linux上的 IP地址,并且启动 mysql服务

#!/bin/bash
 
# apollo config db info
apollo_config_db_url=jdbc:mysql://192.168.133.129:3306/ApolloConfigDB?useSSL=false&&characterEncoding=utf8&&serverTimezone=Asia/Shanghai
apollo_config_db_username=root
apollo_config_db_password=admin123456
 
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://192.168.133.129:3306/ApolloPortalDB?useSSL=false&&characterEncoding=utf8&&serverTimezone=Asia/Shanghai
apollo_portal_db_username=root
apollo_portal_db_password=admin123456

3、启动Apollo配置中心

注:

启动之前确保 mysql服务开启,且数据库 ApolloConfigDB 和 ApolloPortalDB 已经创建好(如果是Docker启动的 MySQL,要挂载MySQL,以免删除或者停止mysql容器后能保留数据库文件,不至于导致数据库丢失)

执行启动脚本

./demo.sh start

启动成功之后,会输出如下信息

注:

./demo.sh start   (里面会启动三个服务

Config-service  8080端口

Admin-service  8090端口

Portal管控台  8070端口,启动会比较慢)

./demo.sh start
==== starting service ====
Service logging file is ./service/apollo-service.log
Application is running as root (UID 0). This is considered insecure.
Started [10272]
Waiting for config service startup....
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup.
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Application is running as root (UID 0). This is considered insecure.
Started [10474]
Waiting for portal startup....
Portal started. You can visit http://localhost:8070 now!

启动成功后,访问:http://ip:8070 登录账号默认是: apollo/admin 

三、创建应用

1、点击创建应用

2、填写 APPId,应用名称等 

3、点击“提交”,创建成功,首次会警告,点击“发布”即可 

4、将项目中 application.properties 配置文件中的配置信息复制到 “文本”处,保存,点击发布 

5、可以在表格中看到各项参数配置 

四、Apollo应用

1、创建应用 springcloud-12-service-apollo-config-provider

2、添加 Apollo依赖

<!-- 携程apollo-client -->
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.7.0</version>
        </dependency>
<!--继承统一的父项目-->
    <parent>
        <groupId>com.company</groupId>
        <artifactId>springcloud-demo</artifactId>
        <version>1.0.0</version>
    </parent>

    <groupId>com.company</groupId>
    <artifactId>springcloud-12-service-apollo-config-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>springcloud-12-service-apollo-config-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--spring web 起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- mybatis-spring-boot-starter
            !!!需要添加版本号,不然报错
            [ERROR] 'dependencies.dependency.version' for org.mybatis.spring.boot:mybatis-spring-boot-starter:jar is missing. @ line 32, column 21
         -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <!-- MySQL的jdbc驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--依赖统一的springcloud-service-commons项目
            !!!需要添加版本号,不然报错
            [ERROR] 'dependencies.dependency.version' for com.company:springcloud-2-service-common:jar is missing. @ line 44, column 21
        -->
        <dependency>
            <groupId>com.company</groupId>
            <artifactId>springcloud-2-service-common</artifactId>
            <version>1.0.0</version>
        </dependency>

        <!--spring-cloud-starter-netflix-eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- 携程apollo-client -->
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.7.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3、在 bootstrap.properties 或者 application.properties 中配置

####====使用携程Apollo配置中心---start====#####
#appId
app.id=springcloud-12-service-apollo-config-provider
#config services url
apollo.meta=http://192.168.133.129:8080
####====使用携程Apollo配置中心---end====#####

我们的应用程序也就是Apollo客户端依赖于AppId,Apollo Meta Server等环境信息来工作,需要做如下配置:

AppId:AppId是应用的身份信息,是从服务端获取配置的一个重要信息;

(1)Spring Boot application.properties

Apollo 支持通过Spring Boot的application.properties或bootstrap.properties文件配置:

app.id=YOUR-APP-ID

(2)app.properties

在项目的classpath:/META-INF/app.properties文件存在,并且其中内容配置:

app.id=YOUR-APP-ID

Apollo Meta Server:元数据服务器;

Apollo可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.meta=http://config-service-url

通过app.properties配置文件在classpath:/META-INF/app.properties指定apollo.meta=http://config-service-url

4、在springboot启动类上添加注解 @EnableApolloConfig 开启apollo配置支持

@EnableApolloConfig //开启apollo配置支持
@SpringBootApplication(scanBasePackages="com.company")
public class ServiceApolloConfig12ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceApolloConfig12ProviderApplication.class, args);
    }
}

5、启动项目测试

Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行;

本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限;

Mac/Linux: /opt/data/{appId}/config-cache

Windows: C:\opt\data\{appId}\config-cache

{appId}+{cluster}+{namespace}.properties

五、Apollo客户端的实现原理

1、客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送;

(通过Http Long Polling实现)

2、客户端还会定时从Apollo配置中心服务端拉取应用的最新配置,这是一个fallback机制,为了防止推送机制失效导致配置不更新;

3、客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified;

定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟;

4、客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中;

客户端会把从服务端获取到的配置在本地文件系统缓存一份;

在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置;

5、应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知;

六、Apollo阿波罗配置中心设计

Apollo的总体设计,从下往上看分别是:

Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端;

Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面);

Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳;

在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口;

Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试;

Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试;

为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中;

七、Apollo模块

1、Config Service

提供配置获取接口

提供配置更新推送接口(基于Http long polling)

服务端使用Spring DeferredResult实现异步化,从而大大增加长连接数量

目前使用的tomcat embed默认配置是最多10000个连接(可以调整),使用了4C8G的虚拟机实测可以支撑10000个连接,所以满足需求(一个应用实例只会发起一个长连接)。

接口服务对象为Apollo客户端

2、Admin Service

提供配置管理接口

提供配置修改、发布等接口

接口服务对象为Portal

3、Meta Server

Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port)

Client通过域名访问Meta Server获取Config Service服务列表(IP+Port)

Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client

增设一个Meta Server的角色主要是为了封装服务发现的细节,对Portal和Client而言,永远通过一个Http接口获取Admin Service和Config Service的服务信息,而不需要关心背后实际的服务注册和发现组件

Meta Server只是一个逻辑角色,在部署时和Config Service是在一个JVM进程中的,所以IP、端口和Config Service一致

4、Eureka

基于Eureka和Spring Cloud Netflix提供服务注册和发现

Config Service和Admin Service会向Eureka注册服务,并保持心跳

为了简单起见,目前Eureka在部署时和Config Service是在一个JVM进程中的(通过Spring Cloud Netflix)

5、Portal

提供Web界面供用户管理配置

通过Meta Server获取Admin Service服务列表(IP+Port),通过IP+Port访问服务

在Portal侧做load balance、错误重试

6、Client

Apollo提供的客户端程序,为应用提供配置获取、实时更新等功能

通过Meta Server获取Config Service服务列表(IP+Port),通过IP+Port访问服务

在Client侧做load balance、错误重试;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud - Spring Cloud 之 Apollo Config携程阿波罗配置中心(二十一) 的相关文章

随机推荐

  • 基于java的智能停车场管理系统

    背景 智能停车场管理系统的主要使用者分为管理员和用户 实现功能包括管理员 个人中心 用户管理 车位信息管理 车位租用管理 车位退租管理 违规举报管理 论坛交流 系统管理 用户 个人中心 车位租用管理 车位退租管理 违规举报管理 我的收藏管理
  • Tcpdump的用法及使用案例

    转载自此 Tcpdump工具是Unix和linux系统抓网络数据库包最有效的工具 windows上类似的工具是wireshark tcpdump可以将网络中传送的数据包的 头 完全截获下来提供分析 它支持针对网络层 协议 主机 网络或端口的
  • git cherry-pick gerritID shell脚本解析

    bin bash while read line 读取导入文件的每行到变量 line直到文件结尾 do Name echo line awk print 2 awk 输出 line对应那行的第二列 ChangeID echo line aw
  • linux命令行操作以及目录操作

    目录 一 linux命令行操作以及目录操作 1 Shell 1 linux的操作界面常称为Shell 2 概念 3 查看Shell类型 4 查看当前默认的Shell 5 Shell提示符 6 登录字符终端和图形终端方法 2 使用桌面访问命令
  • burp suite 进行webshell上传

    主要功能 burp suite 可以将客户端与服务器之间传输的数据进行拦截 然后对数据进行修改并在此发送 从而完成攻击设置代理服务器 Proxy Options listeners中 可设置默认的监听IP地址的端口号 建议用Firefox
  • PyCharm中如何安装第三方库?

    PyCharm中如何安装第三方库 一 在安装之前 你如何知道你的系统已经安装了哪些库 1 在window的资源管理器 查找Python安装目录 2 在PyCharm 集成编辑器中 3 在设置中 二 安装模块的方法 1 在IDE编写代码时 我
  • XML——XML介绍和基本语法

    1 XML历史 gml 1969 gt sgml 1985 gt html 1993 gt xml 1998 1969 gml 通用标记语言 主要目的是要在不同的机器之间进行通信的数据规范 1985 sgml 标准通用标记语言 1993 h
  • ChatGPT迎来史诗级iPhone时刻!IOS版ChatGPT首发体验!免费、响应快、新增语音识别

    OpenAI昨晚正式发布了ChatGPT的iOS版App 官方版ChatGPT正式杀入移动手机端 各类山寨App恐将失业 dog 现在你已经可以在App Store中下载该应用了 这款App的名称为 OpenAI ChatGPT 我第一时间
  • 面试题-容器

    现在新技术迭代非常快 我们一方面要学习掌握更多的新技术 同时我们需要不断的巩固已学的知识 一点点的知识积累终会变成质的飞跃 现在我就想来总结一下java一些常用的面试题 原文 https blog csdn net sufu1065 art
  • 时序预测

    时序预测 MATLAB实现NARX非线性自回归外生模型时间序列预测 目录 时序预测 MATLAB实现NARX非线性自回归外生模型时间序列预测 效果一览 基本介绍 程序设计 参考资料 效果一览 基本介绍 时序预测 MATLAB实现NARX非线
  • 使用Python和OpenCV构建图像金字塔

    使用Python和OpenCV的图像金字塔 1 效果图 2 什么是图像金字塔 3 依赖 4 源码 参考 这篇博客将介绍如何使用两种方法构造图像金字塔 使用Python和OpenCV构建金字塔 此方法不会在金字塔的每一层使用高斯平滑图像 因此
  • JetBrains new UI 不用申请直接使用

    5月27 JetBrains 发布了新 ui的使用申请 试用链接如下 https www jetbrains com lp intellij new ui preview 填写申请后还需要官方审核 下面介绍一种直接在本地试用的方法 首先需要
  • 在列联分析中的辛普森悖论

    情景 在列联分析中有时会出现辛普森悖论 简述什么是辛普森悖论 它产生的原因是什么 如何防范辛普森悖论 什么是辛普森悖论 在分组比较中都占优势的一方 在总评中有时反而是失势的一方 维基百科 边缘关联和条件关联有相反结论的情况称作辛普森悖论 属
  • Eureka和Zookeeper的区别

    Eureka和Zookeeper的区别 Mysql Oracle SqlServer等关系型数据库遵循的原则是 ACID 原则 即 A 原子性 C 一致性 I 独立性 D 持久性 Redis Mogodb 等非关系型数据库遵循的原则是 CA
  • golang - 键盘输入语句:Scanln()、Scanf()

    在编程中 需要接受用户输入的数据 方法 使用键盘输入语句 步骤 导入 fmt 包 调用 fmt 包的 fmt Scanln 或者 fmt Scanf func Scanln func Scanln a interface n int err
  • dbus-python指南

    菜鸟学dbus python 翻译dbus python指南 错误之处请在所难免 请诸位不吝赐教 多多指正 查看英文原版请点这里 连接总线Connecting to the Bus 方法调用Making method calls 代理对象p
  • 第十三届蓝桥杯省赛C++B组错题笔记

    文章目录 A 九进制转十进制 B 顺子日期 C 刷题统计 D 修剪灌木 E X进制减法 F 统计子矩阵 G 积木画 H 扫雷 I 李白打酒加强版 J 砍竹子 A 九进制转十进制 问题描述 九进制正整数 2022 9 转换成十进制等于多少 答
  • 服务器基础知识

    一 服务器的概念 服务器是计算机的一种 它比普通的计算机运行的更快 负载更高 价格更贵 服务器在网络中为其他的客户机 PC机 智能手机 ATM等终端 提供计算或者应用服务 服务器具有高速的CPU运算能力 长时间的可靠运行 强大的I O外部数
  • QTableWidget用法总汇

    1 QTableWidget不能在mainwindow中随主窗口的大小变化 解决 在表格外部添加布局 代码 tableWidget new QTableWidget tableWidget gt setObjectName QString
  • SpringCloud - Spring Cloud 之 Apollo Config携程阿波罗配置中心(二十一)

    由于Spring Cloud自带的Config 需要配合 Bus 使用 且不能实时刷新 因此市面上出现了很多开元的配置中心 市面上开源的配置中心 Apollo 阿波罗 携程框架部门研发的分布式配置中心 能够集中化管理应用不同环境 不同集群的