热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Distributed】分布式配置中心

  • 一、概述
    • 1.1 什么是分布式配置中心
    • 常用分布式配置中心框架
  • 二、Apollo阿波罗
    • 2.1 Apollo特点
    • 2.2 Apollo整体架构原理
    • 2.3 Apollo Portol 环境搭建
      • Linux上
      • 创建数据库
      • 确保端口未被占用
      • 执行启动脚本
      • 使用Apollo配置中心
    • 2.4 Apollo配置中心客户端集成
      • 打入本地Maven仓库
      • Maven依赖信息
      • application.yml配置文件信息
      • 修改环境
      • 创建apollo-env配置文件信息
      • App信息
      • 项目启动
      • 监听服务器通知
    • 2.5 Apollo原理分析

一、概述

1.1 什么是分布式配置中心

  项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做到自动更新配置文件信息,解决以上问题

常用分布式配置中心框架

  1. Disconf(依赖于zookpeer)
  2. Zookpeer:保证配置文件信息实时更新 (事件通知)
  3. Diamond(阿里)
  4. 阿波罗Apollo(携程的)
  5. Redis
  6. XXl-conf
    大型互联网公司自己内部都有自己独立分布式配置中心
    独立RPC、独立分布式各种解决方案
  7. 注册中心解决 rpc服务治理
  8. 分布式配置中心 解决分布式配置文件管理

二、Apollo阿波罗

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

2.1 Apollo特点

用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。

  1. 统一管理不同环境、不同集群的配置,所有的配置发布都有版本概念,从而可以方便的支持配置的回滚。
  2. 配置修改实时生效(热发布),用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序
  3. 版本发布管理,所有的配置发布都有版本概念,从而可以方便的支持配置的回滚
  4. 灰度发布,支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。
  5. 权限管理、发布审核、操作审计,应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。所有的操作都有审计日志,可以方便的追踪问题。
  6. 客户端配置信息监控,可以方便的看到配置在被哪些实例使用
  7. 提供了Java和.Net的原生客户端,方便应用集成
  8. 支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+)
  9. 同时提供了Http接口,非Java和.Net应用也可以方便的使用
  10. 提供开放平台API

  • Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。
  • 不过Apollo出于通用性考虑,对配置的修改不会做过多限制,只要符合基本的格式就能够保存。
  • 在我们的调研中发现,对于有些使用方,它们的配置可能会有比较复杂的格式,如xml, json,需要对格式做校验。
  • 还有一些使用方如DAL,不仅有特定的格式,而且对输入的值也需要进行校验后方可保存,如检查数据库、用户名和密码是否匹配。
  • 对于这类应用,Apollo支持应用方通过开放接口在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制
  • 部署简单,配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少, 目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来,Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数

2.2 Apollo整体架构原理

【Distributed】分布式配置中心
Apollo整体架构

2.3 Apollo Portol 环境搭建

Linux上

  1. 环境要求:首选虚拟机内存在2g 以上,一定提前安装好java1.8k环境
  2. 搭建数据库 创建表
  3. apollo-build-scripts-master 整个阿波罗环境包 使用一个命令启动整个阿波罗服务环境
  4. 创建两个数据库,分别为:apolloconfigdb(存放配置文件信息)apolloportaldb(门户网站)
  5. 建议数据库mysql在5.7以上,如果在低版本数据库执行阿波罗结构时,默认是不能支持在一个表中有两个时间戳类型字段,所以建议大家使用mysql在5.7以上。
  6. yum -y install zip unzip
  7. apollo-master 源码和依赖jar包(建议打到本地maven仓库中)

创建数据库

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

注意:如果你本地已经创建过Apollo数据库,请注意备份数据。我们准备的sql文件会清空Apollo相关的表。

配置数据库连接信息
Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。

注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限

#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)

确保端口未被占用

Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。
例如,在Linux/Mac下,可以通过如下命令检查:

执行启动脚本

./demo.sh start
当看到如下输出后,就说明启动成功了!

使用Apollo配置中心

访问网址:打开http://localhost:8070

输入用户名apollo,密码admin后登录

2.4 Apollo配置中心客户端集成

打入本地Maven仓库

外网是没有的,需要从git下载下来已下载将apollo-master 打入到本地Maven仓库中

  1. 首先需要配置Maven的环境变量
  2. 解压apollo-master ,运行/apollo-master/scripts/ 目录下的脚本 文件build.bat 或者 build.sh(Mac或者Linux)

Maven依赖信息


            org.springframework.boot
            spring-boot-starter-parent
            2.0.1.RELEASE
             
    

    
        UTF-8
        UTF-8
        1.8
        Finchley.RC1
    
    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.boot
            spring-boot-starter-web
            
        

        
        
            com.ctrip.framework.apollo
            apollo-client
            1.0.0
        
        
            com.ctrip.framework.apollo
            apollo-core
            1.0.0
        


        
            org.projectlombok
            lombok
            true
        
        
            com.alibaba
            fastjson
            1.2.3
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
            
                org.apache.maven.plugins
                maven-resources-plugin
                3.0.1
                
                    
                        copy-conf
                        package
                        
                            copy-resources
                        
                        
                            UTF-8
                            ${project.build.directory}/ext/conf
                            
                                
                                    ext/conf
                                    
                                        logback.xml
                                    
                                    true
                                
                            
                        
                    
                
            
            
                org.jacoco
                jacoco-maven-plugin
                0.7.5.201505241946
                
                    
                        default-prepare-agent
                        
                            prepare-agent
                        
                    
                    
                        default-prepare-agent-integration
                        
                            prepare-agent-integration
                        
                    
                
            
            
                com.spotify
                docker-maven-plugin
                0.4.3
                
                    hy_uav_gateway
                    src/main/docker
                    
                        
                            /
                            ${project.build.directory}
                            ${project.build.finalName}.jar
                            ext/conf/logback.xml
                        
                    
                
            
        
    

    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/milestone
            
                false
            
        
    

application.yml配置文件信息

server:
      port: 8001
    spring:
      application:
        name: itmayiedu_a
    eureka:
      client:
        service-url:
          defaultZone: http://192.168.212.162:8080/eureka

修改环境

修改/opt/settings/server.properties(Mac/Linux)或C:\opt\settings\server.properties(Windows)文件,设置env为DEV:
env=DEV

创建apollo-env配置文件信息

apollo-env.properties

local.meta=http://192.168.212.162:8080
    dev.meta=http://192.168.212.162:8080
    fat.meta=${fat_meta}
    uat.meta=${uat_meta}
    lpt.meta=${lpt_meta}
    pro.meta=${pro_meta}

App信息

在META-INF文件夹创建app.properties 指定appid

 app.id=appid_0064

项目启动

@Configuration
@EnableApolloConfig
@SpringBootApplication
@EnableAutoConfiguration
public class App {
    
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

监听服务器通知

使用以下方法可以监听配置文件是否被修改

@Component
public class TestJavaConfigBean {
    
    // config change listener for namespace application
@ApolloConfigChangeListener("application")
private void anotherOnChange(ConfigChangeEvent changeEvent) {

    ConfigChange change = changeEvent.getChange("zhangsan_conf");
    System.out.println(String.format("Found change - key: %s, oldValue: %s," + "newValue: %s, changeType: %s",
            change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
}

}

2.5 Apollo原理分析

[GitHub官方参考地址](https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E8%AE%BE%E8%AE%A1)

推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
author-avatar
martinsleibert_471
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有