rpcx

让rpcx支持python细节分析之服务调用

血红的双手。 提交于 2020-08-09 07:54:41
0x1 这段时间在线上系统上正式用上了rpcx作为微服务框架,逐渐代替之前使用的go-micro,主要是考虑到简洁性(go-micro要写proto),性能,配套(rpcx有一个服务治理的UI),fork了个项目二次开发,加入了一些需要的功能特性 网关: https://github.com/halokid/rpcx-gateway 框架: https://github.com/halokid/rpcx 0x2 关于支持python的技术细节 目前python假如rpcx当中,由于时间人手问题,想快速切换原有的服务到rpcx框架,并没有从rpc协议上去支持,目前的做法是python服务还是用原有的jsonrpc来做,但是在服务注册阶段会按照rpcx的注册方式来注册,无缝集成到rpcx-ui当中,python服务的流程如下: 如图所示,相同语言的调用是直接走RPC的, 不同语言的调用是通过网关来统一调用,一般跨语言的服务调用都是用目前访问量不太大的应用来做,多了一次http的转发,性能会比直接调用差一些。其中直接调用的话go的采用msgpack(可定制,默认支持4种)作为默认的解编码工具,ptyhon是用json,所以性能方面go肯定比py要快,从这个层面来说,但是py胜在快速开发。 来源: oschina 链接: https://my.oschina.net/u/615967

rpcx客户端调用服务端超时的技术细节

微笑、不失礼 提交于 2020-05-08 16:27:47
0x1 微服务 服务之间的调用超时设置是很重要的,有时候某个服务因为某些原因响应缓慢,或不可用的时候,这时为了保证调用方的服务正常,超时设置就很有必要。我们来看看rpcx的调用服务超时的技术细节是如何的。 0x2 客户端代码 func main() { d := client.NewConsulDiscovery(*basePath, "Echo", []string{*consulAddr}, nil) option := client.DefaultOption // 设置了响应服务端的超时时间为5秒 option.ReadTimeout = 5 * time.Second xclient := client.NewXClient("Echo", client.Failtry, client.RandomSelect, d, option) defer xclient.Close() args := &Args{ Name: "Rabbit", } reply := &Reply{} err = xclient.Call(ctx, "Say", args, reply) if err != nil { log.Fatalf("调用失败: %v", err) } log.Printf("%s\n", reply.Greet) } 这段代码表示,当客户端调用Echo服务的时候

二次开发rpcx-gateway支持非golang梳理

我们两清 提交于 2020-04-18 01:20:45
rpcx-gatewa的调用是是流程源码梳理 功能实现 API define handle 让网关支持自定义路由, 可以根据自定义的理由,网关直接调用相应的服务,直接是二层服务的架构,减少客户端(消费者)这一层程序 // 关键代码 router.POST("/echo", g.EchoHandle) // 消费echo服务 func (g *Gateway) EchoHandle(w http.ResponseWriter, r *http.Request, params httprouter.Params) { // API router的定义范例 svc := "Echo" call := "Say" g.handleRequestApi(w, r, svc, call) 在HttpRequest2RPCRequest的逻辑判断中,判断是否属于golang的服务端,分开进行服务端的调用逻辑,可灵活接入不同语言实现的服务端 // 判断是否为golang服务端的关键代码,非golang服务端会把语言的定义放在metadata里面 // 在创建xClient时,会根据语言的类型设置 isGo 属性 for _, v := range servers { if strings.Index(v, "typ=py") != -1 { // 为非go语言 client.isGo =

基于Go的马蜂窝旅游网分布式IM系统技术实践

左心房为你撑大大i 提交于 2020-02-25 21:24:26
本文由马蜂窝技术团队电商交易基础平台研发工程师"Anti Walker"原创分享。 一、引言 即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商。 从商品复杂性来看,一个旅游商品可能会包括用户在未来一段时间的衣、食、住、行等方方面面。从消费金额来看,往往单次消费额度较大。对目的地的陌生、在行程中可能的问题,这些因素使用户在购买前、中、后都存在和商家沟通的强烈需求。可以说,一个好用的 IM 可以在一定程度上对企业电商业务的 GMV 起到促进作用。 本文我们将结合马蜂窝旅游电商IM系统的发展历程,单独介绍基于Go重构分布式IM系统过程中的实践和总结( 本文相当于《 从游击队到正规军(一):马蜂窝旅游网的IM系统架构演进之路 》一文的进阶篇 ),希望可以给有相似问题的朋友一些借鉴。 系列文章: 《 从游击队到正规军(一):马蜂窝旅游网的IM系统架构演进之路 》 《 从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结 》 《 从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践 》( * 本文 ) 二、技术背景和问题 与广义上的即时通讯不同,电商各业务线有其特有业务逻辑,如客服聊天系统的客人分配逻辑、敏感词检测逻辑等,这些往往要耦合进通信流程中。随着接入业务线越来越多,即时通讯服务冗余度会越来越高。同时整个消息链路追溯复杂

Golang 在电商即时通讯服务建设中的实践

扶醉桌前 提交于 2019-12-16 11:07:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 马蜂窝技术原创文章,更多干货请搜索公众号:mfwtech ​即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商。 从商品复杂性来看,一个旅游商品可能会包括用户在未来一段时间的衣、食、住、行等方方面面;从消费金额来看,往往单次消费额度较大;对目的地的陌生、在行程中可能的问题,这些因素使用户在购买前、中、后都存在和商家沟通的强烈需求。可以说,一个好用的 IM 可以在一定程度上对企业电商业务的 GMV 起到促进作用。 本文我们将结合马蜂窝旅游电商 IM 服务的发展历程,重点介绍基于 Go 的 IM 重构,希望可以给有相似问题的朋友一些借鉴。 Part.1 技术背景和问题 与广义上的即时通讯不同,电商各业务线有其特有业务逻辑,如客服聊天系统的客人分配逻辑、敏感词检测逻辑等,这些往往要耦合进通信流程中。随着接入业务线越来越多,即时通讯服务冗余度会越来越高。同时整个消息链路追溯复杂,服务稳定性很受业务逻辑的影响。 之前我们 IM 应用中的消息推送主要基于轮询技术,消息轮询模块的长连接请求是通过 php-fpm 挂载在阻塞队列上实现。当请求量较大时,如果不能及时释放 php-fpm 进程,对服务器的性能消耗很大。 为了解决这个问题,我们曾用 OpenResty+Lua 的方式进行改造,利用 Lua

手写RPC框架指北另送贴心注释代码一套

妖精的绣舞 提交于 2019-11-29 20:46:26
Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度越来越大,但是原理是基本不变的。所以沉下心看清代码本质很重要,这次给大家带来的是手写RPC框架。 完整代码以及说明文档, 点我跳跃~ 1. 什么是RPC? RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 RPC框架有很多,比较知名的如阿里的Dubbo、google的gRPC、Go语言的rpcx、Apache的thrift,新浪的motan等等。当然了,你也可以说Dubbo是RPC框架的超集,此外对于Spring Cloud来说,RPC也只是它的一个功能模块。(话说Dubbo已经晋升为Apache顶级项目了,还不一起动手学习下?) RPC要解决的两个问题: 解决分布式系统中,服务之间的调用问题。 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。 2. 技术选型 SpringBoot 项目的基础框架,提供IoC功能。同时方便打成JAR包,便于测试。 Netty 基于NIO的网络通信框架。相比用java socket实现的BIO通信,Netty无论是代码编写简洁还是基于NIO异步非阻塞特性,都占尽了优势。 fastjson