Apollo 配置中心安装&使用

做微服务有一段时间了,但是一直没有去碰配置中心这块,其实在微服务当中,配置中心至关重要,比如:网关的配置的更改、网关限流策略的变更、数据源的切换等等,同时也需要实现热加载,选来选去,就选择了最近比较流行的Apollo配置中心,以此文章记录学习笔记。

Apollo 简介

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

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。

Apollo 本地安装

环境准备

java: JDK 1.8.x

maven:3.2.2

mysql:5.7.18

idea: 2019.1.3

git : 2.10.0

apollo: 1.4.0

以上是我本机的环境,以及各个组件对应的版本,其中 除了 idea 、git 外,其他都是必须的,请查缺补漏的部署环境。

安装包下载

方式一(需要安装git/idea或者eclipse):

直接从 Apollo-github 下载最新的源码(当前最新:v1.4.0),通过git clone 命令将源码下载到本地:

git clone https://github.com/ctripcorp/apollo

方式二:

直接去官方下载最新的安装包,下载地址如下:

注意,本人是使用方式一,进行下载。

创建数据库

数据库版本要求,5.6.5+,本机环境,mysql 版本为:5.7.18。

查看数据库版本:

SHOW VARIABLES WHERE Variable_name = 'version';

Variable_name

Value

version

5.7.18-log

创建以下两个数据库并导入初始化数据:

ApolloConfigDB

ApolloPortalDB

ApolloConfigDB 所在的文件目录:

${your_file_directory}\apollo\scripts\db\migration\configdb

ApolloPortalDB

${your_file_directory}\apollo\scripts\db\migration\portaldb

在MySQL数据库中执行这两个SQL文件,完成数据库的创建和数据的初始化操作。

打包项目(build package)

将下载下来的 apollo 源码导入到idea中,我们需要关注的几个项目:

apollo-configservice

apollo-adminservice

apollo-protal

配置服务(meta server、eureka)

配置管理服务

apollo管理UI

找到 /apollo/scripts/build.bat(Linux 是 bulid.sh)

@echo off

rem apollo config db info

set apollo_config_db_url="jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8"

set apollo_config_db_username="root"

set apollo_config_db_password=""

rem apollo portal db info

set apollo_portal_db_url="jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8"

set apollo_portal_db_username="root"

set apollo_portal_db_password=""

rem meta server url, different environments should have different meta server addresses

set dev_meta="http://localhost:8080"

set fat_meta="http://someIp:8080"

set uat_meta="http://anotherIp:8080"

set pro_meta="http://yetAnotherIp:8080"

set META_SERVERS_OPTS=-Ddev_meta=%dev_meta% -Dfat_meta=%fat_meta% -Duat_meta=%uat_meta% -Dpro_meta=%pro_meta%

rem =============== Please do not modify the following content ===============

rem go to script directory

cd "%~dp0"

cd ..

rem package config-service and admin-service

echo "==== starting to build config-service and admin-service ===="

call mvn clean package -DskipTests -pl apollo-configservice,apollo-adminservice -am -Dapollo_profile=github -Dspring_datasource_url=%apollo_config_db_url% -Dspring_datasource_username=%apollo_config_db_username% -Dspring_datasource_password=%apollo_config_db_password%

echo "==== building config-service and admin-service finished ===="

echo "==== starting to build portal ===="

call mvn clean package -DskipTests -pl apollo-portal -am -Dapollo_profile=github,auth -Dspring_datasource_url=%apollo_portal_db_url% -Dspring_datasource_username=%apollo_portal_db_username% -Dspring_datasource_password=%apollo_portal_db_password% %META_SERVERS_OPTS%

echo "==== building portal finished ===="

pause

更改数据库连接配置

rem apollo config db info

set apollo_config_db_url="jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8"

set apollo_config_db_username="root"

set apollo_config_db_password="123456"

rem apollo portal db info

set apollo_portal_db_url="jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8"

set apollo_portal_db_username="root"

set apollo_portal_db_password="123456"

更改 meta server(apollo-configservice/apollo-erueka) 地址

set dev_meta="http://localhost:8080"

set fat_meta="http://someIp:8080"

set uat_meta="http://anotherIp:8080"

set pro_meta="http://yetAnotherIp:8080"

修改完上面的配置之后,执行build.bat 批处理命令文件进行编译打包,在执行的过程中可能会出现一些异常(一般是maven依赖异常),自行百度解决之后,再重新执行。

打包成功之后,找到 apollo-configservice、apollo-adminservice、apollo-portal 下的 target 目录(build是执行 maven 的 package 命令),找到已经打好的三个jar包,copy 出来放到一个单独的目录(方便启动)。

进入jar 的当前目录,==依次==启动apollo-configservice、apollo-adminservice、apollo-portal 三个服务。

java -jar apollo-configservice-1.5.0-SNAPSHOT.jar

java -jar apollo-adminservice-1.5.0-SNAPSHOT.jar

