微服务实施笔记(四)——部署服务发现

上回书搭建了3个待用的服务。用来模拟实际中的服务。接下来就是把这几个服务注册到一个服务管理中心了。

使用consul搭建服务管理中心

在这里选用consul来做服务管理中心。consul是采用golang开发的,CAP中满足CP的一款服务管理系统。选择它的原因就是它足够简单。简单到什么程度呢,一行代码搞定:

sudo docker run -d \-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \--name=node1  -p 8300:8300 -p 8301:8301 -p 8301:8301/udp \-p 8302:8302/udp -p 8302:8302 -p 8400:8400 -p 8500:8500 \-p 53:53/udp -h consul_node1  \consul agent -server -bootstrap \-node=node1 -client 0.0.0.0 -ui

执行后在浏览器中查看 http://localhost:8500/ui

就是如此简单,而且自带ui。好的软件都应如此简单。

Consul 四大特性

  1. Service Discovery (服务发现)
  2. Health Check (健康检查)
  3. Multi Datacenter (多数据中心)
  4. Key/Value Storage(KV键值存储)

下文在介绍如何利用这四大特性。

这下,待发现的服务有了,可以注册服务的管理中心也有了,接下来怎么办呢,怎么把服务注册到服务中心呢。

自动注册服务

服务注册可以分为“自注册” 与 “第三方注册”两种方式。

以下内容引用自http://blog.csdn.net/jek123456/article/details/78083618

1.自注册:服务内部启动客户端,连接注册中心,写入服务信息。

好处:

  • 没有引入第三方,进程数量少,少依赖。

问题:

  • 服务代码对注册中心进行了硬编码,若更换了注册中心,服务代码也必须跟着调整;
  • 注册中心必须与每个服务都保持通信,来做心跳检测。如果服务很多时,对注册中心也是一种额外的开销;

2.第三方注册(本文采用方式):采用协同进程的方式,监听服务进程的变化,将服务信息写入注册中心。

  • 好处:做到了服务与注册中心的解耦,对服务而言,完成了服务的自动化注册;
  • 问题:协同进程本身也要考虑高可用,否则将成为单点故障的风险点;

第三方注册需要一个注册工具,这里使用Registrator

Registrator:一个由Go语言编写的,针对docker使用的,通过检查本机容器进程在线或者停止运行状态,去注册服务的工具。所以我们要做的实验,所有的工具都是在docker上运行的,就是因为registrator是通过检查docker容器的状态来判断服务状态的,这样就和我们的代码实现完全解耦了,对上层透明化,无感知。它有如下特点

  • 通过docker socket直接监听容器event,根据容器启动/停止等event来注册/注销服务
  • 每个容器的每个exposed端口对应不同的服务
  • 支持可插拔的registry backend,默认支持Consul, etcd and SkyDNS
  • 自身也是docker化的,可以容器方式启动
  • 用户可自定义配置,如服务TTL(time-to-live)、服务名称、服务tag等

依然是一行代码搞定:

docker run -d \--name=registrator \--net=host \--volume=/var/run/docker.sock:/tmp/docker.sock \gliderlabs/registrator:latest \consul://localhost:8500

这样启动的服务会有一个问题,就是registrator无法准确取到IP地址,所以最好把本地IP地址指定给registrator。方法就是使用docker-compose。新建一个docker-compose.yml文件,内容如下:

version: '2'
services:registrator1:image: gliderlabs/registratorrestart: alwaysnetwork_mode: "host"name: registratorvolumes:- /var/run/docker.sock:/tmp/docker.sockcommand: "-ip 192.168.1.231 consul://192.168.1.231:8500"

其中最后一行ip后面就是容器运行的宿主机的本地ip地址。然后在docker-compose.yml文件所在目录下执行docker-compose ip -d命令。

运行之后刷新下浏览器看看:

注册成功。但是这里只用到了consul四大特性中的第一个服务发现,它的另一个重要特性健康检查并没有被利用起来。健康检查会按照配置的时间间隔和方式检查服务的健康状态。这样就可以及时的剔除无法对外提供服务的服务了。那么怎么为服务配置健康检查呢?修改服务程序本身当然可以,但是这样的话就违背解耦合的初衷了。引入docker层就是为了解耦合用的,所以可以通过对dockerfile的配置来实现。

怎么用呢,可以使用dockerfile的lable或者环境变量来进行配置。

