Go与微服务-确定协议
关注点
对于微服务所用的通讯协议,我们希望有以下几点特性:
- 语意清晰
需要有微服务的DSL定义,清晰描述如何调用,入参出参,并能据此自动生成调用代码。否则,当系统架构越来越复杂,微服务数量越来越多的时候,选用HTTP之类的schemaless协议,将是一场灾难 - 向后兼容
接口需要增加字段时,必须向后兼容 - 支持多语言
支持多语言是必要的,毕竟大多时候,不同团队之间的语言很难统一 - 性能足够好
一次客户端请求可能会带来数十次的微服务调用,因此微服务的协议必须性能足够好 - 社区活跃
活跃的社区,大多数坑都已经踩过,也都有成熟的解决方案,可以节省大量排查问题的时间
性能对比
权衡
从以上图表来看,这几种rpc性能差距不算大。thrift几乎没有官方文档,社区不活跃,dubbo主要受众是java。rpcx生态略弱,没有大厂背书。
对于Go生态而言,相比之下grpc的文档更为丰富,社区更为活跃,且grpc基于http2实现,扩展起来更加方便。譬如我们基于nginx中转grpc服务的话,那么很多通用逻辑譬如缓存日志监控鉴权之类的都可以在nginx层面处理了,服务本身尽可能简单,只负责业务逻辑的实现即可。
服务定义
给个简单定义
syntax = "proto3";
package com.company.base;
option go_package="example";
service Example{
rpc Hello(HelloReq) returns (HelloRes){};
}
message HelloReq {
string name=1;
}
message HelloRes {
string msg=1;
}
相关文章