基于grpc的微服务实践
2016-12-02 00:00
513 查看
简介
近一两年来,微服务架构已经成为热门话题(我们这个团队经过深入思考之后,决定在一起美这个APP的后端开发中,选择
框架选择
不同的团队在选择基础框架(库)时考虑的要素不同,我们团队更喜欢小而美的框架,尽可能不要让框架侵入业务,易于升级、维护和替换,所以我们更愿意选择Library而不是Framework。在web方面,我们选择了
在微服务之间的rpc调用方面,为了将来的扩展性、跨语言调用等因素,我们没有直接用go标准库的rpc模块,而是采纳了google最新推出的grpc。但grpc本身属于比较重型的rpc框架,对业务代码有一定的侵入性,我们做了一系列的库(包括
微服务划分
在微服务体系中,如何切分微服务也是一个重要的话题,在我们的实践中,我们遵循了如下一些原则:逻辑独立、边界清晰的模块作为一个独立的微服务
每个table只由一个微服务操作(包括插入、读取、更改、删除等)
table之间不引入外键约束,id字段全部采用uuid
将需要保持数据一致性的操作放在一个微服务中,避免跨服务带来的数据一致性难题
微服务之间的通信,尽可能采用消息队列实现松耦合,当需要同步调用时再借助于rpc
微服务独立部署,通过etcd实现服务的注册与发现
总体架构
Gateway
Gateway是微服务对外提供服务的一个屏障,它的核心点在于:屏蔽微服务之间通过消息队列、rpc等通信方式,为Web页面和移动APP提供基于HTTP协议的RESTfulAPI接口
对每一个http业务请求进行必要的鉴权和数据完整性、合法性检查,以减少微服务的负担,让微服务的代码更纯粹
微服务部署体系中,每个微服务可能会部署多个实例,Gateway还承担着在这些实例中进行负载均衡的功能
进行必要的日志输出、监控打点等功能,对每一个来自于APP和页面的http请求,生成一个唯一的traceid,并将traceid传导到每一个后续的微服务中,以便后续的查错和性能调优
Gateway的每一个http请求都是无状态的,采用JWT(JsonWebToken)机制实现一个客户端的请求状态信息的传递
服务的注册与发现wonaming
微服务体系中,服务的注册和发现对整体架构非常重要,尤其对于同步的rpc调用,每个服务有多少实例,每个实例的地址等,都需要有一个统一的管理。我们采用etcd保存服务信息,同时封装了wonaming作为微服务注册和发现的中间件,它的主要功能包括:服务在启动时,调用wonaming向etcd注册包含TTL的服务“索引”、
注册后,服务与etcd保持定时心跳,当微服务主动退出或超时,服务解注册并“下线”
在Gateway中,通过resolver进行服务发现,配合grpc提供的balancer实现负载均衡,resolver启动后会对etcd中的
服务的rpc调用worc
grpc是一个比较重的rpc框架,当客户端通过grpc调用服务端时,需要大量的重复性代码来建立连接、调用、处理错误返回等,影响业务代码的整洁性,并且对业务代码具有很强的侵入性,为了规避这个问题,我们封装了worc,以实现便捷的grpc调用:grpc的中间件链worpc
grpc提供了interceptor机制,但并没有提供chain来实现不同的中间件的顺序执行,为了将不同的中间件功能(如鉴权、日志、recover)封装在不同的函数里,worpc提供了组合gprcinterceptor为一个chain的能力,可以根据自身业务的需要,撰写不同的grpc中间件进行组合,比如实现grpc的recovery与log中间件:通过以上组合,可为微服务提供panic恢复能力,保障服务稳定可用;同时还将上文中提到的注入context中的traceid取出,这样Gateway与微服务的日志通过就衔接了起来,方便查错、调优等。
其它经验
使用数据可在Gateway中完成组装工作,但无需刻意避免微服务互调,理清依赖关系,尤其当protobuf升级时,根据具体业务来判断引用微服务是否需要同步重部署。
微服务虽好,但一定程度上会加大实施难度,要根据业务体量合理入坑。
总结
以上是微服务架构在我们团队的实践方案,麻雀虽小,五脏俱全。通过各中间件的灵活组合,保障业务有序与服务的高可用,还不抓紧实践起来?在后续的文章中,我们还会介绍目前微服务测试、运维及部署方案。相关文章推荐
- 基于SCA(tuscany)的SOA实践之一(发布服务是如此的简单)
- 构建基于JSON的Web服务最佳实践
- 基于阿里云容器服务的微服务实践 - Part 3. 容器微服务实践
- 基于阿里云容器服务的微服务实践 - Part 2. Docker Compose
- 基于CSDN外包频道的研发型项目顾问服务——CSDN外包实践(49)
- 基于SpringCloud的微服务实践
- 老肖实录分享 | 基于 Mesos 打造高可用微服务系统实践
- 基于ITIL的医院信息化服务管理实践(客户说)
- 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践
- 基于visual c++之windows核心编程代码分析(35)实践NT服务的框架
- SOA实践之基于服务总线的设计
- 基于微服务架构,改造企业核心系统之实践
- 基于swoole的Hprose for PHP 开发后端API服务 实践
- 用户VirtualServer部署Windows2003 Server、NLB和基于COM+企业服务环境实践
- 基于微服务架构,改造企业核心系统之实践
- 基于微服务架构,改造企业核心系统之实践
- 基于SpringCloud的微服务实践
- 爱油科技基于SpringCloud的微服务实践