本文讲的是10x系列之Clay.io的服务发现,【编者的话】Clay.io的Zoli Kahan撰写了“10X”系列博文,分享如何只使用一个很小的团队支撑Clay.io的大规模应用。本文是整个系列的第四篇,介绍如何构建一个服务发现系统。

架构

面向服务的架构是构建绝大多数产品的最可迭代和可用的软件配置之一。这些系统也遇到过很多问题,其中最大的问题可能就是服务发现问题。服务发现实际定义了你的服务如何与其它服务通信。Docker里也有这个问题。如果你不知道我们如何部署Docker,请参看Docker at Clay.io(中文翻译)。

教程

Synapse(https://github.com/claydotio/synapse)是一个动态配置本地HAproxy的后台程序。HAproxy负责在集群内将请求转发到服务,它会根据配置文件的定义,寻找Amazon EC2(或其它)服务。我们用的是ec2tag,可以很容易地通过标签化服务器将其添加到集群。

HAProxy

让我们从服务入手。服务之间通过本地的HAProxy实例互相通信。因为服务运行在Docker内部,我们需要为服务指定宿主IP在某个特定端口寻找服务。

我们使用Ansible将本地IP和端口传给运行在机器上的服务。

SERVICE_API=http://{ ansible_default_ipv4.address }:{ service_port }

对于要使用其它服务的服务,只需要简单地调用IP/端口。这里的关键点是IP是本地机器的IP,它可以被HAProxy处理。我们发布了一个HAProxy docker容器,它监控挂载着的配置文件,在有变化时自动更新:
https://github.com/claydotio/haproxy

docker run
--restart always
--name haproxy
-v /var/log:/var/log
-v /etc/haproxy:/etc/haproxy
-d
-p 50001:50001
-p 50002:50002
-p 50003:50003
-p 50004:50004
...
-p 1937:1937
-t clay/haproxy

我们默认在/etc/haproxy 使用noop config,它会挂载到Docker容器中并监控变化。我们也会将相同的HAproxy config挂载到Synapse容器。需要注意的是,如果这个容器关闭了,机器上的所有服务就不会被其它服务发现。因此,我们给容器也分配了另外的端口以供未来的新服务使用(因为无法被动态分配)。

Synapse

好了,现在开始搭建Synapse。

Synapse的运行很简单(归功于公共Docker容器库)。

docker run
--restart always
--name synapse
-v /var/log:/var/log
-v /etc/synapse:/etc/synapse
-v /etc/haproxy:/etc/haproxy
-e AWS_ACCESS_KEY_ID=XXX
-e AWS_SECRET_ACCESS_KEY=XXX
-e AWS_REGION=XXX
-d
-t clay/synapse
synapse -c /etc/synapse/synapse.conf.json

注意我们如何在容器里挂载Synapse config以及HAproxy config。HAProxy配置就是上文提到的noop config(因为其会由Synapse自动生成),我们来看看如何配置Synapse。

配置Synapse有些难,因为文档写得不是很好。如下是示例配置,可以解释所有文档里缺失的信息:

{
"services": {
"myservice": {"discovery": {// use amazon ec2 tags"method": "ec2tag","tag_name": "servicename","tag_value": "true",// if this is too low, Amazon will rate-limit and block requests"check_interval": 120.0},"haproxy": {// This is the port other services will use to talk to this service// e.g. http://10.0.1.10:50003"port": 50003,"listen": ["mode http"],// This is the port that the service exposes itself"server_port_override": "50001",// This is our custom (non-documented) config for our backup server// See http://zolmeister.com/2014/12/10x-docker-at-clay-io.html// for details on how our zero-downtime deploys work"server_backup_port": "50002","server_options": "check"}
}
},
// See the manual for details on parameters:
// http://cbonte.github.io/haproxy-dconv/configuration-1.5.html
"haproxy": {
// This is never used because HAProxy runs in a separate container
// Reloads happen automatically via the file-watcher
"reload_command": "echo noop",
"config_file_path": "/etc/haproxy/haproxy.cfg",
"socket_file_path": "/var/haproxy/stats.sock",
"do_writes": true,
"do_reloads": true,
"do_socket": false,
// By default, this is localhost, however because HAProxy is running
// inside of a container, we need to expose it to the host machine
"bind_address": "0.0.0.0",
"global": ["daemon","user    haproxy","group   haproxy","chroot  /var/lib/haproxy","maxconn 4096","log     127.0.0.1 local0","log     127.0.0.1 local1 notice"
],
"defaults": ["log            global","mode           http","maxconn        2000","retries        3","timeout        connect 5s","timeout        client  1m","timeout        server  1m","option         redispatch","balance        roundrobin","default-server inter 2s rise 3 fall 2","option         dontlognull","option         dontlog-normal"
],
"extra_sections": {"listen stats :1937": ["stats enable","stats uri /","stats realm Haproxy Statistics"]
}
}

}

结论

特别感谢Airbnb开源了他们的工具,这使得我们可以以简单可扩展的方式搭建服务发现系统。对于没有使用Amazon EC2的人,可以使用Zookeeper watcher(我们没有用到),或者即将可以使用的etcd watcher。

一旦代码被合并,我们可能会选择使用Nerve和etcd替代EC2标签,来发布服务。以下etcd示例的Docker信息仅供参考:

curl https://discovery.etcd.io/new?size=3
docker run
--restart always
--name etcd
-d
-p 2379:2379
-p 2380:2380
-v /opt/etcd:/opt/etcd
-v /var/log:/var/log
-v /etc/ssl/certs:/etc/ssl/certs
quay.io/coreos/etcd:v2.0.0
-data-dir /opt/etcd
-name etcd-unique-name
-listen-client-urls http://0.0.0.0:2379
-listen-peer-urls http://0.0.0.0:2380
-advertise-client-urls http://localhost:2379
-initial-advertise-peer-urls http://localhost:2380
-discovery https://discovery.etcd.io/XXXXXXXXXXXX
-initial-cluster-token cluster-token-here

本系列的其它文章

1. 10x系列之Clay.io的架构
2. 10x系列之Clay.io是如何处理日志的
3. 10x系列之Docker在Clay.io

原文链接:10x: Service Discovery at Clay.io(翻译:崔婧雯 校对:李颖杰)

===========================
译者介绍
崔婧雯,现就职于VMware,高级软件工程师,负责桌面虚拟化产品的质量保证工作。曾在IBM WebSphere业务流程管理软件担任多年系统测试工作。对虚拟化,中间件技术有浓厚的兴趣。

原文发布时间为:2015-03-02 
本文作者:崔婧雯 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:10x系列之Clay.io的服务发现

10x系列之Clay.io的服务发现相关推荐

  1. Ambassador系列-03-服务配置和服务发现

    Ambassador 服务配置 Ambassador提供了三种服务配置方法. CRDs方式:Customer Resource Definitions 注解方式:Kubernetes Service ...

  2. 读猿码系列——1. gRPC+Etcd3的服务发现负载均衡

    项目源码:https://github.com/wwcd/grpc-lb 项目文档:https://segmentfault.com/a/1190000008672912 我们先把项目down下来,它 ...

  3. 干货实操:微服务Spring Cloud 系列(二) Eureka服务发现与服务注册(strand alone)

    此篇主要实操Eureka 服务端的服务注册,以及服务发现,并需要认证才能访问控制中心. 分五个部分说明: 一.  认识 Eureka 二.  Eureka  服务端开发 三.  Eureka 客户端开 ...

  4. J360-cloud SpringCloud系列二:服务发现Discovery Service

    2019独角兽企业重金招聘Python工程师标准>>> j360开源博客之 ----------------------------------------------------- ...

  5. 最佳实践系列丨Docker EE 服务发现参考架构(二)

    出品丨Docker公司(ID:docker-cn) 编译丨小东 每周一.三.五晚6点10分 与您不见不散 服务发现对服务进行注册并发布其连接信息,以使其他服务了解如何连接到服务.随着应用向微服务和面向 ...

  6. Consul + fabio 实现自动服务发现、负载均衡 - DockOne.io

    Consul + fabio 实现自动服务发现.负载均衡 - DockOne.io Consul + fabio 实现自动服务发现.负载均衡 - DockOne.io http://dockone.i ...

  7. dubbo系列三、 服务发现RegistryDirectory

    文章目录 dubbo服务发现-RegistryDirectory 1.前言 2.RegistryDirectory结构 3.源码分析 4.总结的流程图 5.结语 6.服务内方法重载了,会有影响吗? d ...

  8. 微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)

    1.什么是落地SOA(面向服务架构)? SOA面向服务架构,是一种架构思想,是跨语言和平台的.SOA宗旨简单明了,根据项目服务完成架构搭建,以服务为基准点完成组件化和模块化.提供服务是项目的基本内容, ...

  9. SpringCloud系列--eureka(三)服务发现DiscoveryClient

    对于注册到Eureka的微服务,可以通过服务发现来获得该服务的信息. 下面将介绍如何使用DiscoveryClient获取注册中心上的实例信息. 1.Controller中注入DiscoveryCli ...

最新文章

  1. Codeforces Round 263(Div. 2)
  2. 深入浅出: Java回调机制(异步)
  3. linux centos7 安装redis
  4. Django从理论到实战(part37)--关于迁移
  5. HTML元素显示与隐藏
  6. EleutherAI:当OpenAI不够开放时,我们该如何选择?
  7. 1012 The Best Rank (25)
  8. Python Pytest装饰器@pytest.mark.parametrize详解
  9. 安全应对MySQL攻击
  10. vvv在线文档导出工具_使用ApiPost工具快速生成在线接口文档
  11. 整理了5个JavaScript怪异行为及其原因
  12. postman导出Collections后再导入时,打开内容为空
  13. 快速掌握 机器学习(Machine Learning) 常用概念术语,常用算法
  14. 从 IPv4 向 IPv6 的迁移
  15. 服务端推送技术 Server-sent Events 快速上手
  16. win10 仿照linux终端,[菜鸟win10系统]类似Windows界面的Linux发行版
  17. 伦敦银持仓分布分析技巧
  18. 万能命令:快捷直达你想要的在线工具
  19. 教你如何查看linux版本
  20. 机械革命 安装Ubuntu16+win10双系统 配置GTX960m显卡

热门文章

  1. 【MongoDB】chunk too big to move的解决方案
  2. Android 6.0 以及HttpClient
  3. 队列学习笔记 顺序队列
  4. hadoop2.610集群配置(包含HA和Hbase )
  5. 关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)
  6. 你应该在开始API开发之前知道的事(下)(翻译)
  7. 前端基础入门第一阶段-Web前端开发基础环境配置
  8. 《jQuery与JavaScript入门经典》——2.6 小结
  9. PHP分页类(较完美)
  10. 51CTO现已开通二级域名~~~~~