1.什么是服务发现?
服务发现组件记录了(大规模)分布式系统中所有服务的信息,人们或者其它服务可以据此找到这些服务。
DNS 就是一个简单的例子。
当然,复杂系统的服务发现组件要提供更多的功能,例如,服务元数据存储、健康监控、多种查询和实时更新等。
服务发现是支撑大规模 SOA 的核心服务。
2.服务发的关键特性
高可用的
服务目录
服务查找
服务注册
3.为什么要使用服务发现
假设我们写的代码会调用 WebService、Rest Api、 Thrift API 的服务。在调用过程中,为了完成一次请求,代码需要知道服务实例的网络位置(IP 地址和端口)。
整个过程,对于基于云端的、现代化的微服务应用而言,这却是一大难题。
为了更好的让大家了解服务发现的发展过程,现在举个例子。
3-1【单体应用】
假设你是项目经理或者公司的架构师,正准备组织团队开发一款产品,类似滴滴与Uber的出租车调度软件。
其中系统的核心业务有:客户端、司机端、定位、通知、支付
传统的架构图为:六边形架构(即模块化的单体是应用),也称单体式应用,如下图
单体应用的不足
这种简单方法却有很大的局限性。
一个简单的应用会随着时间推移逐渐变大。在每次的迭代中,开发团队都会面对新“故事”(需求),然后开发许多新代码。
几年后,这个小而简单的应用会变成了一个巨大的怪物。
如果有经验的管理者都知道,一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦。
敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它。
1> 降低开发速度
2> 不利于持续性开发
3> 模块相互冲突
4> 可靠性低
5> 重构困难
3-1【微服务】
随着时间的发展和项目的发展,业务团队越来越庞大,业务越来越复杂,单体应用架构已经无法满足项目需求,所以微服务就腾空出世了。
许多公司,比如Amazon、eBay,通过采用微处理结构模式解决了单体应用出现的问题。
其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。
微服务架构的好处
1.单个服务很容易开发、理解和维护。
2.这种架构使得每个服务都可以有专门开发团队来开发。
3.微服务架构模式是每个微服务独立的部署。
4.微服务架构模式使得每个服务独立扩展。
微服务架构的不足
微服务应用是分布式系统,由此会带来固有的复杂性。
服务地址目录,服务健康度,部署困难,服务依赖问题,数据库分区问题。
如何解决微服务出现的这些问题呢?服务发现框架在这时就闪亮登场了。
4.常见的服务发现框架有哪些
常见服务发现框架 Consul、 ZooKeeper以及Etcd
ZooKeeper是这种类型的项目中历史最悠久的之一,它起源于Hadoop。它非常成熟、可靠,被许多大公司(YouTube、eBay、雅虎等)使用。
etcd是一个采用HTTP协议的健/值对存储系统,它是一个分布式和功能层次配置系统,可用于构建服务发现系统。其很容易部署、安装和使用,提供了可靠的数据持久化特性。它是安全的并且文档也十分齐全。
Zookeeper |
etcd |
Consul |
|
产生时间 |
长 |
短 |
短 |
原生语言 |
JAVA |
Go |
Go |
算法 |
Paxos |
Raft |
Raft |
多数据中心 |
不支持 |
不支持 |
支持 |
健康检查 |
支持 |
不支持 |
支持 |
web管理界面 |
支持 |
不支持 |
支持 |
http协议 |
较为复杂 |
支持 |
支持 |
DNS协议 |
较为复杂 |
不支持 |
支持 |
4.Consul服务发现框架介绍
Consul是强一致性的数据存储,使用gossip形成动态集群。它提供分级键/值存储方式,不仅可以存储数据,而且可以用于注册器件事各种任务,从发送数据改变通知到运行健康检查和自定义命令,具体如何取决于它们的输出。下面两张图是Consul的原理图
4.Consul配置入门及健康监测
4-1 配置拓扑图
4-2 Consul 集群配置
服务端配置
N1节点
consul agent -server -bootstrap-expect 2 -data-dir ./tmp/consul -node=n1 -bind=192.168.109.241 -ui-dir ./dist -dc=dc1
N2节点
consul agent -server -bootstrap-expect 2 -data-dir ./tmp/consul -node=n2 -bind=192.168.109.203 -ui-dir ./dist -dc=dc1
客户端配置
C1节点
consul agent -data-dir ./tmp/consul -ui-dir ./dist -bind=192.168.109.204 -dc=dc1
4-3 Consul 服务注册及健康检验
客户端配置
consul agent -data-dir ./tmp/consul -ui-dir ./dist -bind=192.168.109.204 -dc=dc1 -config-file=./conf
查看集群命令
consul info 查看当前consul 信息,里面可以找到state属性
consul members 查看consul成员
健康监测
监测Service1.svc服务是否正常
{ "log_level": "TRACE", "encrypt": "7TnJPB4lKtjEcCWWjN6jSA==", "service": { "name": "web3", "tags": ["master"], "address": "127.0.0.1", "port": 80, "checks": [ { "http": "http://127.0.0.1:1111/Service1.svc", "interval": "10s" } ] } }
5 C#调用Consul源码
https://github.com/PlayFab/consuldotnet
参考资料
http://consul.la/start
http://www.alauda.cn/2016/07/20/microservices-service-discovery/