Asp.NetCore轻松学-配置服务 apollo 部署实践
前言
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
- github 地址:https://github.com/ctripcorp/apollo
- 服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器
- Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持
- .Net客户端不依赖任何框架,能够运行于所有.Net运行时环境
- 以上摘抄自官方文档,该框架目前已达 9000 多个 star,而且目前已经支持了 .netcore 客户端
安装
服务器环境安装检查
由于本次是按照正式环境来模拟一次部署,所以,按照官方指引,正式环境部署并不建议使用 Quick Start;接下来打开官方“分布式部署”指引文档:https://github.com/ctripcorp/apollo/wiki/分布式部署指南
- 首先是检查服务器是否安装了 Java 环境,在服务器输入 java -version
- 可以看到,服务已经安装,如果没有安装,这输入 yum install java-1.8.0-openjdk(本次使用的服务器为 Centos 7.0)。
数据库检查
官方要求数据库为 MySQL,版本要求:5.6.5+,我在这里使用了 MariaDB 10.3,效果相同,安装好数据库后,下载官方 SQL 文件,执行,创建 apollo 所需的数据库。数据库文件一共有两个
- ApolloPortalDB 地址:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloportaldb.sql 这个是 Portal 数据库,可以用来做各种环境的统一管理
- ApolloConfigDB 地址:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloconfigdb.sql 这是“配置”存储数据库,每个环境应该单独部署一份,比如 开发、测试、产品 环境,应该每个环境部署一份,因为各自环境的配置内容是不同的
- 为了方便,我现在把两个数据库都安装在本地,安装好数据库文件后,进入 ApolloConfigDB 通过执行 SQL 命令,进行检查
- ApolloPortalDB 同理,可以看到,数据库已经成功安装
安装服务和 web 管理控制台
服务一共有 3 个实例,都从这里下载:https://github.com/ctripcorp/apollo/releases,我直接下载作者编译好的 zip 文件
下面简单介绍各个服务以及用途
- apollo-configservice apollo 配置文件服务,该服务直接对外提供服务,同时需要在 portal 进行元数据注册,下面修改该服务的数据库配置文件。
修改配置文件 /apollo-configservice-1.1.2/config/application-github.properties 为刚才数据库的配置
spring.datasource.url = jdbc:mysql://127.0.0.1:3406/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
- apollo-adminservice-1.1.2 web 管理服务,同样修改其配置文件 apollo-adminservice-1.1.2/config/application-github.properties 为 ApolloConfigDB 数据库的地址,同上。
- apollo-portal-1.1.2 元数据服务,修改配置文件 apollo-portal-1.1.2/config/application-github.properties,注意,这里的数据必须为 ApolloPortalDB ,如下:
spring.datasource.url = jdbc:mysql://127.0.0.1:3406/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
- 最后,还需要修改 apollo-portal-1.1.2/config/apollo-env.properties 文件,将 configservice 都注册到 portalservice 中
local.meta=http://localhost:8080
dev.meta=http://172.16.1.220:8080
fat.meta=http://172.16.1.220:8080
uat.meta=http://172.16.1.220:8080
lpt.meta=${lpt_meta}
pro.meta=http://172.16.1.227:8080
启动和修改配置
在上面做好三个服务端配置后,下面我们就可以逐一的启动各个服务了,各自服务端监听端口都位于 xxx/scripts/startup.sh 中
- 执行 sh apollo-configservice-1.1.2/scripts/startup.sh 启动 config 服务,监听端口默认:8080
- 执行 sh apollo-portal-1.1.2/scripts/startup.sh 启动 portal 服务,监听端口默认:8070
- 执行 sh apollo-adminservice-1.1.2/scripts/startup.sh 启动 admin 服务,监听端口默认:8090
如果输出看到以上三个服务都输出信息为,证明服务启动成功
Waiting for server startup....
Mon Nov 19 11:07:15 CST 2018 Server started in 20 seconds!
- 通过查看 cat apollo-adminservice-1.1.2/scripts/startup.sh 得知,该服务监听端口为 8070,打开浏览器,输入地址:http://localhost:8090,看到了如下界面
- 输入默认账号密码:apollo/admin 登录 web 控制台进行查看。
- 为了方便演示,首先创建一个项目 webapplication1
- 进入 webapplication1,
- 点击左侧按钮“添加Namespace”,创建一个公共的命名空间,取名为:common
- 创建成功,返回项目主页
- 在 dotnet.versin 命名空间下点击“新增配置”按钮,增加一个配置节点
- 创建完成后,可以看到,该节点状态为 “未发布”
- 点击该命名空间下的“发布”按钮,将其进行发布
- 使用以上方法,在默认的命名空间“application” 下也创建一个名为“connectionstring" 的节点,同样将其发布
- 此时,恭喜你,已完成服务器部署发布,接下来,我们通过创建一个 web 应用程序访问该配置服务
客户端访问
- 首先创建 web 项目,完成后在 nuget 包管理器上引用 apollo 的 .netcore 客户端 Com.Ctrip.Framework.Apollo.Configuration
- 打开 Program.cs 文件,将刚才在 apollo 服务上创建的命名空间加入到管道中
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var hostBuilder = WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((context, builder) =>
{
builder.AddApollo(builder.Build().GetSection("apollo"))
.AddDefault()
.AddNamespace("dotnet.version")
.AddNamespace("application");
});
return hostBuilder;
}
- 以上代码中有一个方法 AddApollo ,这里传入了本地配置文件节点 builder.Build().GetSection("apollo"),其配置如下
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"apollo": {
"AppId": "webapplication1",
"MetaServer": "http://172.16.1.220:8080"
}
}
- AppId 对于 我们创建的在 apollo web 控制台上创建的项目ID webapplication1,元数据服务指向 8080 端口,正是 configservice 的监听端口
- 在 HomeController 的操作 Action 中,获取配置节点,并输出到客户端
public IActionResult Index()
{
this.ViewBag.ConnectionString = this.cfg["connectionstring"];
this.ViewBag.LastVersion = this.cfg["last-version"];
return View();
}
- 启动项目,可以看到
- 至此,测试完成
结语
- apollo 项目官方部署指引非常复杂,原因就在于整个官方文档都是大片大片的文字进行铺排,圣人说:看图就会,见字想睡,本文希望通过自己的测试能帮助更多想应用 apollo 配置管理服务的朋友
- 注意,安装完成默认只有 DEV 配置环境,如果需要增加环境,可直接修改数据库 apolloportaldb.serverconfig 表,字段名称为 apollo.portal.envs 的列值,多个环境以逗号分隔,保存,重启服务即可
Asp.NetCore轻松学-配置服务 apollo 部署实践的更多相关文章
- 目录---Asp.NETCore轻松学系列【目录】
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
- 【目录】Asp.NETCore轻松学系列
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
- Asp.NETCore轻松学系列阅读指引目录
前言 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进阶,适合没有 .NETCore 编程经验到小白同学,也适合从 .NET Framework 迁移 ...
- Asp.NetCore轻松学-使用Supervisor进行托管部署
前言 上一篇文章 Asp.NetCore轻松学-部署到 Linux 进行托管 介绍了如何在 Centos 上部署自托管的 .NET Core 应用程序,接下来的内容就是介绍如何使用第三方任务管理程序来 ...
- Asp.NetCore轻松学-部署到 Linux 进行托管
前言 上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS,且学习了进程内托管和进程外托管的区别:接下来就要说说应用 Asp.Net Core 的特性(跨平台),将 .Ne ...
- Asp.NetCore轻松学-部署到 IIS 进行托管
前言 经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地 ...
- Asp.NetCore轻松学-使用Docker进行容器化托管
前言 没有 docker 部署的程序是不完整的,在写了 IIS/Centos/Supervisor 3篇托管介绍文章后,终于来到了容器化部署,博客园里面有关于 docker 部署的文章比比皆是,作为硬 ...
- Asp.NetCore轻松学-实现一个轻量级高可复用的RabbitMQ客户端
前言 本示例通过对服务订阅的封装.隐藏细节实现.统一配置.自动重连.异常处理等各个方面来打造一个简单易用的 RabbitMQ 工厂:本文适合适合有一定 RabbitMQ 使用经验的读者阅读,如果你还没 ...
- Asp.NetCore轻松学-业务重点-实现一个简单的手机号码验证
前言 本文纯干货,直接拿走使用,不用付费.在业务开发中,手机号码验证是我们常常需要面对的问题,目前市场上各种各样的手机号码验证方式,比如正则表达式等等,本文结合实际业务场景,在业务级别对手机号 ...
随机推荐
- 基于Kafka Connect框架DataPipeline可以更好地解决哪些企业数据集成难题?
DataPipeline已经完成了很多优化和提升工作,可以很好地解决当前企业数据集成面临的很多核心难题. 1. 任务的独立性与全局性. 从Kafka设计之初,就遵从从源端到目的的解耦性.下游可以有很多 ...
- linux中~/cut/argus/
1.Linux shell 截取字符变量的前8位 实现方法有如下几种: expr substr "$a" 1 8 echo $a|awk '{print substr(,1,8)} ...
- SpringCloud实战-Zuul网关服务
为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先暴露了我们实体机器的IP地址,别人一看你的 ...
- 基于.net core实现项目自动编译、并生成nuget包
近期想对自己的项目增加自动编译并生成nuget包,网上资料不少.但总还有迷糊的时候.首先:此解决方案包含多种版本的项目,如:有编译必须是x86平台,以及还有传统的.net foramework项目,以 ...
- MongoDB中文档操作(二)
一.插入文档 1.db.集合名.insert() 插入一个:db.user.insert({name:"Join",age:13,address:"beijing& ...
- Android 自定义ViewGroup手把手教你实现ArcMenu
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这 ...
- 用secureCRT连接虚拟机中的Ubuntu系统,出现“远程主机拒绝连接”错误
因为我的Ubuntu中未安装ssh服务,终端下运行命令: sudo apt-get install openssh-server 之后重启一下sshd服务: sudo service sshd res ...
- Python 三级菜单 增强版
需要实现的功能是:三级菜单1.从文本内读出选项2.查询每一级的选项,并能对选项进行增/删/改功能3.每一级可以退出程序或者返回上一层 2018-5-14 更新内容 思路 实现过程中的BUG及解决方案: ...
- 搭建 vue2 单元测试环境(karma+mocha+webpack3)
从网上找了很多例子关于单元测试,都是如何新建项目的时候的添加单元测试,用vue-cli中怎么添加,但是我的项目已经生成了,不能再一次重新初始化,这时如何添加单元测试,这里面遇到了好多坑,写在这里记录一 ...
- MySQL如何优化
对于全栈而言,数据库技能不可或缺,关系型数据库或者nosql,内存型数据库或者偏磁盘存储的数据库,对象存储的数据库或者图数据库--林林总总,但是第一必备技能还应该是MySQL.从LAMP的兴起,到Ma ...