为什么80%的码农都做不了架构师?>>>   

在探索kubernetes的应用时,调研了几个gateway,发现fabio支持发现服务,自动生成路由,结合consul,registrator, 可以很容易的部署一套服务,比较轻量,很容易玩起来。

结构大致为:

Start Consul

安装 consul, 如果检测到多个 private ip, 会报错,可以用 -advertise 指定一个ip.

// config.json , 指定 DNS port { "recursors" : [ "8.8.8.8" ], "ports" : {     "dns" : 53 } }  sudo docker run -d --name=consul --net=host -v $PWD/config.json:/config/config.json gliderlabs/consul-server -bootstrap -advertise=172.28.128.3  curl 172.28.128.3:8500/v1/catalog/services 

Start Registrator

启动 registrator, 因为需要调用docker api, 所以需要把docker.sock 映射到容器内部,如果你使用了tcp, 那么需要设置对应的url。

如果你希望上报容器内部ip:port, 那么需要在启动参数中加入 -internal=true, 这样注册的 Service, 都是容器内部的ip, 而port对于同一个service而言,一般是固定的,例如 一个hello服务的两个实例分别为 10.10.1.12:9090, 10.10.1.13:9090. 这样的话,就需要配置一个容器跨host的网络方案,例如 flannel, 等。 可以参考上一篇 Flannel with Docker

为了简便测试,这里就不配置flannel了。-ip是指定注册service时候使用的ip,建议要指定,选取当前机器的内网 private ip即可。我这里是 172.28.128.3.

sudo docker run -d --name=registrator --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest -ip=172.28.128.3 consul://172.28.128.3:8500 

Start service

启动服务,这里需要注意的是这些环境变量,作用是 override Registrator的默认值,见名知意,在 registrator 文档中有详细介绍。例如 SERVICE_9090_NAME 就是指 端口为 9090 的service 的 name。

需要注意的是 tags 这个字段,urlprefix-/foo,hello, 这里 urlprefix- 是 gateway 的一种配置,意思为 把访问 /foo 为前缀的请求转发到当前应用来。他能够匹配到例如 /foo/barfootest, 等。如果你想加上域名的限制,可以这样 urlprefix-mysite.com/foo。 后面还有一个 hello, 作用是给这个service打一个标记,可以用作查询用。

sudo docker run -d -P -e SERVICE_9090_CHECK_HTTP=/foo/healthcheck -e SERVICE_9090_NAME=hello -e SERVICE_CHECK_INTERVAL=10s -e SERVICE_CHECK_TIMEOUT=5s -e SERVICE_TAGS=urlprefix-/foo,hello silentred/alpine-hello:v2 curl 172.28.128.3:8500/v1/catalog/services //现在应该能看到刚启动的hello服务了 {"consul":[],"hello":["urlprefix-mysite.com/foo","hello","urlprefix-/foo"]}  

测试 DNS

sudo yum install bind-utils dig @172.28.128.3 hello.service.consul SRV

可以设置 /etc/resolv.conf

nameserver 172.28.128.3 search service.consul

这样无论在容器内部,还是外部都可以直接解析 sevice 名, 例如:

[vagrant@localhost ~]$ ping hello PING hello.service.consul (172.28.128.3) 56(84) bytes of data. 64 bytes from localhost.localdomain.node.dc1.consul (172.28.128.3): icmp_seq=1 ttl=64 time=0.016 ms [vagrant@localhost ~]$ sudo docker exec -it fdde1b8247b8 bash bash-4.4# ping hello PING hello (172.28.128.6): 56 data bytes 64 bytes from 172.28.128.6: seq=0 ttl=63 time=0.361 ms

Start Gateway

前端Gateway 根据 consul中注册的 service,生成对应的路由规则,把流量分发到各个节点。 这个项目还有一个 ui 管理 route信息,端口为 9998。

创建一个配置文件 fabio.properties

