微服务架构的应用由若干 service 构成。比如有运行 httpd 的 web 前端,有提供缓存的 memcached ,有存放数据的 mysql ,每一层都是 swarm 的一个service,每个service 运行了若干容器,在这样的架构中,service 之间必然是要通信的。
 
服务发现
 
一种实现方法是将所有的service都publish出去,然后通过 routing mesh 访问,但明显的缺点是把 memcached和mysql 也暴露到外网,增加了安全隐患。
 
如果不publish,那么swarm就要提供一种机制,能够:
 
    1、让service通过简单的方法访问到其他service
    2、当service副本的IP发生变化时,不会影响其他service的访问
    3、当service的副本数量发生变化是,不会影响其他service的访问
 
这其实就是服务发现(service discovery)。Docker Swarm 原生就支持了这项功能,通过服务发现,service的使用者不需要知道service运行在哪里,IP是多少,有多少副本,就能与service通信。
 
root@host03:~# docker network create --driver overlay myapp_net    #    要使用服务发现功能,service必须同属于一个overlay网络,而且默认的ingress 网络不支持服务发现
n8yf7inqz24q4dr5oxrqktoag
 
root@host03:~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
c31c660ab056        bridge              bridge              local
b5ff39d0ca1f        docker_gwbridge     bridge              local
e9f624212e28        host                host                local
sngp88bsqode        ingress             overlay             swarm
n8yf7inqz24q        myapp_net           overlay             swarm
39b5e5857095        none                null                local
 
root@host03:~# docker service create --name my_web --replicas 3 --network myapp_net httpd    #    创建一个3副本的web类 service
g8abjt515s0uhduj9lxrjmf54
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged
 
root@host03:~# docker service create --name util --network myapp_net busybox  sleep 100000    #    创建一个工具类service
extbn3ije96vebjx77ud5w0k7
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
 
root@host03:~# docker service ps util    #    查看该service运行在哪个 node 上
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
8o8cz8cvawi5        util.1              busybox:latest      host01              Running             Running 34 seconds ago                       
 
root@host01:~# docker network ls    #    查看新建的 myapp_net 已经自动推送到其他的 node上
NETWORK ID          NAME                DRIVER              SCOPE
d4b0862f06c8        bridge              bridge              local
d883d53943b2        docker_gwbridge     bridge              local
358643b57976        host                host                local
sngp88bsqode        ingress             overlay             swarm
n8yf7inqz24q        myapp_net           overlay             swarm
f5d2888b2321        none                null                local
 
root@host01:~# docker exec util.1.8o8cz8cvawi5jsgv3xkdypqvn ping -c 3 my_web    #    在工具类service中ping之前创建的web service,是可以ping通的,但解析到的IP并不是副本的IP地址,而是该service的VIP,该VIP具有负载均衡的功能
PING my_web (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.133 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.100 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.091 ms
--- my_web ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.091/0.108/0.133 ms
 
root@host01:~# docker exec util.1.8o8cz8cvawi5jsgv3xkdypqvn nslookup tasks.my_web    #    通过nslookup 命令查看各副本的IP地址
Server:        127.0.0.11
Address:    127.0.0.11:53
Non-authoritative answer:
Name:    tasks.my_web
Address: 10.0.0.5
Name:    tasks.my_web
Address: 10.0.0.4
Name:    tasks.my_web
Address: 10.0.0.3
 
 

101、Service 之间如何通信?(Swarm08)的更多相关文章

  1. Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)

    微服务架构的应用由若干 service 组成.比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 ...

  2. activity 与 service 之间的通信

    activity和service通信:通过binder 举个我实际项目中的例子:在service中下载更新应用 首先是下载更新apk的service: public class UpdateVersi ...

  3. Aactivity和Service之间的通信

    一.在activity中定义三个按钮 一个开启服务  一个关闭服务,还有一个是向服务发送广播 当创建出Serevice时先执行Service的onCreate()创建服务后只执行一次 以后每次点击开启 ...

  4. Android中Activity、Service和线程之间的通信

    Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

  5. activity与service之间的通信方式

    Activity之间的通信 1.activity与activity的通信可以通过Intent来封装数据,startActivityForResult()来实现,当跳转的activity调用finish ...

  6. android中四大组件之间相互通信

    好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...

  7. 10月9日Android学习笔记:活动与服务之间的通信

    最近在照着<第一行代码>这本书来学安卓,顺便记下笔记.主要的内容是Android中服务的第二种启动方式,通过活动绑定服务来启动服务,实现活动与服务之间的通信. 一. 首先创建一个服务类 p ...

  8. ionic2+Angular 依赖注入之Subject ——使用Subject来实现组件之间的通信

    在Angular+ionic2 开发过程中,我们不难发现,页面之间跳转之后返回时是不会刷新数据的. 场景一:当前页面需要登录之后才能获取数据--去登录,登录成功之后返回--页面需要手动刷新才能获取到数 ...

  9. c# IPC实现本机进程之间的通信

    IPC可以实现本地进程之间通信.这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通 ...

随机推荐

  1. vue-cli 3x 的使用

    当我们使用 npm 下载过文件之后,里面就会有缓存 我们要使用 npm cache clean --force 来清除缓存 创建项目:vue create 文件名 然后:cd 文件名 启动程序:npm ...

  2. Spring Boot Cli下载安装

    本地下载地址: spring-boot-cli-2.1.8.RELEASE-bin.zip  : https://pan.baidu.com/s/1GMyxj1PecsM4BG_hzoteVQ spr ...

  3. 打开App显示文件已损坏,打不开,您应该将它移到废纸篓,怎么办?

    1. 首先确保系统安全设置已经改为任何来源 sudo spctl --master-disable 2. 打开任何来源后,到应用程序目录中尝试运行软件,如果仍提示损坏,请在应用图标上,鼠标右键,在弹出 ...

  4. Flask中session实现原理

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  5. 堆的ptmalloc机制

    ptmalloc下堆的分配和回收 ptmalloc内存分配 1) 获取分配区的锁,为了防止多个线程同时访问同一个分配区,在进行分配之前需要取得分配区域的锁.线程先查看线程私有实例中是否已经存在一个分配 ...

  6. Ubuntu16.04中安装VirtualBox及简单配置

    sudo apt-get -y install virtualbox 注:将该图表拖到桌面上即可 往下的过程都不变..... 将左边的菜单栏移动到下面 打开一个终端输入:gsettings set c ...

  7. Redis 高级应用

    Redis SAVE 命令用于创建当前数据库的备份 该命令将在 redis 安装目录中创建dump.rdb文件. 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并 ...

  8. 【JVM学习笔记】打破双亲委托机制的例子

    Tomcat也有自己的类加载器,比如Servlet,这些类加载器就改变了双亲委托模型的默认机制 (该主题有待深入)

  9. .NET制作滚动条

    今天,在工作的时候,刚好做到了滚动条,对这点不是很懂,所以,研究了一下,记录在这里,与大家分享. 对于前台页面,我们就只需要设置数据表的样式:style="overflow: auto; 即 ...

  10. 如何在VUE中使用leaflet地图框架

    前言:在leaflet的官方文档只有静态的HTML演示并没有结合VUE的demo  虽然也有一些封装好的leaflet库例如Vue-Leaflet,但是总感觉用起来不是那么顺手,有些业务操作还是得用l ...