服务发现,就是通过什么办法可以找到需要调用的服务的地址(ip和端口),因为只有拿到服务的地址,我们才可以连接服务,发送接口调用请求。
上一个章节,我们没说明两个服务直接是如何找到对方的,只是使用服务名,就可以调用远程服务api,本章将介绍Go Micro如何通过服务名找到服务的地址。
Go Micro的Register模块负责服务发现,Go Micro 框架以插件的形式内置了几种常用的服务发现组件,下面分别介绍三种常用的服务发现组件:mDNS、Consul、Etcd
Consul和Etcd都是基于注册中心实现服务发现,大致原理如下图:
- 服务启动的时候,主动向注册中间注册自己的服务信息(服务名、Ip、port)
- 客户端,通过服务名去注册中心,查询服务信息,拿到对应的ip和port,一个服务名可能查询到多个服务地址,默认go micro框架的Selector模块,通过随机算法从多个服务地址中选择一个进行通信(这样也就实现了负载均衡处理),然后向服务发起接口调用。
提示:如果对服务发现还是不太了解,可以看下这篇博客:微服务之服务发现。
1.基于mDNS服务发现
上一章的例子,就是通过mDNS实现服务发现,这也是Go Micro框架默认的机制,不需要任何配置。
mDNS(多播DNS)是一种局域网内使用的DNS机制,他的大致原理如下:当有新的节点加入局域网的时候,如果打开了mDNS,就主动向局域网其他所有节点广播,自己提供的服务(域名是什么、ip地址是什么、端口号是什么), 这样我们任何一个节点都知道局域网提供了什么服务。
例如:
Go Micro微服务A启动的时候,通过mDNS协议,向局域网的所有节点,广播自己的服务名、Ip和端口号。 当另外一个微服务B,需要调用微服务A的,通过微服务A的服务名,去向mDNS查询ip地址和端口号,如果找不到,就向局域网广播询问,谁有微服务A的地址信息,通过这样的机制我们就可以找到同一个局域网内的服务信息。
提示:基于mDNS的服务发现,不需要额外的中间件和配置,适合个人开发做实验,团队多人合作开发,往往有部分微服务是在云服务器上面,通过mDNS无法查询这些服务的信息,生产环境也会选择其他服务发现中间件。
2.基于Consul的服务发现
Consul是解决服务发现、配置中心的分布式中间件,适合生产环境使用。
如果不熟悉Consul,可以点击这里了解下:Consul教程
当安装好Consul后,我们可以通过环境变量设置Go Micro的服务发现中间件配置。
例如:
MICRO_REGISTRY=consul \
MICRO_REGISTRY_ADDRESS=127.0.0.1:8500 \
go run orderservice.go
参数说明:
- MICRO_REGISTRY - 注册中心类型,这里设置为consul
- MICRO_REGISTRY_ADDRESS - 注册中心地址, IP + PORT的形式
运行后,你会发现增加一条类似的日志,说明服务信息已经注册到Consul了。
2019/10/29 22:08:13 Registry [consul] Registering node: go.micro.api.orderservice-da1e90a0-975b-4b55-81bf-7f1d846f559e
注意:使用consul后,所有微服务启动的时候都需要配置使用同一个consul,包括我们使用micro call 命令和启动其他mico组件,都需要配置register环境变量,否则会出现找不到服务的错误。
3.基于Etcd的服务发现
Etcd是强一致性的、分布式键值存储引擎,类似zookeeper。
当你安装好Etcd后,使用Etcd作为注册中心,让go micro微服务基于Etcd实现服务发现,配置方式跟consul类似。
例如:
MICRO_REGISTRY= etcd \
MICRO_REGISTRY_ADDRESS=127.0.0.1:2379 \
go run orderservice.go
参数说明:
- MICRO_REGISTRY - 注册中心类型,这里设置为
etcd
- MICRO_REGISTRY_ADDRESS - 注册中心地址, IP + PORT的形式