在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章。本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架构示范,也会更加贴近于实际应用环境。

一、示例整体架构

  此示例会由一个API Gateway, 一个Consul Client以及三个Consul Server组成,有关Consul的Client和Server这两种模式的Agent的背景知识,请移步我之前的文章加以了解:《.NET Core微服务之基于Consul实现服务治理》。其中,Consul的Client和Server节点共同构成一个Data Center,而API Gateway则从Consul中获取到服务的IP和端口号,并返回给服务消费者。这里的API Gateway是基于Ocelot来实现的,它不是这里的重点,也就不过多说明了,不了解的朋友请移步我的另一篇:《.NET Core微服务之基于Ocelot实现API网关服务》。

二、Consul集群搭建

2.1 Consul镜像拉取

docker pull consul:1.4.4

  验证:docker images

  

2.2 Consul Server实例创建

  以下我的实践是在一台机器上(CentOS 7)操作的,因此将三个实例分别使用了不同的端口号(区别于默认端口号8500)。实际环境中,建议多台机器部署。

  (1)Consul实例1

docker run -d -p 8510:8500 --restart=always
-v /XiLife/consul/data/server1:/consul/data
-v /XiLife/consul/conf/server1:/consul/config
-e CONSUL_BIND_INTERFACE='eth0' --privileged=true
--name=consul_server_1 consul:1.4.4 agent -server
-bootstrap-expect=3 -ui -node=consul_server_1
-client='0.0.0.0'
-data-dir /consul/data -config-dir /consul/config
-datacenter=xdp_dc;

  

(2)Consul实例2

  为了让Consul实例2加入集群,首先获取一下Consul实例1的IP地址:

JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' consul_server_1)";

docker run -d -p 8520:8500 --restart=always
-v /XiLife/consul/data/server2:/consul/data
-v /XiLife/consul/conf/server2:/consul/config
-e CONSUL_BIND_INTERFACE='eth0'
--privileged=true
--name=consul_server_2 consul:1.4.4 agent -server -ui
-node=consul_server_2 -client='0.0.0.0'
-datacenter=xdp_dc
-data-dir /consul/data
-config-dir /consul/config
-join=$JOIN_IP;

  (3)Consul实例3

docker run -d -p 8530:8500 --restart=always
-v /XiLife/consul/data/server3:/consul/data
-v /XiLife/consul/conf/server3:/consul/config
-e CONSUL_BIND_INTERFACE='eth0' --privileged=true
--name=consul_server_3 consul:1.4.4 agent -server -ui
-node=consul_server_3 -client='0.0.0.0'
-datacenter=xdp_dc
-data-dir /consul/data
-config-dir /consul/config
-join=$JOIN_IP;

  验证1:docker exec consul_server_1 consul operator raft list-peers

  

  验证2:http://192.168.16.170:8500/

  

2.3 Consul Client实例创建

  (1)准备services.json配置文件,向Consul注册两个同样的Product API服务

    {    "services": [ {   "id": "core.product-/192.168.16.170:8000",  "name": "core.product", "tags": [ "xdp-/core.product" ],    "address": "192.168.16.170",    "port": 8000, "checks": [   {   "name": "core.product.check",   "http": "http://192.168.16.170:8000/api/health",    "interval": "10s",  "timeout": "5s" }   ]   },  {   "id": "core.product-/192.168.16.170:8001",  "name": "core.product", "tags": [ "xdp-/core.product" ],    "address": "192.168.16.170",    "port": 8001, "checks": [   {   "name": "core.product.check",   "http": "http://192.168.16.170:8001/api/health",    "interval": "10s",  "timeout": "5s" }   ]   }   ]   }
    有关配置文件的细节,请移步另一篇文章:《.NET Core微服务之基于Consul实现服务治理(续)》

  (2)Consul Client实例

docker run -d -p 8550:8500 --restart=always
-v /XiLife/consul/conf/client1:/consul/config
-e CONSUL_BIND_INTERFACE='eth0'
--name=consul_client_1 consul:1.4.4 agent -node=consul_client_1
-join=$JOIN_IP
-client='0.0.0.0' -datacenter=xdp_dc
-config-dir /consul/config

  (3)验证

  

  

  

2.4 服务检查监控邮件提箱

  (1)为Client添加watches.json

       {  "watches": [  {   "type": "checks",   "handler_type": "http", "state": "critical",    "http_handler_config": {  "path": "http://192.168.16.170:6030/api/Notifications/consul",  "method": "POST",   "timeout": "10s",   "header": { "Authorization": [ "token" ] }    }   }   ]   }

  *.这里的api接口 http://192.168.16.170:6030/api/Notifications/consul是我的一个通知服务发送Email的接口。

  (2)验证

  

三、Ocelot网关配置

3.1 为Ocelot增加Consul支持

  (1)增加Nuget包:Ocelot.Provider.Consul

Nuget>> Install-Package Ocelot.Provider.Consul 

  (2)修改StartUp.cs,增加Consul支持

s.AddOcelot()

.AddConsul();

  更多内容,请移步:Ocelot官方文档-服务发现

3.2 修改Ocelot配置文件增加Consul配置

"GlobalConfiguration": {    "BaseUrl": "http://api.xique.com",  "ServiceDiscoveryProvider": { "Host": "192.168.16.170",   "Port": 8550, "Type": "Consul"    }   }

  *.这里指向的是Consul Client实例的地址

  此外,Ocelot默认策略是每次请求都去Consul中获取服务地址列表,如果想要提高性能,也可以使用PollConsul的策略,即Ocelot自己维护一份列表,然后定期从Consul中获取刷新,就不再是每次请求都去Consul中拿一趟了。例如下面的配置,它告诉Ocelot每2秒钟去Consul中拿一次。

    "Type": "PollConsul",  "PollingInterval": 2000

