rpc

c#---Socean.Rpc之EasyProxy

情到浓时终转凉″ 提交于 2020-02-11 14:59:20
目录 1. 高性能RPC框架:Socean.RPC 2. Socean.RPC框架实测 简介 EasyProxy是Socean.RPC的一个动态代理实现,特点是性能高、稳定性好、使用简便 使用入门: 服务端 : 1.定义序列化器和消息处理器 public class RpcSerializer : Socean.Rpc.DynamicProxy.IRpcSerializer { public object Deserialize(string content, Type type) { return Newtonsoft.Json.JsonConvert.DeserializeObject(content, type); } public string Serialize(object obj) { return Newtonsoft.Json.JsonConvert.SerializeObject(obj); } } public class CustomMessageProcessor : Socean.Rpc.DynamicProxy.EasyProxyMessageProcessor { public override void Init() { RegisterServices(Assembly.GetExecutingAssembly(), new

RPC 框架性能大比拼

霸气de小男生 提交于 2020-02-11 11:59:49
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 Motan 是新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。 rpcx 是Go语言生态圈的Dubbo, 比Dubbo更轻量,实现了Dubbo的许多特性,借助于Go语言优秀的并发特性和简洁语法,可以使用较少的代码实现分布式的RPC服务。 gRPC 是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。 thrift 是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。 以下是它们的功能比较: 对于RPC的考察, 性能是很重要的一点,因为RPC框架经常用在服务的大并发调用的环境中,性能的好坏决定服务的质量以及公司在硬件部署上的花费。 本文通过一个统一的服务,测试这四种框架实现的完整的服务器端和客户端的性能。 这个服务传递的消息体有一个protobuf文件定义: syntax =

实现一个简易的RPC

本秂侑毒 提交于 2020-02-10 20:45:41
  之前写了一些关于RPC原理的文章,但是觉得还得要实现一个。之前看到一句话觉得非常有道理,与大家共勉。不是“不要重复造轮子”,而是“不要发明轮子”,所以能造轮子还是需要造的。   如果大家还有不了解原理的,可参考我之前写的“ RPC原理 ”,点击即可通过“飞机票”过去。   这篇文章的梗概如下:   1. 介绍一下这篇RPC的大致梗概。   2. 说一下这篇文章需要的技术和实现。   3. 用测试用例测试一下。 一、梗概   这篇RPC主要提示了服务注册,服务发现,同步调用,异步调用,回调功能。这些功能已经足够学习RPC使用了,对其中的原理就了解的非常清楚了。 二、技术和实现   采用的技术有Netty, Zookeeper, Protostuff, Spring,Cglib,Log4j这些基本就能够达到这个功能。   Netty的作用就是用于客户端向服务端发送请求,服务端接收请求后进行处理,Netty是一个基于异步事件处理的程序,客户端和服务端采用的LengthFieldBasedFrameDecoder,这种解码方法是最通用的,也就是把长度写到数据包中,即 Length + Data,用这种解码方法解决拆包粘包的问题。   Zookeeper的作用是用于服务的注册,分布式解决方案中的很重要的一个工具。里边主要做两件事,一个是创建一个永久的节点,然后再永久的节点下边创建临时节点

服务治理与RPC · 跬步

拈花ヽ惹草 提交于 2020-02-09 09:39:41
以前写过Django中使用zerorpc的方法,但是由于我们的Django是运行在gevent下,而zeromq需要启动一个后台进程处理消息,与gevent使用的greenlet携程是冲突的。 在Java的世界里,Spring Cloud全家桶覆盖了微服务的方方面面,专注于服务治理的框架也有阿里的Dubbo,微博的Motan。但是Python这边没有找到合适的轮子,甚至于好的RPC框架也没有,只有gRPC,Thrift这种跨语言的RPC框架。而这些跨语言的RPC框架基本上也是基于C/C++的Python port。 在github上全局搜索Python rpc,找到一个原生支持gevent的 MPRPC ,而且也找到了微博Motan的Golang版本,所以考虑读Motan-go的源码学习一下什么是服务治理,再基于MPRPC实现自己的轮子。这就有了 doge 。 服务注册 主流的注册中心服务包括etcd,Consul,zookeeper。这里只考虑了etcd与Consul,etcd相对来说简单些,是一个分布式的KV强一致数据库,数据以树状结构存储。Consul的功能更丰富些,有服务的定义,并且支持对服务的健康检查。etcd不支持健康检查,但是可以通过设置key的ttl,然后服务定时刷新ttl来主动上报。 熔断 MPRPC本身提供了一个简单socket pool池

golang原生的RPC实现

十年热恋 提交于 2020-02-08 16:54:36
server端代码 package main import ( "math" "net" "net/http" "net/rpc" ) //math calculate type MathUtil struct { } //该方法对外暴露,提供计算圆形面积的服务 func (mu *MathUtil)CalculateCircleArea(req float32,resp *float32)error{ *resp = math.Pi * req * req //计算圆形面积 s= pi * r * r return nil } func main(){ //1.初始化指针数据类型 mathUtil := new(MathUtil) //2.调用net/rpc包的功能 将服务对象进行注册 err := rpc.Register(mathUtil) //如果想自定义服务名,可以使用rpc.RegisterName("MathUtil",mathUtil) if err != nil { panic(err.Error()) } //3.通过该函数把mathUtil中提供的服务注册到http协议上,方便调用者可以利用http的方式进行数据传递 rpc.HandleHTTP() //4.在特定的端口进行监听 listen,err := net.Listen("tcp",":8081")

springboot分布式(zookeeper+Dubbo)

我只是一个虾纸丫 提交于 2020-02-08 16:53:12
文章目录 springBoot 分布式zookeeper+Dubbo 一、基础知识 单一应用架构 垂直应用架构 分布式架构 流动计算架构 什么是RPC? 二、Dubbo 什么是Dubbo 为什么使用Dubbo 调用关系说明 Dubbo环境搭建 window下安装dubbo-admin SpringBoot + Dubbo + zookeeper 服务提供者(provider) 服务消费者(consumer) springBoot 分布式zookeeper+Dubbo 一、基础知识 什么是分布式系统 1 、分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统 2 、分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。 3 、分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。 为什么提倡分布式架构 随着互联网规模和需求越来越大,传统的单体应用已经不能支撑 单一应用架构 将网站所有东西打包在一个应用中,将其部署,减少部署成本,此时ORM成为重点 优点:适合小网站,访问量不大的情况下 缺点: 性能扩展比较难 协同开发问题 不利于升级维护 垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时

手写rpc框架

天大地大妈咪最大 提交于 2020-02-07 03:06:05
文章目录 手写rpc框架 rpc概念 rpc是什么 为什么要用rpc rpc核心概念术语 rpc的流程 开发rpc框架 设计客户端 代理对象生成 发现者 协议层 网络层 实现客户端 代理对象生成 发现者 协议层 网络层 设计服务端 RPCServer RequestHandler ServiceRegister 实现服务端 RPCServer RequestHandler ServiceRegister 实现高并发 RPC 框架的要素 手写rpc框架 rpc概念 rpc是什么 远程过程调用 (Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作 远程调用 或 远程方法调用 。 为什么要用rpc RPC框架介于传输层和应用中间,它会帮助处理: 服务化 可重用 系统间交互调用 rpc核心概念术语 Client、Server、calls、replies、service、programs、procedures、version、marshalling(编组)、unmarshalling(解组) 一个网络服务由一个或多个远程程序集构成 一个远程程序实现一个或多个远程过程 过程、过程的参数

RPC浅谈

ぐ巨炮叔叔 提交于 2020-02-01 17:15:43
RPC RPC(Remote Procedure Call) 广义上的RPC RPC(架构)框架 RPC框架原理 PRC架构组件 PRC架构调用过程 常见的RPC框架及分类 常见的RPC 框架的比较 RPC协议 MVC架构、RPC架构、SOA架构、微服务架构区别 单体架构 MVC(Model View Controller) 多服务架构 RPC(Remote Procedure Call)远程过程调用 SOA(Service Oriented Architecture)面向服务架构 微服务架构(轻量级的服务治理方案) RPC(Remote Procedure Call) 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 个人觉得单纯的讲RPC 是没有意义的。 RPC应该被分为广义上的RPC ,RPC框架,RPC协议(后2个暂且称之为狭义的RPC) 广义上的RPC 所谓广义RPC 根据定义 通过网络调用远程计算机上的服务即可称之为RPC 。所以任何符合该说明的都应该属于RPC。包括常见的web服务个人觉得其实也可以理解为RPC. RPC(架构)框架 RPC框架原理 PRC架构组件 一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。

[8][lab] lab2: raft impl

浪尽此生 提交于 2020-01-31 06:35:11
lab 2 raft 本节作为实现ft KV store的基础部分,实现raft状态机复制协议,lab3基于lab2的raft模块,构建KV service,lab4基于上述构建shared KV service 一般来说,容错通过复制集实现状态的复制,保证在少数节点故障的场景下服务依旧可用,挑战是数据的一致性 Raft控制一个服务的状态复制,保证故障后的一致性,保证所有operator log按照相同的顺序在所有复制集节点上执行,保证所有节点对log的内容达成一致性共识。当故障节点重新上线时,raft采用一定的策略保证它慢慢到达最新的一致性状态,Raft依赖主节点同步log,当没有主节点时,raft不会同步log,而是开始新一轮的选举 本节实现Raft为模块独立,每个Raft实例之间通过rpc调用来维持复制状态机,log entries with index numbers,每条entry写来index,最终达成一致的情况下commit,此时raft模块会将结果返回上层服务来执行(仅允许rpc调用,不允许共享变量,不允许依赖共享存储文件等等) 主要参考raft paper来做实现,同时参考reference 更深入理解一致性,可以参考paxos、chubby、Paxos Made Live、Spanner、Zookeeper、Harp… 本节会实现raft论文中大部分操作

一个故事讲清楚NIO

試著忘記壹切 提交于 2020-01-30 07:40:32
from : https://www.cnblogs.com/LBSer/p/4853234.html 你应该知道的 RPC原理    在学校期间大家都写过不少程序,比如写个 hello world服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。   而一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题: 1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用? 2)其它团队要使用我们的新服务,我们的服务该怎么发布以便他人调用?下文将对这两个问题展开探讨。 1 public interface HelloWorldService { 2 String sayHello(String msg); 3 } 1 public class HelloWorldServiceImpl implements HelloWorldService { 2 @Override 3 public String sayHello(String msg) { 4 String result = "hello world " + msg; 5 System.out.println(result); 6 return result; 7 } 8