什么是服务发现

微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:

图中,客户端的一个接口,需要调用服务A-N。客户端必须要知道所有服务的网络位置的,以往的做法是配置是配置文件中,或者有些配置在数据库中。这里就带出几个问题:

  • 需要配置N个服务的网络位置,加大配置的复杂性
  • 服务的网络位置变化,都需要改变每个调用者的配置
  • 集群的情况下,难以做负载(反向代理的方式除外)

总结起来一句话:服务多了,配置很麻烦,问题多多

既然有这些问题,那么服务发现就是解决这些问题的。话说,怎么解决呢?我们再看一张图

与之前一张不同的是,加了个服务发现模块。图比较简单,这边文字描述下。服务A-N把当前自己的网络位置注册到服务发现模块(这里注册的意思就是告诉),服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式是不是就可以解决上面的问题了呢?客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!

这个过程大体是这样,当然服务发现模块没这么简单。里面包含的东西还很多。这样表述只是方便理解。

图中的服务发现模块基本上就是微服务架构中服务发现的作用了。

consul 简介

做服务发现的框架常用的有

  • zookeeper
  • eureka
  • etcd
  • consul

这里就不比较哪个好哪个差了,需要的童鞋自己谷歌百度。

那么consul是啥?consul就是提供服务发现的工具。然后下面是简单的介绍:

consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:

  • service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
  • multi-datacenter:无需复杂的配置,即可支持任意数量的区域。

我们这里会介绍服务发现,健康检查,还有一些基本KV存储。多数据中心有机会另一篇文章再说。

总结:只要知道它是解决我上一部分提出的问题就行,其它的东西慢慢理解

consul的几个概念

上图是我从consul官方文档抠出来的。

我们只看数据中心1,可以看出consul的集群是由N个SERVER,加上M个CLIENT组成的。而不管是SERVER还是CLIENT,都是consul的一个节点,所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。除了这两个,还有一些小细节,一一简单介绍。

  • CLIENT

CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。

  • SERVER

SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。

  • SERVER-LEADER

中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。

  • 其它信息

其它信息包括它们之间的通信方式,还有一些协议信息,算法。它们是用于保证节点之间的数据同步,实时性要求等等一系列集群问题的解决。这些有兴趣的自己看看官方文档。

consul 基本使用

自己就一台机子,所以这里就演示下docker下部署使用consul。容器与宿主机的端口映射忽略,正常生产环境每个宿主机一个consul,端口需要映射到宿主机

部署

拉取镜像

    docker search consul

咱们用官方的镜像玩玩

    docker pull consul

不指定tag就拉取last,当前版本是0.8.0

启动consul

  • 启动节点1(server模式)

docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node1 consul agent -server -bind=172.17.0.2  -bootstrap-expect=3 -node=node1

-node:节点的名称 
-bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址 
-server:这个就是表示这个节点是个SERVER 
-bootstrap-expect:这个就是表示期望提供的SERVER节点数目,数目一达到,它就会被激活,然后就是LEADER了

  • 启动节点2-3(server模式)

docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node2 consul agent -server -bind=172.17.0.3  -join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')  -node=node2docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node3 consul agent -server -bind=172.17.0.4  -join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')  -node=node3 -client=172.17.0.4

-join:这个表示启动的时候,要加入到哪个集群内,这里就是说要加入到节点1的集群 
-node-id:这个貌似版本8才加入的,这里用这个来指定唯一的节点ID,可以查看这个issue 
-client:这个表示注册或者查询等一系列客户端对它操作的IP,如果不指定这个IP,默认是127.0.0.1。

  • 启动节点4(client模式)

docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node4 consul agent -bind=172.17.0.5 -retry-join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')  -node=node4

除了没有-server,其它都是一样的,没有这个就说明这个节点是CLIENT

  • 查看下集群的状态

docker exec -t node1 consul members