java -jar apollo-portal-1.5.0-SNAPSHOT.jar

全部启动完成之后,打开浏览器输入:

http://localhost:8070 如果出现apollo 的登录界面,说明已经启动成功(登录名/密码:apollo/admin)。

Apollo-portal登录界面

http://localhost:8080 如果出现eureka 的管理界面,说明服务启动正常。

apollo-configservice/eureka界面

Apollo 集群部署

Apollo 的使用(Java)

持续更新使用案例

拿spring boot 项目简单直白地说一下配置刷新的原理;spring boot 项目都有一个 application.yml/properties 的应用配置文件,里面写了各种配置,如:datasource 的连接、redis 连接、mq连接、server.port、application.name 、网关配置等等吧。

在spring boot 项目启动的时候,会将这些配置加载到相应的类里面,如:spring.datasource 的配置会在datasource 初始化的时候,将这类配置注入到DataSourceProperties.java 相对应的属性里面,从而实现数据源的实例。

那么目前使用Apollo 需要做到,这类的配置文件,从Apollo的配置中心拉取,而且,在Apollo 变更某一个属性可以做到不重启应用就生效的目的。那么我们需要怎么做呢?

应用需要监听Apollo 上面的配置的内容改变(配置改变发布),去刷新这类的xxxProperties.java 类,然后重新编译该配置的client端。

例如,刷新DataSourceProperties.java 的属性配置,然后通过反射重新编译DataSource 应用,通过最新的配置重新初始化实例,那么后面调用DataSource的client端就是使用最新的配置。

引入apollo-client 依赖

com.ctrip.framework.apollo

apollo-client

${apollo.client.version}

apollo 发布配置

登录apollo 配置中心

apollo配置中心主页

里面建了两个应用

appId:001,是一些基础设施的配置,如Mysql/redis/mq等的连接配置,属于公共配置

appId:clz-front-gateway,是一个网关的独立配置

appID:001的内容

App.id:001配置内容

clz-front-gateway 的配置内容

App.id:clz-front-gateway

spring boot 使用apollo 管理配置

在spring boot 中使用 apollo 的配置非常简单,在application.yml/properties中设置app.id、apollo.meta以及指定命名空间即可。

application.yml 配置

app:

id: front-gateway

apollo:

meta: http://localhost:8080

bootstrap:

enabled: true

namespaces: PC.datasource-mysql-config.yml,clz-front-gateway.yml

spring boot 启动类,启动 @EnableApolloConfig

@SpringBootApplication

@EnableEurekaClient

@Slf4j

@EnableApolloConfig

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class,args);

log.info("application web started.");

}

}

这样就可以从 meta: http://localhost:8080 (apollo-configservice)中拉取 application,ad-service-config 这两个命名空间的配置了。

Apollo 实现 Mysql DataSource 热加载

新增一个DataSourceConfig 类处理配置的热加载

package com.ph.framework.core.config;

import com.ctrip.framework.apollo.core.ConfigConsts;

import com.ctrip.framework.apollo.model.ConfigChangeEvent;

import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.cloud.context.config.annotation.RefreshScope;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**

* @ClassName DataSourceConfig

* @Description 数据源刷新配置

* @Author rongqin.he

* @Date 2019/7/30 0030

* @Version 1.0

**/

@Configuration

@EnableConfigurationProperties(DataSourceProperties.class)

@Slf4j

public class DataSourceConfig {

@RefreshScope

@Bean("dataSource_Bean")

public DataSource dataSource(DataSourceProperties dataSourceProperties){

return dataSourceProperties.initializeDataSourceBuilder().build();

}

@Autowired

private ApplicationContext applicationContext;

@Autowired

private org.springframework.cloud.context.scope.refresh.RefreshScope refreshScope;

/***

* 监听apollo 的配置变更

* @Param [configChangeEvent]

* @return void

* @Author rongqin.he

* @Date 2019/8/1 0001

**/

@ApolloConfigChangeListener(value = {ConfigConsts.NAMESPACE_APPLICATION,"PC.datasource-mysql-config"},interestedKeyPrefixes = {"spring.datasource"})

public void onChange(ConfigChangeEvent configChangeEvent){

// 重新编译DataSource 初始化bean

refreshScope.refresh("dataSource_Bean");

log.info("Apollo config changed {}",applicationContext.getBean(DataSourceProperties.class).toString());

}

}

Apollo 实现 Redisson 热加载

Apollo 实现 Zuul 动态路由

新增zuul配置变更监听

/**

* @ClassName ZuulPropertiesRefresher

* @Description Apollo 配置刷新类

* @Author rongqin.he

* @Date 2019/7/29 0029

* @Version 1.0

**/

@Component

@Slf4j