registry.consul.addr = 172.28.128.3:8500

在当前目录运行

docker run -d -p 9999:9999 -p 9998:9998 -v $PWD/fabio.properties:/etc/fabio/fabio.properties magiconair/fabio

测试gateway:

curl 172.28.128.3:9999/foo/bar curl 172.28.128.3:9999/foo/bar -H "Host: mysite.com"
 

Health Check

sudo ifdown eth1 curl http://localhost:8500/v1/health/state/critical [ {     "Node":"localhost.localdomain",     "CheckID":"service:afa2769cd049:loving_shannon:9090",     "Name":"Service 'hello' check",     "Status":"critical",     "Notes":"",     "Output":"Get http://172.28.128.6:32768/foo/healthcheck: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)",     "ServiceID":"afa2769cd049:loving_shannon:9090",     "ServiceName":"hello",     "CreateIndex":379,     "ModifyIndex":457 } ] sudo ifup eth1  
}在启动 consul的时候,我们使用了-ui 参数,我们可以在 172.28.128.3:8500/ui 访问到consul的web ui管理界面,看到各个服务的状态.

对比

注册容器外IP:
每个注册的service的port都是变化的,并且因为映射内部port到了host,外部可以随意访问,私密性较弱。注册容器内IP:
每个注册的service的port都是固定的,只能从容器内部访问。如果用 flannel,可能有一些性能损失。

DNS服务发现

查了一下如何利用DNS SRV类型来发现服务。本来以为可以用类似 Dial("hello", SRV) 的魔法 (我们都是膜法师,+1s), 查了一些资料貌似没有这么方便。看了下golang的net包,发现了两个方法 LookupSRV, LookupHost, 于是测试了一下,看下结果,大家知道该怎么用了吧,嘿嘿。
golang cname, addrs, err := net.LookupSRV("", "", "hello.service.consul") fmt.Printf("%s, %#v, %s \n", cname, addrs, err) for _, srv := range addrs { fmt.Printf("%#v \n", *srv) } newAddrs, err := net.LookupHost("hello.service.consul") fmt.Printf("%#v, %s \n", newAddrs, err)
 
//output [vagrant@bogon dns]$ go run mx.go hello.service.consul., []*net.SRV{(*net.SRV)(0xc420010980), (*net.SRV)(0xc4200109a0)}, %!s() net.SRV{Target:"bogon.node.dc1.consul.", Port:0x8003, Priority:0x1, Weight:0x1} net.SRV{Target:"bogon.node.dc1.consul.", Port:0x8000, Priority:0x1, Weight:0x1} []string{"172.28.128.3", "172.28.128.4"}, %!s()  
来源:http://www.youruncloud.com/docker/1_80.html

转载于:https://my.oschina.net/cloudsoar/blog/801972

