1.介绍

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

2.架构和模块

下面是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进程中。

2.1用户在配置发布后的实时推送设计

在配置中心中,一个重要的功能就是配置发布后实时推送到客户端。下面我们简要看一下这块是怎么设计实现的:
●用户在Portal操作配置发布。
●Portal调用Admin Service的接口操作发布。
●Admin Service发布配置后,发送ReleaseMessage给各个Config Service。
●Config Service收到ReleaseMessage后,通知对应的客户端。

2.2Apollo客户端的实现原理

●客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送(通过Http Long Polling实现)。
●客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。
  ○这是一个fallback机制,为了防止推送机制失效导致配置不更新。
  ○客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified。
  ○定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。
●客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中。
●客户端会把从服务端获取到的配置在本地文件系统缓存一份。
  ○在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。本地缓存路径位于C:\opt\data\{appId}\config-cache,所以请确保C:\opt\data\目录存在,且应用有读写权限。
●应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知。

2.3环境配置(Environment)

Apollo支持应用在不同的环境有不同的配置,所以Environment是另一个从服务器获取配置的重要信息。Environment通过配置文件来指定,文件位置为C:\opt\settings\server.properties,文件内容形如:
env=DEV
目前,env支持以下几个值(大小写不敏感):
●DEV:Development environment
●FAT:Feature Acceptance Test environment
●UAT:User Acceptance Test environment
●PRO:Production environment

3.Apollo在Windows上快速启动

3.1准备工作

3.1.1 Java jdk

●Apollo服务端:1.8+
●Apollo客户端:1.7+
 Java jdk1.8下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html,这里提醒一下,安装目录名称千万别有空格,不然会Apollo启动时候会报错的。
在配置好后,可以通过如下命令检查:

  1. java -version


配置下环境变量:

3.1.2MySQL

●版本要求:5.6.5+(MySQL服务端安装我就不说了,自行百度)
Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。
连接上MySQL后,可以通过如下命令检查:

  1. SHOW VARIABLES WHERE Variable_name = 'version';

3.1.3下载快速启动安装包

下载Apollo安装包,大家只需要下载到本地,就可以直接使用,免去了编译、打包过程。

●Github下载:https://github.com/nobodyiam/apollo-build-scripts
●百度网盘下载:https://pan.baidu.com/share/init?surl=Ieelw6y3adECgktO0ea0Gg,提取码: 9wwe
安装包要58M这么大,是因为这是一个可以自启动的jar包,里面包含了所有依赖jar包以及一个内置的tomcat容器。解压Apollo安装包后会看到如下文件:

3.2安装步骤

3.2.1创建数据库

Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
创建ApolloPortalDB:通过各种MySQL客户端导入sql/apolloportaldb.sql即可。
下面以MySQL原生客户端为例:

  1. source /your_local_path/sql/apolloportaldb.sql

● 创建ApolloConfigDB:通过各种MySQL客户端导入sql/apolloconfigdb.sql即可。
下面以MySQL原生客户端为例:

  1. source /your_local_path/sql/apolloconfigdb.sql
3.2.2配置数据库连接信息

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

  1. # apollo config db info
  2. apollo_config_db_url=jdbc:mysql://172.168.16.xxx:5621/ApolloConfigDB?characterEncoding=utf8
  3. apollo_config_db_username=用户名
  4. apollo_config_db_password=密码
  5.  
  6. # apollo portal db info
  7. apollo_portal_db_url=jdbc:mysql://172.168.16.xxx:5621/ApolloPortalDB?characterEncoding=utf8
  8. apollo_portal_db_username=用户名
  9. apollo_portal_db_password=密码

3.3启动Apollo配置中心

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

  1. lsof -i:8080

●在Window下,可以通过如下命令检查:

  1. netstat -aon|findstr 8080

先切换到Apollo目录:

  1. cd D:\StudyDocuments\technology\Apollo\apollo-build-scripts-master

然后执行启动脚本:

  1. ./demo.sh start


因为我是在本机部署Apollo服务端的,所以直接打开http://localhost:8070即可:

默认管理员用户名:apollo,密码:admin,输入即可登录成功!而Eureka默认端口是8080,即打开http://localhost:8080/即可:

阿波罗如何创建修改用户密码、创建用户、部门,分配权限等等操作,我就不说了,大伙可以自行百度或者去官网了解,这不在本文范畴之内。

4.ASP.NET Core集成Apollo快速开发

4.1Apollo环境配置

Apollo默认有两个组织部门,可以通过登录后管理员工具-系统参数,输入key值organizations添加修改。返回主界面点击创建项目后,根据自身项目输入相关项目信息,我这边demo项目信息如下:

创建项目后,点击进去可能会报如下错误提示:

这种错误一般是数据库Eureka服务配置参数不正确导致的!因为我是本地部署Apollo服务端的,IIS已经存在一个站点占用了Eureka服务默认端口8080,所以停掉站点后,输入demo.sh stop-demo.sh start重新启动下Apollo即可。重新启动Apollo后可能还会提示如下信息:

因为项目缺少环境namespaces配置,点击左侧“添加Namespace”选项添加一个dev开发环境namespaces:


namespaces创建后新增AspNetCore.Apollo.Test.WebApi项目开发环境配置:

上述配置相当于Core项目appsettings.json中以下配置:

然后点击发布即可。

4.2ASP.NET Core集成Apollo

