9、服务注册与发现

微服务的注册和发现是整个微服务架构中至关重要的一个环节,网上也有很多的关于注册发现的文章,因此我们在这里并不会过多的介绍。

同样,提起微服务的注册发现,很多人第一时间就会想到ZooKeeper,ETCD,eureka,Consul等众多组件。由于目前团队使用的Consul,同时最新版本的Consul也添加了对ServiceMesh的支持,这为我们接下来的ServiceMesh研究有参考价值,所以我们gRPC系列的服务注册和发现就以consul为主来进行介绍。

关于consul的原理和实际使用操作等内容,不是我们这次介绍的重点。后面有时间会详细学习一下consul的原理,然后另开一篇文章 Architechture Consul 来进行详细的原理介绍。

Consul安装

为了便于测试,我们这里采用 consul on docker 的形式安装。可以参考 consul 在dockerhub上的文章 Consul and Docker

1、将image pull 下来,采用最新版本就可以

docker pull consul

2、 启动一个consul server

docker run -d --name=dev-consul -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul

这将运行一个完全基于内存的Consul服务器代理,其默认采用桥接网络,并且不在主机上显示任何服务。目前我的测试采用这种方式,但是不建议在生产中使用,因为一旦容器重启,所有的数据都会丢失。

查看一下容器启动的端口,并且对外暴露了8500 端口

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                        NAMES
47b494323296        consul              "docker-entrypoint.s…"   11 seconds ago      Up 9 seconds        8300-8302/tcp, 8500/tcp, 8301-8302/udp, 8600/tcp, 8600/udp, 0.0.0.0:8500->8500/tcp   dev-consul

然后使用 http://host-ip:8500 就可以打开consul的UI界面了.

使用exec 命令可以进入到容器内部。

使用下面的命令查看,consul在容器内绑定的地址。

例如,如果该服务器在内部地址172.17.0.2上运行,则可以通过启动另外两个实例并告诉它们加入第一个节点来运行三节点集群以进行开发。

3、加入另外两个节点

查看集群中的所有成员

4、客户端模式下运行Consul Agent

通过查看一下 docker logs 可以知道,这个agent已经能够进行注册发现的代理了。

此时此刻,我们再去查看一下 consul member 的话,可以看到有3个server一个client.

consul 正常启动后,浏览器访问 ip:8500 就可以看到consul的UI界面了。

consul UI界面

服务注册

接下来,我们正式进入gRPC 服务注册的过程了。

官方给出的例子中,已经进行了详细了案例介绍,我们可以根据官方的示例,写出我们的服务注册和发现 grpc-examples

我们以官方的helloword示例为例,进行注册与发现的改造。

首先在server端实现向consul中注册服务,并添加上health check

服务发现

服务发现,在client端启动时,不再是直接去找server端进行通信,而是根据我们配置的consul的地址,进行服务发现,然后根据获取的服务地址进行与Server端的通信。

Try it

  1. 启动我们的server端服务,然后查看Consul中是否有成功注册

注册服务
  1. 启动我们的客户端就能够输出下面的信息,这就成功发现了服务并发送了消息了,同时server端也能够收到相应的消息。

本示例完整的代码地址

参考

Last updated

Was this helpful?