基于容器的后端服务架构相关推荐

  1. 学霸君基于Docker的微服务架构设计

    以下内容根据演讲PPT以及现场分享整理而成. 今天主要分享的是我们在实践微服务架构或者容器架构过程中踩过的坑,对于致力在容器技术方面进行探索的同学会有很大帮助.本次将站在整体的角度,分享如何去运维整个 ...

  2. Kubernetes——基于容器技术的分布式架构领先方案,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩...

    1.Kubernetes介绍 1.1 简介 Kubernetes是什么? 首先,它是一个全新的基于容器技术的分布式架构领先方案. 其次,它是一个开放的开发平台. 最后,它是一个完备的分布式系统支撑平台 ...

  3. 申通的云原生实践之路:如何实现应用基于容器的微服务改造?

    随着云计算的普及与云原生的广泛应用,越来越多的从业者.决策者清晰地认识到**「云原生化将成为 企业技术创新的关键要素,也是完成企业数字化转型的最短路径」**. 因此,具有前瞻思维的互联网企业从应用诞生 ...

  4. 基于 Docker 的微服务架构

    基于 Docker 的微服务架构-分布式企业级实践 前言 Microservice 和 Docker 服务发现模式 客户端发现模式 Netflix-Eureka 服务端发现模式 Consul Etcd ...

  5. 基于SpringCloud的微服务架构演变史?

    系统架构演变概述 在公司业务初创时期,面对的主要问题是如何将一个想法变成实际的软件实现,在这个时候整个软件系统的架构并没有搞得那么复杂,为了快速迭代,整个软件系统就是由"App+后台服务&q ...

  6. 基于CSE的微服务架构实践-轻量级架构技术选型

    [摘要] 本文在前一篇"基于CSE的微服务架构实践-基础架构"基础上,介绍了使用CSE进行轻量级架构的技术选型参考.文末提供了基于JWT的微服务认证鉴权方案. 轻量级架构模式下,可 ...

  7. 使用 Kubernetes 和 Istio 进行基于容器的全面服务监控

    使用 Kubernetes 和 Istio 进行基于容器的全面服务监控 原文链接:https://www.circonus.com/2018/06/comprehensive-container-ba ...

  8. (祈福九寨)网易蜂巢基于容器和微服务加快迭代速度实践

    题图:Afterquake by Angelo Giordano@pixabay 编辑:冷锋 文章转自网易云(微信公众号Netease_cloud) 刘超 网易云首席解决方案架构师,代码级略懂Open ...

  9. 日10亿级处理,基于云的微服务架构

    德比软件:基于云的微服务架构 作者:朱攀,德比软件架构师,同济大学研究生,2007 年 2 月加入德比软件(DerbySoft),拥有 10 年以上的软件架构和开发经验.目前主要负责公司数据对接平台的 ...

最新文章

  1. 2019年上半年收集到的人工智能深度学习方向干货文章
  2. 老大难的 Java ClassLoader,到了该彻底理解它的时候了
  3. Python 神工具包!翻译、文字识别、语音转文字统统搞定
  4. 【干货】数据分析规范总结!
  5. 413 Request Entity Too Large
  6. Oracle-Decode()函数和CASE语句的不同
  7. android 刷新标题栏,Android 自定义标题栏的实例详解
  8. 力扣59.螺旋矩阵II(JavaScript)
  9. SQL数据库引擎服务SQL Server启动参数概述
  10. 判别性的低秩字典学习代码matlab,基于分类的判别性字典学习的稀疏编码算法研究...
  11. Linux下QT4.7.1静态编译过程
  12. Elasticsearch: 配置文件详解
  13. html 复选框全选、反选操作
  14. pxhere - 世界知名的免费摄影图库,可以免费商用
  15. android 环信8.0通知栏,环信客服机器人v8.0.3发布:教你快速构建知识库,精准识别访客意图...
  16. vscode找不到头文件的解决办法
  17. 元件封装知识(转载)
  18. SAP 固定资产减值准备
  19. Coding时间加起来8万小时,四位老司机唐赓 武爱敏 大师兄(刘歧)刘连响带你多媒体开发...
  20. CrystalDiskInfo KureiKei(硬盘信息监测工具)官方正式版V8.11.1 | 硬盘信息怎么看

热门文章

  1. 国内外IP黑名单查询网站和邮件相关DNS的查询大全
  2. QT简单实验——计算器
  3. cdh3.6.2集成zeppelin0.10.1及简单使用
  4. tensorflow频域操作及梯度求取
  5. 大学英语综合教程二 Unit 3 课文内容英译中 中英翻译
  6. kettle连接数据库报错:Error connecting to database: (using class org.gjt.mm.mysql.Driver) Could not create
  7. 【HSI】高光谱的数据集分类深度学习实战及代码理解
  8. 用思维导图和孩子们一起了解“什么是春节”
  9. mysql双主架构沈剑_58 沈剑 - 数据库架构师做什么-58同城数据库架构设计思路
  10. 独立站导航栏装修指南