public class ZuulPropertiesRefresher {

@Autowired

private RefreshScope refreshScope;

@Autowired

private ZuulProperties zuulProperties;

@ApolloConfigChangeListener(value = {ConfigConsts.NAMESPACE_APPLICATION,"zuul-rout-config"},interestedKeyPrefixes = "zuul.")

private void onChange(ConfigChangeEvent configChangeEvent){

log.info("Apollo config change - Before refresh {}", zuulProperties);

refreshScope.refresh("ZuulProperties_bean");

log.info("Apollo config change - After refresh {}", zuulProperties);

}

@Bean("ZuulProperties_bean")

@ConfigurationProperties("zuul")

@RefreshScope

@Primary

public ZuulProperties zuulProperties(){

return new ZuulProperties();

}

}

Apollo 实现 Spring Security 白名单

Apollo 实现 RabbitMq配置 热加载

Apollo 实现 ES 热加载

apollomq mysql_Apollo 配置中心安装使用相关推荐

  1. Apollo配置中心热加载mysql_Apollo配置中心介绍

    1.What is Apollo 1.1 背景 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址-- 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分 ...

  2. Apollo配置中心热加载mysql_Apollo 配置中心部署注意事项

    2019 年 12 月份的时候写过一篇文章 Apollo 配置中心初探,当时刚接触 apollo,使用还不是很熟练,只是快速的部署出来了.随后在业务快速迭代的过程中,使用 apollo 的频率越来越高 ...

  3. Apollo配置中心热加载mysql_apollo配置中心开发指南

    一.准备工作 1.本地运行时环境 Java: 1.8+ MySQL: 5.6.5+ 二.本地启动 1.Apollo Config Service和Apollo Admin Service 在本地开发时 ...

  4. apollo 配置中心安装

    https://github.com/ctripcorp/apollo/wiki/Quick-Start

  5. 配置中心—nacos配置中心

    配置中心-nacos配置中心 配置中心 Nacos配置中心 Nacos配置中心集群工作原理 Nacos配置中心的使用 .net core集成Nacos配置中心 配置中心 应用程序在启动和运行的时候往往 ...

  6. Apollo分布式配置中心在本地的安装教程

    一.准备工作 1.1 Java Apollo服务端:1.8+ Apollo客户端:1.7+ 由于Quick Start会在本地同时启动服务端和客户端,所以需要在本地安装Java 1.8+. 在配置好后 ...

  7. nacos linux启动_微服务系列之Nacos配置中心之一:Nacos介绍与安装

    一.Nacos 介绍 Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理.英文全称 Dynamic Naming and Configuration Servi ...

  8. 分布式配置中心 Disconf 安装配置

    分布式配置中心 Disconf 安装配置 前提准备 CentOS 服务器一台 MySQL 数据库一台 安装依赖软件 安装 JDK 安装 Git 安装 Maven 安装 Zookeeeper 安装 To ...

  9. Windows下安装Apollo配置中心

    1.下载 网盘下载地址:链接: https://pan.baidu.com/s/1LqmuFUEWeWKkn2aYd-fqnA 提取码: tyuk 下载完毕后解压文件,可以看下目录结构 这里的sql目 ...

最新文章

  1. Promise和Promise的方法
  2. [转]微软发布WF教程及大量示例
  3. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...
  4. Android之集成微信登录
  5. vue/cli 3.0 与 2.0脚手架怎样mock数据
  6. springcloud都有什么组件?这个列表不得不看!
  7. Java学习笔记-7.Java IO流
  8. python3协程 queue_使用gevent库+queue模块实现多协程爬虫,提高爬取效率!
  9. 细说Linux 系统优化
  10. PHP删除数组中空值的方法介绍
  11. 工业机器人调运角度_工业机器人如何精准选型,这九大参数告诉你!
  12. abaqus pythonreader_【技术邻】Abaqus里应用Python的一些技巧
  13. Hike on a Graph HDU - 1252(bfs)
  14. 玩 High API 系列好文:UGC内容检测、视频智能、拍照翻译、懂天气的草地喷水头...
  15. uboot引导linux内核,u-boot启动内核的几种方式
  16. HTML5 Form Data 对象的使用
  17. 破除java网页禁止复制_网页内容禁止复制怎么办?
  18. AutoLeaders——翁恺老师的结构的笔记
  19. 适应智能工厂的新一代MES所需具备的核心要素
  20. 【中级软考】【耦合、内聚】模块独立性衡量之内聚的七种类型(偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚)

热门文章

  1. C#委托和事件的应用Observer模式实例
  2. android Tabhost 组件
  3. MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!
  4. 通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题
  5. Thanos 开源的大规模Prometheus集群解决方案
  6. 【报告分享】2021新青年国货消费研究报告:文化觉醒时代,宝藏国货迎复兴机遇.pdf(附下载链接)...
  7. 【干货】2020年人工智能十大技术进展及2021年十大技术趋势.pdf(附下载链接)...
  8. 【推荐实践】推荐系统中模型训练及使用流程的标准化
  9. 速读《精通比特币》基本术语
  10. 腾讯广告:广告场景下有哪些视觉算法应用?