(四)go-kit服务注册与发现

前言

为什么需要服务注册与发现?
在微服务架构下,原单体服务被拆分为多个服务独立部署,维护数量过多的服务地址,运维人员无法高效工作。所以,在微服务架构中引入了服务注册中心,用于接受和维护各个服务地址的地址信息。客户端或者网关可以通过注册中心查询目标服务地址,动态实现服务访问,并且在此基础上实现服务负载均衡。
本文代码地址:gtihub地址

1. 启动consul镜像

本文基于consul进行服务注册,先基于docker启动一个consul,在docker目录下新建docker-compose-consul.yml

version: '2'

services:
  consul:
    image: progrium/consul:latest
    ports:
      - 8400:8400
      - 8500:8500
      - 8600:53/udp
    hostname: consulserver
    command: -server -bootstrap -ui-dir /ui

2. 启动docker

在终端切换至项目目录,执行以下命令:

sudo docker-compose -f docker/docker-compose-consul.yml up

3. 浏览器访问

通过浏览器访问http://localhost:8500,确认consul是否启动成功

4. 服务注册

  • 从main.go里面看得出来55行创建了注册对象,这里面提供了一个/health的接口用于供consul对服务接口进行健康检查,所以要在go kit实现getUserName接口一样去实现health的接口
  • 然后在60行和73行分别执行了当前服务的register和unregister,在接口启动前注册服务,接口关闭或者异常退出的时候注销服务
  • 然后在/cell-register/register目录下运行go run main.go -consulHost localhost -consulPort 8500 -serviceHost 192.168.192.145 -servicePort 8000,就将我们的服务注册到上一步启动的consul里面了,可以通过浏览器页面看到userservice已经注册了,并且服务端也打出了consul调用服务端health check的日志

5. 服务发现

  • 通过目录对比可以发现,discover和register的不同就是用factory.go替代了service.go,service.go里面就是针对user接口创建factory
  • endpoint.go里面的MakeDiscoverEndpoint()方法通过onsul.Client创建服务发现Endpoint,go-kit 的kit/sd/Endpointer提供了一套服务发现机制,们需要通过Endpointer来实现服务发现功能。在微服务模式下,同一个服务可能存在多个实例,所以需要通过负载均衡机制完成实例选择,这里使用go-kit工具集中的kit/sd/lb组件(该组件实现RoundRibbon,并具备Retry功能)
  • transport.go里面的MakeHttpHandler()方法还是和以前一样,提供路由转发和转码request和response
  • 启动discover:
然后在/cell-register/discover目录下运行`go run main.go -consulHost localhost -consulPort 8500`,这个服务就成功调用了register注册的user服务的getUserName接口了,并且通过9001端口暴露出去成为一个新的接口,可以访问localhost:9001/user/1获取结果

你可能感兴趣的:(go-kit微服务成渣之路,go-kit,服务注册与发现)