Apollo配置中心的实战
31.携程 Apollo 配置中心介绍~1.mp4
32.Apollo核心概念~1.mp4
32.Apollo核心概念~1.mp4
每个应用需要有一个唯一的AppID
要在指定的机器上的server.properties上面指定当前机器是dev类型还是其他类型
在apollo中配置kafka的地址,东区生成环境和西区生产环境是不一样的
应用A可以访问到应用B中公共类型的数据,公共类型的数据中k4的值是v5,应用A可以自己定义覆盖k4的值变成v6,应用A中的私有类型的数据只能应用A本身访问,其他应用无法访问,对于公共的数据类型对于的key的命名在apollo中必须全局唯一
某个环境下的某个应用下的某个集群下的某个命名空间下的某个key,
私有配置项:当前的env环境加上应用名称加上集群加上命名空间加上item的名称组成
apollo的编辑权限和发布权限是分开的
2、apollo后端架构的设计
apollo后端一共存在6大模块,如下所示
注1:portal也是apollo的客户端,通过meta server注册中心获得admin service的服务列表
注2:apollo client 也是通过meta server获得config service服务的列表
Meta server 做集群的时候要配置多台,client中要配置meta server 集群的地址,client具体访问那台meta server来获得admin service的地址,也是通过负载均衡来实现的,公司内部已经提供了nginx LB来帮我们实现client访问meta server的集群
同理portal也是通过meta service来获得admin service的地址
Client通过meta service拿到admin service的地址之后,也是通过ribbon软负载的形式去调用具体的某台admin service
注3:
我们来看实时消息推送是如何实现的
管理员通过portal操作admin service 发布一条配置项之后,会将变更的数据插入到数据库表releaseMessage表中,因为config service 和admin service共享同一个数据库,config service会定期的描述releaseMessage表,如果发现了配置项发现了变化,config service会立即通知客户端
4、apollo客户端的设计
Config service和apollo客户端是配置是实时推送到客户端的
如果推送失败,apollo客户端还会定期的从config service中拉取配置
Apoll客户端获得最新的配置之后首先存储在内存缓存中,通过会通过回调机制会立刻通知到集成了apollo客户端的应用程序
同时apollo客户端会将内存中的缓存通报到本地的文件缓存中,当apollo客户端如果连接不上config service,会读取本地文件缓存的配置,保证可用性,后期在尝试去连接config service
5、apollo的高可用
这里如果config service和admin service 对于的数据库挂了,这个时候是无法进行配置的操作到数据库的。Configservicie虽然无法连接到数据库,但是config service提供了缓存功能,apollo客户端也可以访问到cinfig service的缓存数据
33.Apollo快速起步(Lab01)~1.mp4
如何在本地环境上如何快速安装apollo
mysql要求5.6.5
.3 下载Quick Start安装包
我们准备好了一个Quick Start安装包,大家只需要下载到本地,就可以直接使用,免去了编译、打包过程。
安装包共50M,如果访问github网速不给力的话,可以从百度网盘下载。
- 从Github下载
- checkout或下载apollo-build-scripts项目
- 由于Quick Start项目比较大,所以放在了另外的repository,请注意项目地址
- 从百度网盘下载
- 通过网盘链接下载(提取码: deca)
- 下载到本地后,在本地解压apollo-quick-start.zip
- 为啥安装包要58M这么大?
- 因为这是一个可以自启动的jar包,里面包含了所有依赖jar包以及一个内置的tomcat容
- 这里直接从网盘连接进行下载所需的东
接下来需要安装apollo对于的数据库
下载完成之后解压之后的内容如下所示:
接下来,需要设置数据库环境,数据库的代码在
这里我们本地数据库进行初始化
这里会产生apollo的两个数据库的表文件
接下来,需要在数据库中配置对于的数据库脚本
现在修改demo.sh,在里面添加上对于的配置
接下来启动apollo
这里在windows上我们要使用linux的环境,我们需要安装git bash
这样apollo就启动起来了我们创建一个用户,创建一个账号
在浏览器输入:http://localhost:8070/user-manage.html,必须使用超级管理员apollo用户登录
创建一个bobo的账号
我们使用bobo账号登录,然后创建项目
点击新建配置,我们创建一个timeout的配置
创建之后,要进行发布操作
我们要验证我们发布的东西,如何进行验证了
我们要修改下apollo-quick-start中国的client配置,将配置文件的appID修改为我们上面创建的TestAPP
启动客户端的代码如下
阿波罗架构的模块
portal需要连接admi service,通过Meta Server去获得admin services的列表
一般情况下config service 和admin service都会做集群,部署多份,client如何获得config service的服务列表了,这就需要引入微服务的注册中心,引入了eruka
但是euraka的客户端只支持java客户端,如果需要eruka的c 语言端,这就需要引入metaservice,这个metaservice是对euruka客户端的封装,支持其他语言,用户服务的注册和发现
接下来,client访问confi service集群还需要引入负载均衡,portal访问admin service也需要引入负载均衡集群
apollo客户端配置中心的使用
配置中心有文件变动之后会实时的推送给apollo的客户端,如果存在网络等问题,客户端没有收到推送的东西,客户端也会定时的从配置中心取数据。
客户端拿到最新的数据的时候首先是缓存到内存中,客户端首先新的数据的时候也会实时的通知应用程序,内存中的数据也会同步到本地缓存文件,当客户端连接不上配置中心的时候,会使用本地
文件缓存,如果没有本地缓存文件,客户端连接不上配置中心,就会报错。读取完本地文件缓存之后,客户端后续也会主动尝试连接配置中心,从配置中心获取最新的数据
页面上点击发布的时候,就是通过长连接将最新数据推送给apollo的客户端
config service 挂了一台不影响。因为client是通过负载均衡访问config service的,即使config service全部挂了,client客户端可以读取本地缓存文件,也不影响
admin service 挂了一台不影响。因为portal是通过负载均衡访问config service的,即使admin service全部挂了,效果就是portal无法操作配置文件,问题不大
portal挂了一台,用户通过nginx可以访问其他portal,如果portal全部挂了。后果就是用户不能更新配置
configdb挂了,configservice会开启缓存功能,client客户端读取数据不受影响,但是不能对配置进行修改操作,用户也无法通过adminService修改配置数据
portal db挂了,用户也是无法通过portaldb读取数据
除了cat监控监控之外,特别是生产上还需要引入时间序列数据库例如上面的普罗米修斯、 influxDB,列如统计apollo接入了多少应用、有多少配置项、多次变更。推送拉取次数、成功失败次数,如果仅仅
使用cat的话,力度还是不够,需要普罗米修斯等工具监控apollo数据库、获得对业务代码进行埋点获得更精确的统计
服务器至少1.8版本,数据库至少5.6.5版本以上
portal只需要部署一份,管理dev fat等环境只部署一套
metaService adminservice configservice每个环境例如dev fat都要独立部署一份
metaservice和configservice在同一台服务器的一个jvm中,adminservice在另外一个jvm中
部署的数据configdb和portaldb都要配置好,configdb在dev fat环境上都独立部署,portdb在各个环境上只需要一份,portdb中要修改数据库支持哪些dev fat的环境
portdb中要配置有哪些部门,管理员等信息
configservice要连接注册中心,需要在configdb中配置注册中心的url
portal也是通过注册中心去获得adminService的地址,portal中也要配置注册中心的地址,这里注册中心的地址部署保存在数据库中的,而是port打包中应用程序就设置好的,打包portal的时候需要设置
号dev、fat等环境的注册中心的url
39.Apollo Java客户端和多语言接入~1.mp4
客户端接入的时候需要在app.properties中设置当前应用的唯一ID
推荐做法,在apollo-core.jar中就设置好注册中心的地址,客户端直接引入改jar就可以了,不用重新设置注册中心的环境,如果要重载,可以在classpath中单独设置一份app-env.properties,
在里面进行设置
设置当前用户在哪个环境是dev、还是FAT等
apollo客户端就有本地缓存文件,也需要进行配置
apollo-client客户端在maven仓库上是没有的,因为client中会包括不同的注册中心metaserice的地址,每个项目是不一样的,建议参考部署指南,项目组内部自己构建一个jar包,传递到自己项目的私服上
https://m.jb51.net/article/167565.htm
40.Apollo Client API实操(Lab02)~1.mp4
虚拟机内存要2G以上,apollo启动都要占用1个duoG
其次mysql一定要5.7版本
三、整合Springboot
- <dependency>
- <groupId>com.ctrip.framework.apollo</groupId>
- <artifactId>apollo-client</artifactId>
- <version>1.0.</version>
- </dependency>
- <dependency>
- <groupId>com.ctrip.framework.apollo</groupId>
- <artifactId>apollo-core</artifactId>
- <version>1.0.</version>
- </dependency>
这里在官网上面没有正式的上面的maven的依赖
这里引入的jar下载下来好像不可以使用。需要我们手动下载Apollo然后编译导入Maven仓库
1、先删除Maven仓库已有的apollo jar
2、apollo-master\scripts
下载apollo-master的源码,进入到源码的下面目录,windows下执行build.bat就可以把对于的jar包,打包到本地的电脑的maven仓库中
安装成功之后在本地的maven仓库就可以看到下面的信息了
接下来我们创建一个springboot的项目
当前快速启动的项目apollo-quick-start默认提供的dev环境,因此需要将我们当前的环境设置为dev,当前是windows的开发环境
对于Windows,文件位置为C:\opt\settings\server.properties
目前,env支持以下几个值(大小写不敏感):
DEV, FAT, UAT, PRO
2 设置Appid
确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:app.id=YOUR-APP-ID
项目中为
- app.id=TestApp
3、设置注册中心metaService的地址
我们在demo.sh中我们可看到下面的地址信息
- # meta server url
- config_server_url=http://localhost:8080
- admin_server_url=http://localhost:8090
- eureka_service_url=$config_server_url/eureka/
- portal_url=http://localhost:8070
那么这里
apollo-env.properties的内容如下:
- local.meta=http://localhost:8080
- dev.meta=http://localhost:8080
- fat.meta=${fat_meta}
- uat.meta=${uat_meta}
- lpt.meta=${lpt_meta}
- pro.meta=${pro_meta}
接下来就是对于的pom.xml的依赖
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.</modelVersion>
- <groupId>com.itmayiedu</groupId>
- <artifactId>springboot-abl</artifactId>
- <version>0.0.-SNAPSHOT</version>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0..RELEASE</version>
- <relativePath /> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.RC1</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> -->
- </dependency>
- <!-- apollo 携程apollo配置中心框架 -->
- <dependency>
- <groupId>com.ctrip.framework.apollo</groupId>
- <artifactId>apollo-client</artifactId>
- <version>1.0.</version>
- </dependency>
- <dependency>
- <groupId>com.ctrip.framework.apollo</groupId>
- <artifactId>apollo-core</artifactId>
- <version>1.0.</version>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>3.0.</version>
- <executions>
- <execution>
- <id>copy-conf</id>
- <phase>package</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <encoding>UTF-</encoding>
- <outputDirectory>${project.build.directory}/ext/conf</outputDirectory>
- <resources>
- <resource>
- <directory>ext/conf</directory>
- <includes>
- <include>logback.xml</include>
- </includes>
- <filtering>true</filtering>
- </resource>
- </resources>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <version>0.7.5.201505241946</version>
- <executions>
- <execution>
- <id>default-prepare-agent</id>
- <goals>
- <goal>prepare-agent</goal>
- </goals>
- </execution>
- <execution>
- <id>default-prepare-agent-integration</id>
- <goals>
- <goal>prepare-agent-integration</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>0.4.</version>
- <configuration>
- <imageName>hy_uav_gateway</imageName>
- <dockerDirectory>src/main/docker</dockerDirectory>
- <resources>
- <resource>
- <targetPath>/</targetPath>
- <directory>${project.build.directory}</directory>
- <include>${project.build.finalName}.jar</include>
- <include>ext/conf/logback.xml</include>
- </resource>
- </resources>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <repositories>
- <repository>
- <id>spring-milestones</id>
- <name>Spring Milestones</name>
- <url>https://repo.spring.io/milestone</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
- </project>
需要引入上面我们的apollo-core和apollo-core的依赖
接下来就是启动类的代码,需要开启@EnableApolloConfig的注解,
1.在微服务应用启动中使用apollo配置中心获取配置信息
打开应用对应的启动类Application,在启动类上加上如下注解:@EnableApolloConfig
App.java
- /**
- * 功能说明:
- * 功能作者:
- * 创建日期:
- * 版权归属:每特教育|蚂蚁课堂所有 www.itmayiedu.com
- */
- package com.itmayiedu.api.controller;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
- /**
- * 功能说明: <br>
- * 创建作者:每特教育-余胜军<br>
- * 创建时间:2018年8月28日 下午9:09:14<br>
- * 教育机构:每特教育|蚂蚁课堂<br>
- * 版权说明:上海每特教育科技有限公司版权所有<br>
- * 官方网站:www.itmayiedu.com|www.meitedu.com<br>
- * 联系方式:qq644064779<br>
- * 注意:本内容有每特教育学员共同研发,请尊重原创版权
- */
- @EnableApolloConfig
- @SpringBootApplication
- public class App {
- public static void main(String[] args) {
- SpringApplication.run(App.class, args);
- }
- }
应用中获取配置信息的几种方式 ,通过@value注解获取配置值
IndexController.java
- /**
- * 功能说明:
- * 功能作者:
- * 创建日期:
- * 版权归属:每特教育|蚂蚁课堂所有 www.itmayiedu.com
- */
- package com.itmayiedu.api.controller;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- /**
- * 功能说明: <br>
- * 创建作者:每特教育-余胜军<br>
- * 创建时间:2018年8月28日 下午9:07:25<br>
- * 教育机构:每特教育|蚂蚁课堂<br>
- * 版权说明:上海每特教育科技有限公司版权所有<br>
- * 官方网站:www.itmayiedu.com|www.meitedu.com<br>
- * 联系方式:qq644064779<br>
- * 注意:本内容有每特教育学员共同研发,请尊重原创版权
- */
- @RestController
- public class IndexController {
- @Value("${yushengjun:test}")
- private String yushengjun;
- @RequestMapping("/getYushengjun")
- public String getYushengjun() {
- return yushengjun;
- }
- }
@Value("${yushengjun:test}"),在apollo中发布key为hengjun的值,在客户端访问的时候,就可以获得改值,这里test是默认值
默认情况下获得是默认的application的namespace的值,可以在@EnableApolloConfig指定对于的namespance
@EnableApolloConfig("FX.Hermes.Producer")
Apollo配置中心的实战的更多相关文章
- kubernetes实战-配置中心(四)分环境使用apollo配置中心
要进行分环境,需要将现有实验环境进行拆分 portal服务,可以各个环境共用,但是apollo-adminservice和apollo-configservice必须要分开. 1.zk环境拆分为tes ...
- (转)实验文档3:在kubernetes集群里集成Apollo配置中心
使用ConfigMap管理应用配置 拆分环境 主机名 角色 ip HDSS7-11.host.com zk1.od.com(Test环境) 10.4.7.11 HDSS7-12.host.com zk ...
- k8s-2-集成apollo配置中心
主题: 在k8s中集成Apollo配置中心 架构图 一.配置中心概述 配置的几种方式 本课讲得是基于配置中心数据库实现 配置管理的现状 常见的配置中心 主讲:k8s configmap,apollo ...
- Apollo配置中心动态刷新日志级别
Apollo配置中心动态刷新日志级别 添加次配置后,当在apollo上面调整日志级别不需要重启服务器,马上就能生效 /** * 结合apollo动态刷新日志级别 * @author: nj * @da ...
- 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)
基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势) 前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...
- Apollo配置中心
背景: 当前我们项目,所有的配置基本都是通过本地properties 文件进行配置的,比如ip地址.端口.消息中间件和数据库连接的各种参数,当我们需要切换环境或调整参数的时候,我们必须手动的修改这些配 ...
- apollo配置中心初探
近在搞微服务框架的开发,需要有一个配置中心来满足统一管理业务应用以及组件的配置,在此期间也使用了多个配置中心比如:spring cloud config,自研的配置中心,当然还有apollo. spr ...
- spring boot2.1读取 apollo 配置中心1
第一篇:搭建apollo配置中心 为什么选择apollo,我做了一些对比: Diamond Disconf Apollo Spring Cloud Config 数据持久性 mysql mysql ...
- Apollo配置中心转
尊重原创,本文转自:https://www.cnblogs.com/FlyAway2013/p/8811385.html 前我们项目,所有的配置基本都是通过本地properties 文件进行配置的,比 ...
随机推荐
- JS代码静态分析及挖掘
JavaScript 已经成为现代 Web 浏览器开发中最普遍的技术之一.使用客户端 JavaScript 框架(如 AngularJS,ReactJS 和 Vue.js)构建的应用程序已向前端输送了 ...
- flex布局以及常用属性。
(1)flex布局排列 会消除块状属性,所有与块状相关的属性将失效,比如块状元素会独占一行,如图2,设置flex后会在一行排列
- SpringSecurity(1)---认证+授权代码实现
认证+授权代码实现 Spring Security是 一种基于 Spring AOP 和 Servlet 过滤器的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和 ...
- 分布式事务专题笔记(一) 基础概念 与 CAP 理论
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.基础概念 1.什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,“一手交钱,一手交货”就是 ...
- Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
算法提高 陶陶摘苹果2 时间限制:1.0s 内存限制:256.0MB 问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳, ...
- Java实现最大连续子数组和
1 问题描述 给定一个整数数组,数组里可能有正数.负数和零.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如,如果输入的数组为{1,-2,3,10,-4, ...
- java实现算年龄
英国数学家德摩根出生于19世纪初叶(即18xx年). 他年少时便很有才华.一次有人问他的年龄,他回答说: "到了x的平方那年,我刚好是x岁". 请你计算一下,德摩根到底出生在哪一年 ...
- leetcode之两数相加解题思路
问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...
- 使用 UniApp 实现小程序的微信登录
微信登录思路: 在main.js 中封装公共函数,用于判断用户是否登录 在main.js 中分定义全局变量,用于存储接口地址 如果没有登录.则跳转至登录页面 进入登录页面 通过 wx.login 获取 ...
- eclipse中testNG的两种安装方式
今天给大家带来两种关于testNG中的安装方式:1.在线安装(本人亲测有效!!!)2.离线安装 一.在线安装testNG插件的步骤: 1.给大家提供一个testNG在线的安装的地址:http://dl ...