我接触过的几种服务发现和rpc

公司V

  • 主要Java语言
  • 最原始
  • 没有服务发现
  • 通过域名调用,服务器ip配置在nginx
  • 数据传输使用JSON协议

公司U

  • 主要Java语言
  • 公司基础团队自己实现服务发现机制
  • 服务发现使用netty做tcp长链,用于服务注册等
  • 服务sdk从服务中心获取所调用的对端服务的ip和端口
  • 通过tcp长链通知服务上下线等
  • 通过服务的ip和端口调用
  • 数据传输使用hessian协议

公司K

部门1

版本v1

  • 主要Java语言
  • 使用Eureka做服务发现(HTTP协议)
  • 服务sdk从Eureka获取所调用的对端服务的ip和端口
  • 通过HTTP接口从Eureka定时更新服务实例
  • 通过服务的ip和端口调用
  • 数据传输使用Thrift协议/JSON协议

版本v2

  • 在版本1的基础上增加LocalProxy 作为代理
  • 加入local proxy (service mesh)
    (服务a)->本地LP ->(服务b)

版本v3

  • 在k8s 部署
  • 让每个pod都是单独的实例,ip和物理机一样可以访问,使用calico打通网络,兼容原来的服务发现机制,暂时不使用k8s的service功能
    (服务a)->远程LP ->(服务b)

版本v4

  • 使用Istio替换LP
  • LP(linkerd)使用Euerka,Istio使用k8s service
  • (服务a)->istio-istio →(服务b)
  • 内部调用:(服务a,istio-envoy1)-》(istio-envoy2,服务b)
    ()标识同一个pod

部门2

  • 使用nginx二次开发,作为localproxy,以域名作为服务名
  • 比较原始的方案(公司起步比较早,当时的方案一直沿用至今)