4个节点都列出来了。Status表示它们的状态,都是alive。Type表示它们的类型,三个SERVER一个CLIENT,和我们之前启动的一样。DC表示数据中心,都是dc1。

  • 节点异常consul的处理

  • LEADER 挂了 
    leader挂了,consul会重新选取出新的leader,只要超过一半的SERVER还活着,集群是可以正常工作的。node1是leader,所以把这个容器停了。

docker stop node1 
看看其他节点的日志(node2): 

日志打印,心跳检查node1的ip超时,接着开始选举。node2被选举为新的leader。我们查看下现在的leader:

curl http://172.17.0.4:8500/v1/status/leader

返回的内容:

  "172.17.0.3:8300"

172.17.0.3 就是 node2节点的IP

使用

部署完了,那么可以看看怎么用这个东东了。

注册个服务

使用HTTP API 注册个服务,使用[接口API](https://www.consul.io/api/agent/service.html API)调用

调用 http://consul:8500/v1/agent/service/register PUT 注册一个服务。request body:

{"ID": "userServiceId", //服务id"Name": "userService", //服务名"Tags": [              //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务"primary","v1"],"Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP"Port": 8000,          //服务注册consul的PORT,发现的就是这个PORT"EnableTagOverride": false,"Check": {             //健康检查部分"DeregisterCriticalServiceAfter": "90m","HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的"Interval": "10s"   //健康检查间隔时间,每隔10s,调用一次上面的URL}
}

使用curl调用

curl http://172.17.0.4:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{"ID": "userServiceId",  "Name": "userService","Tags": ["primary","v1"],"Address": "127.0.0.1","Port": 8000,"EnableTagOverride": false,"Check": {"DeregisterCriticalServiceAfter": "90m","HTTP": "http://www.baidu.com","Interval": "10s"}
}'

OK,注册了一个服务

发现个服务

刚刚注册了名为userService的服务,我们现在发现(查询)下这个服务

curl http://172.17.0.4:8500/v1/catalog/service/userService

返回的响应:

[{"Address": "172.17.0.4","CreateIndex": 880,"ID": "e6e9a8cb-c47e-4be9-b13e-a24a1582e825","ModifyIndex": 880,"Node": "node3","NodeMeta": {},"ServiceAddress": "127.0.0.1","ServiceEnableTagOverride": false,"ServiceID": "userServiceId","ServiceName": "userService","ServicePort": 8000,"ServiceTags": ["primary","v1"],"TaggedAddresses": {"lan": "172.17.0.4","wan": "172.17.0.4"}}
]

内容有了吧,这个就是我们刚刚注册的服务的信息,就可以获取到

服务的名称是“userService” 
服务地址是“127.0.0.1” 
服务的端口是“8000”

存储个K/V

设置一个值到user/config/connections 内容为5

docker exec -t node1 consul kv put user/config/connections 5

获取特定的值

docker exec -t node1 consul kv get -detailed user/config/connections

值的内容为5,还有key等相关的值

总结

服务发现以及配置共享的简单样例展示了下,详细的使用还是需要看官方文档,这里只是列举了一些样例,用于理解和简单的使用consul。

相关文档连接

CONSUL:https://www.consul.io/ 
CONSUL HTTP API:https://www.consul.io/api/index.html 
CONSUL CLI:https://www.consul.io/docs/commands/info.html 
CONSUL Health Checks:https://www.consul.io/docs/agent/checks.html