3.3 Service配置

    // -- Service {   "UseServiceDiscovery": true,  "DownstreamPathTemplate": "/api/{url}", "DownstreamScheme": "http", "ServiceName": "core.product",  "LoadBalancerOptions": {  "Type": "RoundRobin"    },  "UpstreamPathTemplate": "/product/{url}",   "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ]  }

  这里配置了在Consul中配置的服务名(ServiceName),以及告诉Ocelot我们使用轮询策略(RoundRobin)做负载均衡。

3.4 验证

  第一次访问:

  

  第二次访问:

  

四、HA示例整体架构

  对于实际应用中,我们往往会考虑单点问题,因此会借助一些负载均衡技术来做高可用的架构,这里给出一个建议的HA示例的整体架构:

  对于一个API请求,首先会经历一个Load Balancer才会到达API Gateway,这个Load Balancer可以是基于硬件的F5,也可以是基于软件的Nginx或LVS再搭配Keepalived,一般来说大部分团队都会选择Nginx。然后API Gateway通过部署多个,来解决单点问题,也达到负载均衡的效果。而对于API Gateway和Consul Client之间的连接,我们往往也会增加一个Load Balancer来实现服务发现的高可用,这个Load Balancer也一般会基于Nginx/LVS搭配Keepalived,API Gateway只需要访问一个Virtual IP即可。而在Consul Data Center中,Consul Server会选择3或5个,Consul Client也会部署多个,刚刚提到的Virtual IP则会指向多个Consul Client,从而防止了Consul Client的单点问题。


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

基于Docker的Consul服务发现集群搭建相关推荐

  1. ActiveMQ此例简单介绍基于docker的activemq安装与集群搭建

    ActiveMQ拓展连接 此例简单介绍基于Docker的activemq安装与集群搭建 一 :安装 1.获取activemq镜像 docker pull webcenter/activemq 2.启动 ...

  2. Windows家庭版下基于Docker的hadoop、Spark集群搭建

    Windows家庭版下基于Docker的hadoop.Spark集群搭建 目录 Windows家庭版下基于Docker的hadoop.Spark集群搭建 1.实验目的 2.实验平台 3.实验内容和要求 ...

  3. 基于 Docker 的 Redis 高可用集群搭建(redis-sentinel)

    前言   之前介绍了用docker来搭建redis主从环境,但这只是对数据添加了从库备份(主从复制),当主库down掉的时候,从库是不会自动升级为主库的,也就是说,该redis主从集群并非是高可用的. ...

  4. 安装-consul服务发现集群

    centos 7.4.x consul  1.2.2 list: 172.16.16.103 172.16.16.112 172.16.16.115 下载: #cd /usr/local/ #wget ...

  5. Docker Swarm 初步认识 及 集群搭建

    [Docker那些事]系列文章 docker 安装 与 卸载 centos Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT ...

  6. 常用服务的集群搭建(redis、MQ、es、zookerper)

    常用服务的集群搭建(redis.MQ.es.zookerper) 1.集群概述 1.1什么是集群 1.1.1集群概念 集群是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地 ...

  7. 基于slurm框架的GPU服务器集群搭建方法

    基于slurm框架的GPU服务器集群搭建操作文档 1. 环境基础 2. 环境配置 2.1 hostname配置 2.2 关闭SELinux (master, slave) 2.3 关闭Firewall ...

  8. 分布式协调服务Zookeeper集群搭建

    分布式协调服务Zookeeper集群搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装jdk环境 1>.操作环境 [root@node101.yinzhengjie ...

  9. Redis基于Linux系统的安装与集群搭建

    最近项目里需要引入Redis,这里记录下Redis的安装.这里以centos7为例,首先我们需要确保防火墙关闭 systemctl status firewalld.service //查看防火墙状态 ...

最新文章

  1. 26张图带你彻底搞懂volatile关键字
  2. 理想L2辅助驾驶都撞车了,特斯拉的L5之梦怎么办?
  3. 怎样检查Android网络连接状态
  4. Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作...
  5. ORA-07445:[SIGFPE] [Integer divide by zero]内部错误一例
  6. 深度学习之循环神经网络(12)预训练的词向量
  7. 在不确定的世界,如何应对风险
  8. 作业2.1.1 安装并使用CheckStyle
  9. Java字符串contains()
  10. 会话推荐和 序列推荐
  11. Unity简单操作:Unity资源商店 Asset store下载文件夹的位置
  12. 神经网络梯度消失和梯度爆炸原因推导及其解决方案
  13. Hash表的初步认识
  14. 成都市绿色建筑创建行动实施计划通知
  15. 升级电脑系统或者重装WIN10后,PADS软件卡死
  16. Eclipse 自定义${date}变量格式的思路历程
  17. 小米微信无法连接到服务器1-10087,微信无法连接到服务器【搞定方向】
  18. 【2023】Kotlin教程 第二篇 面向对象与函数式编程 第15章 数据容器——数组和集合 15.2 集合概述
  19. LeetCode 1646. 获取生成数组中的最大值
  20. Dilated Convolutions——扩张卷积

热门文章

  1. Teams App设备的地理位置能力
  2. 拒绝“高冷”词汇!初学C#中的委托
  3. vue vue-router vuex element-ui axios 写一个代理平台的学习笔记(十一)构思商品页面...
  4. 大数据对六大领域的挑战
  5. 简单链接Simplelink 传感器标签SensorTag
  6. 管理Apache服务器访问日志
  7. 自已做的第一个autoconf程序(不断完善中)
  8. HTTP header中的 Cache-control
  9. 如何通过 C# 将文本变为声音 ?
  10. VS扩展CodeMaid代码整理插件