通过Github上https://github.com/ctripcorp/apollo.net源码可以了解到,示例AspNetCore.Apollo.Test.WebApi应用可以通过appsettings.json文件可以添加Apollo环境配置信息:

  1. {
  2. "apollo": {
  3. "AppId": "AspNetCore.Apollo.Test.WebApi",
  4. //"Cluster": "test",////没有集群,暂时隐藏
  5. "MetaServer": "http://localhost:8080/",
  6. //"Secret": "ffd9d01130ee4329875ac3441c0bedda",////没有ids4接入,暂时隐藏
  7. //"Namespaces": [ "application.xml", "application.json", "application.yml", "application.yaml", "application" ],////没有Namespace数组,暂时隐藏
  8. "Namespace": "dev",
  9. "Env": "Dev",
  10. "Meta": {
  11. "DEV": "http://localhost:8080/"
  12. //"FAT": "http://106.54.227.205:8080/",
  13. //"UAT": "http://106.54.227.205:8080/",
  14. //"PRO": "http://106.54.227.205:8080/"
  15. ////示例暂时只有开发环境
  16. }
  17. }
  18. }

然后在Program主程序入口引用Com.Ctrip.Framework.Apollo.Configuration Nuget包,添加Apollo环境配置信息,添加Namespace名称,具体配置代码如下:

  1. .ConfigureAppConfiguration(builder =>
  2. {
  3. var iConfigurationRoot = builder.Build();
  4. var apolloInfo = iConfigurationRoot.GetSection("apollo");
  5. var namespaceName = iConfigurationRoot.GetSection("apollo").GetSection("Namespace").Value;
  6. builder.AddApollo(apolloInfo).AddNamespace(namespaceName);
  7. })

然后运行示例AspNetCore.Apollo.Test.WebApi应用,会看到如下调试信息:


从上述调试信息可以看到Apollo在ASP.NET Core集成成功!

参考文献:
Apollo
Apollo Quick-Start
Apollo配置中心设计
微服务架构~携程Apollo配置中心架构剖析
.Net客户端使用指南

(30)ASP.NET Core3.1 集成Apollo快速安装与使用的更多相关文章

  1. asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用

    前言:由于公司占时没有运维,出于微服务的需要,Apollo只能先装在windows 阿里云上跑起来,由于环境及网络等问题,在安装过程中遇到很多坑,算是一个个坑填完后,最终实现. 一. java jdk ...

  2. spring boot 集成apollo 快速指南

    目前市面上流行的三大配置中心框架:Spring CLoud Config .Alibaba Nacos 以及携程apollo, 我们相应架构组号召,就使用Apollo吧. Work Flow 简单解释 ...

  3. Apollo快速安装视频教程

    参见视频 https://www.csdn.net/article/a/2018-05-14/15948340

  4. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...

  5. 在 ASP.NET Core 中集成 Skywalking APM

    前言 大家好,今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking,Skywalking 是 Apache 基金会下面的一个开源 APM 项目,有些同学可能会 APM ...

  6. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  7. ASP.NET Identity 2集成到MVC5项目--笔记02

    ASP.NET Identity 2集成到MVC5项目--笔记01 ASP.NET Identity 2集成到MVC5项目--笔记02 继上一篇,本篇主要是实现邮件.用户名登陆和登陆前邮件认证. 1. ...

  8. 探索Asp net core3中的 项目文件、Program.cs和通用host(译)

    引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版 ...

  9. 【Sentinel】sentinel 集成 apollo 最佳实践

    [Sentinel]sentinel 集成 apollo 最佳实践 前言   在 sentinel 的控制台设置的规则信息默认都是存在内存当中的.所以无论你是重启了 sentinel 的客户端还是 s ...

随机推荐

  1. 有什么数据恢复软件可以恢复CF数据

    虽然现在SD卡出现并且日益流行,但是CF卡(Compact Flash)作为一种存储设备,仍然是专业数码相机的主流标准.不仅是数码相机,CF接口还广泛用于PDA.笔记本电脑和包括台式机在内的各种设备. ...

  2. DNS系列—DNS简介

    DNS是什么? 如果了解互联网主机之间是用IP地址来进行通信的话,有了这个认识的前提,我们来聊一下什么是DNS.一个IP地址有十几个字符那么长,和手机号码长度差不多,我们怎么记住这些我们想要访问的主机 ...

  3. Oracle表空间和他的数据文件

    //以myspace为例 来源于Oracle 11g数据库应用简明教程 清华出版社 /*创建表空间*/ CREATE TABLESPACE myspace DATAFILE'E:\develop\or ...

  4. Contest 1435

    A \(x\times-y+y\times x=0\),因为 \(n\) 是偶数,所以两两这样构造即可. 时间复杂度 \(O\left(Tn\right)\). B 有点绕的题,要理清思路. 发现行和 ...

  5. Luogu P43916 图的遍历

    我们把"u点能够到达的最大点"转化为反向图中能到达u点的所有点里的最大值,可知缩点后满足无后效性.val[i]的初值设为连通分量i中的最大点.反向存图,tarjan缩点,拓扑序dp ...

  6. MySql学习笔记--详细整理--上

    目录 MySql MySql安装 连接数据库 操作数据库 数据库的列类型 数据库的字段属性 创建数据库 修改删除表 数据管理 外键 DML语言 添加 修改 删除 DQL查询数据(重点) 查询 去重 w ...

  7. JDK 15已发布,你所要知道的都在这里!

    JDK 15已经在2020年9月15日发布!详情见 JDK 15 官方计划.下面是对 JDK 15 所有新特性的详细解析! 官方计划 2019/12/12 Rampdown Phase One (fo ...

  8. 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    [Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...

  9. Java 基础之 String 类

    String String 被声明为 final,因此不能被继承.(Integer 等包装类也不能被继承) 在 java8 中,String 内部使用 char 数组 来存储数据 public fin ...

  10. error: src refspec master does not match any(个人经验)

    分支名写错了,推送不到远程 修改本地分支名称 git branch -m oldName newName 再推送到远程就好了