服务发现 注册中心 consul 的介绍、部署和使用相关推荐

  1. 服务发现-注册中心概述

    概述 服务注册与发现是微服务的核心,否则新发布一个服务只能去调用方配置地址,不能接受的事.不管是rpc还是spring cloud这种Http调用,注册中心都不可少.  这是dubbo的基本结构,但 ...

  2. 分布式服务发现与注册中心 Consul 中文入门指南

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 基础概念 什么是注册中心 随着微服务理论发展的成熟,越来越多互联网公司采用微服务架构来支持业务发展.各个微服务之间 ...

  3. python consul配置中心_微服务注册发现配置中心-consul

    Consul详解 近期在微服务业务中用的注册中心,在此简单记录下以备后用. 一 概述 1.1 概念 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.Con ...

  4. 服务注册中心-Consul

    Consul官方文档 ​ 官方文档:https://www.consul.io/docs/intro ​ 中文文档:https://www.springcloud.cc/spring-cloud-co ...

  5. 注册中心Consul

    注册中心Consul 1 Consul介绍 2 安装 3 Consul使用 3.1 Consul集群注册 4 消费 1 Consul介绍 在 Spring Cloud 中,大部分组件都有备选方案,例如 ...

  6. 为什么redis在陌陌上使用的这么广泛?当NoSQL数据库,微服务的注册中心,RPC的调用协议都能用

    前言 说到redis,可能大家的脑海中蹦出的关键词是:NoSQL.KV.高性能.缓存等.但今天的文章从另一个角度--微服务来展开. 这篇文章的起因也是源自一次面试经历,在面试一位来自陌陌的候选人(就是 ...

  7. 微服务:注册中心的作用

    1.为什么需要服务注册中心 微服务时代的服务管理 在微服务时代,我们所有的服务都被劲量拆分成最小的粒度,原先所有的服务都在混在1个server里,现在就被按照功能或者对象拆分成N个服务模块,这样做的好 ...

  8. java 服务注册中心_服务治理的含义和java最流行的微服务框架服务治理注册中心的搭建...

    原标题:服务治理的含义和java最流行的微服务框架服务治理注册中心的搭建 Spring Cloud Eureka基于Netflix Eureka做了二次封装,是Spring Cloud Netflix ...

  9. 服务注册中心consul

    目录 一.consul介绍 二.consul的特性 三.consul部署 1.实验环境 2.主机名为nginx端的配置 3.以下在zwb_docker执行(服务器自动加入cosul集群) 4.在zwb ...

最新文章

  1. 如何修改datagrid行的高度_如何开出一份完美的信用证?
  2. JavaScript 之 call和apply,bind 的模拟实现
  3. Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程
  4. 经典排序算法之直接选择排序
  5. 与mysql的零距离接触_与MySQL的零距离接触
  6. Network 之四 常用 Linux 网络命令及网络调试工具介绍
  7. 图论--拓扑排序--判断是否为DAG图
  8. 写一个简版 asp.net core
  9. Linux 修改系统编码
  10. 关于Centos7启动,ens33无IP问题解决
  11. 【大学物理】磁场的高斯定理
  12. Android开发笔记(八)神奇的shape
  13. Pytorch 手工复现交叉熵损失(Cross Entropy Loss)
  14. 怎么把线稿提取出来_【PS技巧】如何用PS快速提取线稿?
  15. Perl爬虫的简单实现
  16. 常见的5个Java测试框架和工具
  17. C语言实现控制台窗口隐藏
  18. 1.3经济金融基础之金融市场
  19. vue Mixed spaces and tabs no-mixed-spaces-and-tabs
  20. Facebook Marketing: Advanced Advertising Facebook营销:高级广告 Lynda课程中文字幕

热门文章

  1. Jenkins+Ant+TestNG+Testlink自动化构建集成
  2. PIE SDK Geometry的坐标转换
  3. iOS开发 - 获取时间段
  4. 关于R语言的一些编程经验
  5. 局域网中,ip可以访问其他计算机,“网络”中无法发现共享计算机,也无法通过主机名访问。...
  6. Android线程模型和AsyncTask
  7. C++生成随机数:负二项分布/帕斯卡分布(negative binomial distribution)
  8. C#类方法中使用数组参数params关键字的作用
  9. 桌面显示菜单图标下面的字搞起阴影了,怎么弄掉?
  10. agc007B - Construct Sequences(构造)