.Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心
一、开场白
在系统设计里我们有很多配置希望独立于系统之外,而又能够被系统实时读取。但是在传统的系统设计里,配置信息通常是耦合在系统内的,比如.net里通常会放在App.config或者web.config里,.net core则是appsettings.json里,这些都不够灵活,如果在制度严格,不允许随便登录服务器的中大型公司里,每次的配置更改就意味着系统的发布,毫无疑问,肯定有带哥要吐槽了,什么垃圾架构!为了解决这一问题,Apollo应运而生,专门用来构建微服务架构里的配置中心,在实际生产项目里为了达到高可用,我们会将其以分布式的方式部署。
粘贴下官方的下载和文档:
官网:https://github.com/ctripcorp/apollo
Wiki:https://github.com/ctripcorp/apollo/wiki(一切的集成方式和使用方法都在这里)
Issues:https://github.com/ctripcorp/apollo/issues(如果期间有任何问题,请通过这里查找大部分解决方法)
二、Maven编译源码
首先要说明一下,官方提供的Quick Start以及预先打好的安装包如果不进行特殊配置都只能单机搭建使用,通过所以如果你想把Apollo搭建在公有云或者调用放和部署不在同一环境,最好自己编译项目。
我这里使用阿里云搭建Apollo,系统是CentOs 7。
1.首先我们需要在以下地址下载源码:
https://github.com/ctripcorp/apollo/releases
2. 源码下载完成后我们需要修改两个地方,Apoolo是微服务架构,使用Eureka实现服务的注册和发现,分布式部署的时候,apollo-configservice
和apollo-adminservice
需要把自己的IP和端口注册到MetaServer(apollo-configservice本身)Server(apollo-configservice本身)。所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configservice
和apollo-adminservice
中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。
我这里的解决方式是直接指定IP。通过修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,指定apollo-configservice和apollo-adminservice的IP端口。
解压源码文件,通过 apollo-1.3.0\apollo-adminservice\src\main\resources 找到 bootstrap.yml 文件,添加以下配置:
eureka:
instance:
ip-address: xx.xx.xx.xx
hostname: ${hostname:47.99.92.76}
preferIpAddress: true
status-page-url-path: /info
health-check-url-path: /health
client:
serviceUrl:
# This setting will be overridden by eureka.service.url setting from ApolloConfigDB.ServerConfig or System Property
# see com.ctrip.framework.apollo.biz.eureka.ApolloEurekaClientConfig
defaultZone: http://${eureka.instance.hostname}:8080/eureka/
healthcheck:
enabled: true
eurekaServiceUrlPollIntervalSeconds: management:
health:
status:
order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP
ip-address是我阿里云的公有IP,其它部署环境同理。
通过 apollo-1.3.0\apollo-configservice\src\main\resources 找到 bootstrap.yml 文件,配置同上。
同时我们还需要配置下MySQL数据库的链接信息,通过 apollo-1.3.0\scripts 找到 build.sh 文件,编辑链接信息:
# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=xxx
apollo_config_db_password=xxx # apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=xxx
apollo_portal_db_password=xxx
因为我的MySQL就是部署在同一个阿里云上,所以就使用localhost,大家酌情修改。
Apollo依赖于MySQL,我们需要先把其对应的数据库跑出来,通过以下路径加载两个sql文件:
Configdb:apollo-1.3.0\scripts\db\migration\configdb
Portaldb:apollo-1.3.0\scripts\db\migration\portaldb
配置就到这里,接下来我们要安装Maven环境来编译源码:
1.安装maven
Windows环境通过本文安装:https://blog.csdn.net/Snowprincev/article/details/81670037
2、解压安装
tar -zxvf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 /usr/local/maven-3.3.9
3、配置环境变量
vi /etc/profile
#在适当的位置添加
export M2_HOME=/usr/local/maven3 (这里需要制定你的安装目录 自定义的哈)
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
4、使配置生效
保存退出后运行下面的命令使配置生效,或者重启服务器生效。
source /etc/profile
5、验证版本
mvn -v
6.配置阿里云仓库,国内速度快
在maven的settings.xml 文件里配置mirrors的子节点,添加如下mirror:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
7.阿里云cd到源码文件夹路径 apollo-1.3.0\scripts ,执行以下命令编译源码:
./build.sh
该脚本会依次打包apollo-configservice, apollo-adminservice, apollo-portal。
8.编译完成后
获取位于apollo-configservice/target/
目录下的apollo-configservice-x.x.x-github.zip。解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
获取位于apollo-adminservice/target/
目录下的apollo-adminservice-x.x.x-github.zip。解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
获取位于apollo-portal/target/
目录下的apollo-portal-x.x.x-github.zip。解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
OK,上面3个启动后,我们就可以通过Ip:8070 访问Apollo的UI界面的,通过默认的 账户密码登录:apollo/admin
通过IP:8080访问Eureka的UI界面查看被注册的configure和admin两个进程。
二、新建.Net Core API项目试用
1.新建.net core api项目,通过nuget引入项目包:Com.Ctrip.Framework.Apollo.Configuration。
2.在Program.cs中添加如下代码:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) =>
{
builder
.AddApollo(builder.Build().GetSection("apollo"))
.AddDefault();
})
.UseStartup<Startup>();
}
3.appsettings.json中进行如下配置,我们这里试用默认自带的SimpleApp测试:
{
"apollo": {
"AppId": "SampleApp",
"MetaServer": "http://47.99.92.76:8080",
"Env": "Dev"
}
}
这里配置的意思是客户端需要通过Eureka查询Configure服务的地址,从而获取配置信息。
private IConfiguration _configuration; public ValuesController(IConfiguration configuration)
{
_configuration = configuration;
} [HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
string title = _configuration["timeout"];
return new string[] { "value1", "value2", title };
}
运行项目查看:
OK,运行成功,更多信息大家可以去官方gitHub查看哦,目前博主所在的公司已经使用Apollo很久了,而且.net 端一个分支的维护者还是博主公司架构组的一位同事,就是下面这个:
看下使用Apollo后的项目运行图,服务配置数据可以正常请求:
今天就到这了,12点睡觉了!!
.Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心的更多相关文章
- .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关
1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...
- .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证
这里第一次搭建,所以IdentityServer端比较简单,后期再进行完善. 1.新建API项目MI.Service.Identity,NuGet引用IdentityServer4,添加类InMemo ...
- .Net Core 商城微服务项目系列(十二):使用k8s部署商城服务
一.简介 本篇我们将会把商城的服务部署到k8s中,同时变化的还有以下两个地方: 1.不再使用Consul做服务的注册和发现,转而使用k8s-dns来实现. 2.不再使用Ocelot作为业务网关,使用T ...
- .Net Core 商城微服务项目系列(六):搭建自己的Nuget包服务器
当我们使用微服务架构之后,紧接而来的问题便是服务之间的程序集引用问题,可能没接触过的同学不太理解这句话,都已经微服务化了为什么还要互相引用程序集,当然可以不引用.但是我们会有这样一种情况,我们的每个接 ...
- .Net Core 商城微服务项目系列(七):使用消息队列(RabbitMQ)实现服务异步通信
RabbitMQ是什么,怎么使用我就不介绍了,大家可以到园子里搜一下教程.本篇的重点在于实现服务与服务之间的异步通信. 首先说一下为什么要使用消息队列来实现服务通信:1.提高接口并发能力. 2.保证 ...
- .Net Core 商城微服务项目系列(十):使用SkyWalking构建调用链监控(2019-02-13 13:25)
SkyWalking的安装和简单使用已经在前面一篇介绍过了,本篇我们将在商城中添加SkyWalking构建调用链监控. 顺带一下怎么把ES设置为Windows服务,cd到ES的bin文件夹,运行ela ...
- .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统
一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ...
- .Net Core 商城微服务项目系列(十三):搭建Log4net+ELK+Kafka日志框架
之前是使用NLog直接将日志发送到了ELK,本篇将会使用Docker搭建ELK和kafka,同时替换NLog为Log4net. 一.搭建kafka 1.拉取镜像 //下载zookeeper docke ...
- .Net Core 商城微服务项目系列(五):使用Polly处理服务错误
项目进行微服务化之后,随之而来的问题就是服务调用过程中发生错误.超时等问题的时候我们该怎么处理,比如因为网络的瞬时问题导致服务超时,这在我本人所在公司的项目里是很常见的问题,当发生请求超时问题的时候, ...
随机推荐
- 舍得 (学习html几天)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 转载-Spring Boot应用监控实战
概述 之前讲过Docker容器的可视化监控,即监控容器的运行情况,包括 CPU使用率.内存占用.网络状况以及磁盘空间等等一系列信息.同样利用SpringBoot作为微服务单元的实例化技术选型时,我们不 ...
- 【selenium】- 常见浏览器的启动
本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1. Firefox启动 webdriver自带了firefox浏览器的驱动,所以不需要设置它的驱动. 如果firefox没有安装在默认路径, ...
- HDU-4027-Can you answer these queries?线段树+区间根号+剪枝
传送门Can you answer these queries? 题意:线段树,只是区间修改变成 把每个点的值开根号: 思路:对[X,Y]的值开根号,由于最大为 263.可以观察到最多开根号7次即为1 ...
- codeforces 798 D. Mike and distribution(贪心+思维)
题目链接:http://codeforces.com/contest/798/problem/D 题意:给出两串长度为n的数组a,b,然后要求长度小于等于n/2+1的p数组是的以p为下表a1-ap的和 ...
- go Server示例
示例1: package main import ( "fmt" "log" "net/http" "time" ) f ...
- .NET Core CSharp 中级篇2-8 特性标签
.NET Core CSharp 中级篇2-8 本节内容为特性标签 简介 标签Attribute是一个非常重要的技术,你可以使用Attribute技术优化精简你的代码.特性标签可以运用在程序集,模块, ...
- Erlang模块gen_fsm翻译
模块摘要 通用有限状态机行为. 描述 用于实现有限状态机的行为模块.使用该模块实现的通用有限状态机进程(gen_fsm)将具有一组标准的接口函数,并包括用于跟踪和错误报告的功能.它 ...
- css3-旋转的太极图
123 body { background-color: #aaa; } .div { width: 400px; height: 400px; border-radius: 50%; border: ...
- Go语言基础之文件操作
本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open()函数能够打开一个 ...