对于server1服务的docker配置如下(详细可以参考https://gliderlabs.com/registrator/latest/user/services/ 和 https://gliderlabs.com/registrator/latest/user/backends/):

以下是修改后的server1的daockerfile,其中通过环境变量增加了支持consul服务特性的配置项。

FROM microsoft/aspnetcore:2.0
LABEL Name=lizpen/server1 Version=0.0.1
#以下环境变量用来定义consul的服务属性
ENV SERVICE_NAME=server1
ENV SERVICE_ID=server1.001
ENV SERVICE_TAGS=server1
#以下环境变量用来定义consul的服务检查特性
ENV SERVICE_CHECK_HTTP=/api/values
ENV SERVICE_CHECK_INTERVAL=15s
ENV SERVICE_CHECK_TIMEOUT=10s ARG source=.
WORKDIR /app
EXPOSE 3000
COPY $source/bin/Debug/netcoreapp2.0/ .
ENTRYPOINT dotnet server1.dll

先删除掉正在运行的容器,vscode侧边栏中的docker工具提供了这些功能,及其好用:

然后重新build docker镜像,并运行生成好的镜像。然后刷新consul的管理网站可以看到tags和健康检查都上线了。

至此,服务发现在单机运行成功。

接下来就是把这套东西部署到搭建好的虚拟环境中去。

微服务实施笔记(四)——部署服务发现相关推荐

  1. 微服务实施笔记(五)——生产环境部署

    上回书,把服务注册的整个流程在本地单机上完整的走完了,接下来就要把这些东西部署到虚拟的生产环境中去了.整个服务注册的流程都是依靠docker进行打包和部署的.当要发布到生产环境中的时候就涉及到dock ...

  2. 微服务实施笔记(一)

    微服务架构可以说是目前最流行的架构了,我终于也要上这条船了,为什么要上这条船呢,只是为了时尚吗?呵呵,当然不是,上这条船是为了实用的. 先说说现状.现有的系统简单.粗暴.开发是采用c#和dotnet ...

  3. 微服务实施笔记(三)——建立待发现服务

    上回书搭建加了一个由3台服务器和两台开发机组成的模拟开发部署环境.接下来就是要在这个环境中进行模拟的开发和部署了. 如何开啊部署呢,先设想一下实际的应用场景.如下图所示: 浏览器通过域名访问web站点 ...

  4. 微服务实施笔记(二)——搭建实验部署环境

    上回书为微服务的实施定下了基调,接下来就开干吧. 搭建服务器环境 实验环境使用虚拟机搭建.本次实验需要搭建3台服务器,分别命名为server1.server2和server3.在虚拟机中安装ubunt ...

  5. GitChat · 架构 | 为什么微服务实施那么难?如何高效推进微服务架构演进

    GitChat 作者:顾宇 原文:为什么微服务实施那么难?如何高效推进微服务架构演进 关注公众号:GitChat 技术杂谈,一本正经的讲技术 前言 笔者从 2013 年加入 ThoughtWorks ...

  6. 为什么微服务实施那么难?如何高效推进微服务架构演进

    为什么微服务实施那么难?如何高效推进微服务架构演进 前言 笔者从 2013 年加入 ThoughtWorks 至今共 4年时间.在这 4 年的时间里,我分别以 开发人员, DevOps 工程师.Dev ...

  7. Spring Cloud 微服务实战笔记

    Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块:前端展现也不局限于html视图模板的形式,后端 ...

  8. 我们如何衡量一个微服务实施的成功

    4 月在深圳的 GOPS 大会上我分享了"落地微服务的难点和如何高效落地微服务",这是我 2017 年 4 月份开始做的项目总结,后来发表到了自己的博客和" Though ...

  9. 爱奇艺社交泡泡后台微服务实施经验

    微服务不是万能的,也不要为了微服务而微服务.能够支持业务在各个阶段的成长是第一位的,就好比泡泡平台从最开始定位的的社交(聊天.发帖),到目前的明星.兴趣社区和运营推广,再到未来的不同业务的基础平台,每 ...

最新文章

  1. oracle+olh+hive,hadoop+hive+hbase的简单安装 | YallonKing
  2. autosys start_mins
  3. 750px设计稿处理方式
  4. 计算机网络网关作用,默认网关的作用
  5. 软件测试基础知识bbst,摘自James Bach对软件测试新手的建议
  6. 第8步 第2剑客 mybatis plugin 第三剑客 page helper csdn每天最多发多少文章 是20篇,刚刚才试了。2014
  7. (转)如何在maven的pom.xml中添加本地jar包
  8. [20160229]探究oracle的启动过程.txt
  9. Google Chrome 将禁止“退格键”作为后退按钮使用
  10. css中绝对定位和浮动的异同
  11. 为什么关于反趋势交易的书以及文章很少?
  12. 基于Java的汽车租赁系统
  13. 支持M1芯片AE2022已发布,After Effects 2022 for MAC中文安装教程,支持Monterey系统不闪退
  14. H3C室外无线AP(WA4320X)胖瘦切换设置方法
  15. Java简易图书DVD管理系统
  16. 【小睿精选·第四期】谷歌开源更快、更高效的 TensorFlow 运行时 TFRT
  17. 【操作系统】进程同步实验
  18. bandit game
  19. 如何倾听客户之声?你需要的不仅仅是调研
  20. CF 246C Beauty Pageant

热门文章

  1. 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
  2. ArcGIS申请添加天地图服务
  3. access()函数、_access()函数
  4. 一个工科土博士生---最近的状态和想法
  5. Discord教程:Discord账号注册、Discord多账号登录和管理
  6. php解决时间2038问题,PHP实例:关于PHP转换超过2038年日期出错的问题解决
  7. 对象流水线 -- 工厂模式介绍 使用案例及代码演示
  8. 20、Theos越狱调试Wallet
  9. Win7自动登录,免密码
  10. echarts饼图pie中间显示总数