前言 链接到标题

近期学习 go-kit 的官方示例时,发现并未有对接 eureka 的参考代码,而我司目前的微服务架构是基于 spring cloud ,服务注册中心用的是 eureka ,因此,便试着改造一下官方的例子,也顺便验证一下 go-kit 框架的服务注册与发现功能。以下为基本操作过程。

操作过程 链接到标题

  1. 启动 eureka server ,单节点

为了简单,本人使用了 docker 部署方式,命令如下:

docker run -it --rm -p 8761:8761 --name eureka springcloud/eureka

启动成功后,通过浏览器访问 http://127.0.0.1:8761 可以打开 eureka 控制台主页。

  1. 修改官方示例代码

修改代码上传于此位置,主要修改说明:

服务提供者: stringsvc3 和 addsvc 增加向 eureka server 进行服务注册。 服务消费者: apigateway 增加从 eureka server 获取 stringsvc 和 addsvc 的实例列表。

  1. 启动服务提供者
./addsvc -registry.type eureka -eureka.addr 127.0.0.1:8761
./stringsvc3 -registry.type eureka -eureka.addr 127.0.0.1:8761

启动成功后,会周期打印出与 eureka 的心跳日志,类似如下。

2019/12/29 10:03:21 Getting instance with url http://127.0.0.1:8761/eureka/apps/addsvc/192.168.11.5:8082
2019/12/29 10:03:21 Got eureka response from url=http://127.0.0.1:8761/eureka/apps/addsvc/192.168.11.5:8082
ts=2019-12-29T02:03:21.63128Z caller=addsvc.go:277 transport=gRPC addr=:8082
ts=2019-12-29T02:03:21.631354Z caller=addsvc.go:249 transport=debug/HTTP addr=:8080
ts=2019-12-29T02:03:21.631384Z caller=addsvc.go:263 transport=HTTP addr=:8081
ts=2019-12-29T02:03:21.631397Z caller=addsvc.go:297 transport=Thrift addr=:8083
ts=2019-12-29T02:03:21.631418Z caller=addsvc.go:337 transport="JSONRPC over HTTP" addr=:8084
2019/12/29 10:03:51 Sending heartbeat with url http://127.0.0.1:8761/eureka/apps/ADDSVC/192.168.11.5:8082
2019/12/29 10:03:51 Got eureka response from url=http://127.0.0.1:8761/eureka/apps/ADDSVC/192.168.11.5:8082
  1. 启动网关
./apigateway -registry.type eureka -eureka.addr 127.0.0.1:8761

启动成功后,会周期打印出从 eureka 获取的服务实例信息,类似如下。

2019/12/29 10:12:39 Getting app addsvc from url http://127.0.0.1:8761/eureka/apps/addsvc
2019/12/29 10:12:39 Getting app stringsvc from url http://127.0.0.1:8761/eureka/apps/stringsvc
2019/12/29 10:12:39 Got eureka response from url=http://127.0.0.1:8761/eureka/apps/addsvc
ts=2019-12-29T02:12:39.304138Z caller=instancer.go:58 app=addsvc instances=1
2019/12/29 10:12:39 Got eureka response from url=http://127.0.0.1:8761/eureka/apps/stringsvc
ts=2019-12-29T02:12:39.304619Z caller=instancer.go:58 app=stringsvc instances=1
2019/12/29 10:12:44 Getting app stringsvc from url http://127.0.0.1:8761/eureka/apps/stringsvc
2019/12/29 10:12:44 Getting app addsvc from url http://127.0.0.1:8761/eureka/apps/addsvc
2019/12/29 10:12:44 Got eureka response from url=http://127.0.0.1:8761/eureka/apps/addsvc
ts=2019-12-29T02:12:44.307608Z caller=instancer.go:58 app=addsvc instances=1
  1. 发起测试

通过网关转发请求至后端服务

curl -XPOST -d'{"s":"hello, world"}' http://127.0.0.1:8000/stringsvc/uppercase

遇到的问题 链接到标题

  1. addsvc 使用 hudl/fargo 包向 eureka server 进行服务注册时,一开始时对 fargo.Instance 的 InstanceId 错误地赋值为addsvc_1,导致服务可以注册上去,但后续的心跳总是返回 404,当时日志中打印的心跳 url 是类似 http://127.0.0.1:8761/eureka/apps/addsvc/addsvc_1 。查了很多资料,也没有明白原因。后来通过研究 hudl/fargo 的示例,发现官方示例并不会主动对 InstanceId 进行赋值,于是尝试去除该代码后,果然心跳就成功了。然后,心跳 url 就变成了类似 http://127.0.0.1:8761/eureka/apps/addsvc/192.168.11.5:8082 ,路径最后的 “192.168.11.5:8082” 是代码中指定的 HostName 。