10x系列之Clay.io的服务发现

本文讲的是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

一旦代码被合并,我们可能会选择使用Nerveetcd替代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的服务发现

时间: 2024-08-12 12:53:01

10x系列之Clay.io的服务发现的相关文章

Docker结合Consul实现的服务发现(二)

本文讲的是Docker结合Consul实现的服务发现(二),[编者的话]这是Docker结合Consul实现服务发现系列文章的第二篇,在本文中,作者引入了HAproxy,并且利用Consul的EnvConsul及ConsulTemplate特性实现了对服务发现一些周边功能的支持. 那么,欢迎来到"Docker结合Consul实现的服务发现"系列的第二部分.在这第二篇里,我们将一起来看看你该如何使用Consul相关的系列工具,以使得服务发现其他的周边功能更容易实现. 想要了解本系列的其他

Clay.io的Zoli Kahan开始了“10X”系列博文的撰写

近日,Clay.io的Zoli Kahan开始了"10X"系列博文的撰写.通过这个系列博文,Zoli将分享如何只使用一个很小的团队支撑Clay.io的大规模应用.首期分享则是对Clay.io所使用技术的盘点. 下为译文 云方面 CloudFlare CloudFlare主要负责支撑DNS,并作为一个防护DDoS攻击的缓存代理,同时CloudFlare还负责处理SSL. Amazon EC2 + VPC + NAT服务器 基本上Clay.io的所有服务器都是Amazon EC2类型,其中

Clay.io基于AWS、Docker、HAProxy等的10X架构打造

近日,Clay.io的Zoli Kahan开始了"10X"系列博文的撰写.通过这个系列博文,Zoli将分享如何只使用一个很小的团队支撑Clay.io的大规模应用.首期分享则是对Clay.io所使用技术的盘点. 下为译文 云方面 CloudFlare CloudFlare主要负责支撑DNS,并作为一个防护DDoS攻击的缓存代理,同时CloudFlare还负责处理SSL. Amazon EC2 + VPC + NAT服务器 基本上Clay.io的所有服务器都是Amazon EC2类型,其中

Docker生态系统系列之三:服务发现和分布式配置存储

本文讲的是Docker生态系统系列之三:服务发现和分布式配置存储,[编者的话]本文介绍了服务发现与全局可读配置存储两部分内容,不仅介绍了工作原理和工作方式,也介绍了与之相关的故障检测.重配置和安全问题,最后还介绍了常用的服务发现项目.整篇文章将这个知识点介绍的很全面细致,让读者能够对服务发现和全局可读配置存储有一个全面的认识,值得学习. 介绍 容器给寻找大规模设计与部署应用的需求提供了一个优雅的解决方案.在Docker提供实际容器技术的同时,许多其他的项目也在协助开发在部署环境中所需要的引导和沟

Docker Workflow(四):服务发现与负载均衡

本文讲的是Docker Workflow(四):服务发现与负载均衡,[编者的话]作者讲述了如何将服务发现(Consul.io与Consul-Template)与负载均衡(Nginx)相结合,实现灵活的配置和自动化重载,降低运维难度.当你还执着于给容器分配固定IP这件事上时,也许服务发现才是正道. 这是关于我们如何在IIIEPE的生产环境中使用Docker的系列文章的最后一部分.如果你还没看过第一(译文).第二(译文)和第三(译文)部分,请先前往阅读再继续.本文中,我将讨论如何配置服务发现和负载均

Docker网络和服务发现

本文讲的是Docker网络和服务发现[编者的话] 本文是<Docker网络和服务发现>一书的全文,作者是Michael Hausenblas.本文介绍了Docker世界中的网络和服务发现的工作原理,并提供了一系列解决方案. 前言 当你开始使用Docker构建应用的时候,对于Docker的能力和它带来的机会,你会感到很兴奋.它可以同时在开发环境和生产环境中运行,只需要将一切打包进一个Docker镜像中,然后通过Docker Hub分发镜像,这是很直接了当的.你会发现以下过程很令人满意:你可以快速

Docker结合Consul实现的服务发现(一)

本文讲的是Docker结合Consul实现的服务发现(一),[编者的话]这是Docker结合Consul实现服务发现系列文章的第一篇,在本文中,作者介绍了一个基础的前后端服务架构并讲解了如何通过Consul实现服务的注册和发现. 在过去的一年里,我开始变得热衷于使用Consul来实现一切和服务发现相关的东西.如果你正在做微服务的话,你可能会碰到一个问题,那就是当你创建的服务数量越多时,这些服务之间的通信便越难管理.针对这个问题,Consul给出了一份完美的答卷.它提供了一个易于使用,基于开放标准

在Docker Swarm模式下,Docker应用如何实现服务发现

本文讲的是在Docker Swarm模式下,Docker应用如何实现服务发现[编者的话]无论容器是否存在于集群之中,本文将告诉我们如何可靠地连接到它.  [深圳站|3天烧脑式Kubernetes训练营]培训内容包括:Kubernetes概述和架构.部署和核心机制分析.进阶篇--Kubernetes调工作原理及源码分析等. 当我们第一次考虑在生产环境中使用容器时,常常会面对一个问题:当容器运行在一组服务器集群上时,无论它在哪个服务器上,如何让其他实体(人或应用程序)可靠地连接到它.  一定程度上,

Spring cloud--服务注册和服务发现-Eureka 的使用

一.Spring Cloud Netflix 该项目是Spring Cloud的核心子项目,是对Netflix公司一系列开源产品的封装.它为Spring Boot应用提供了自配置的整合,只需要通过一些简单的注解,就可以快速地在Spring Cloud的应用中使用起来. 它主要提供的模块包括: 服务发现注册(Eureka) 客户端负载均衡(Ribbon) 断路器(Hystrix) 智能路由(Zuul)   开源地址: http://netflix.github.io/ https://github