GO RPC

HTTP RPC

SERVER CODE

package main

import (
"errors"
"fmt"
"net/http"
"net/rpc"
)

const (
    URL = "192.168.2.172:12981"
)

type Args struct {
    A, B int
}

type Quotient struct {
    Quo, Rem int
}

type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
    *reply = args.A * args.B
    return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error{
    if args.B == 0 {
        return errors.New("divide by zero!")
    }

    quo.Quo = args.A / args.B
    quo.Rem = args.A % args.B

    return nil
}
func main() {

    arith := new(Arith)
    rpc.Register(arith)
    rpc.HandleHTTP()

    err := http.ListenAndServe(URL, nil)
    if err != nil {
        fmt.Println(err.Error())
    }
}

client code

package main

import (
    "fmt"
    "net/rpc”
)

const (
    URL = "192.168.2.172:12982"
)

func main() {

    client, err := rpc.DialHTTP("tcp", URL)
    if err != nil {
        fmt.Println(err.Error())
    }

    args := Args{2, 4}
    var reply int
    err = client.Call("Arith.Multiply", &args, &reply)

    if err != nil {
        fmt.Println(err.Error())
    } else {
        fmt.Println(reply)
    }
}

 二 JSON-RPC

server code

package main

import (
"errors"
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)

const (
    URL= "192.168.2.172:12981"
)

type Args struct {
    A, B int
}
type Quotient struct {
    Quo, Rem int
}

type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
    *reply = args.A * args.B
    return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
    if args.B == 0 {
        return errors.New("divide by zero!")
    }

    quo.Quo = args.A / args.B
    quo.Rem = args.A % args.B

    return nil
}
func main() {

    arith := new(Arith)
    rpc.Register(arith)

    tcpAddr, err := net.ResolveTCPAddr("tcp", URL)
    if err != nil {
        fmt.Println(err)
    }
    listener, err := net.ListenTCP("tcp", tcpAddr)

    for {
        conn, err := listener.Accept()
        if err != nil {
            continue
        }
        go jsonrpc.ServeConn(conn)
    }
}

client code

package main

import (
    "fmt"
    "net/rpc”
)

const (
    URL = "192.168.2.172:12982"
)

func main() {

    client, err := jsonrpc.Dial("tcp", URL)
    defer client.Close()

    if err != nil {
        fmt.Println(err)
    }

    args := Args{7, 2}
    var reply int
    err = client.Call("Arith.Multiply", &args, &reply)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(reply)
}
时间: 2024-12-29 04:09:21

GO RPC的相关文章

下载-深入浅出Netty源码剖析、Netty实战高性能分布式RPC、NIO+Netty5各种RPC架构实战演练三部曲视频教程

下载-深入浅出Netty源码剖析.Netty实战高性能分布式RPC.NIO+Netty5各种RPC架构实战演练三部曲视频教程 第一部分:入浅出Netty源码剖析 第二部分:Netty实战高性能分布式RPC 第三部分:NIO+Netty5各种RPC架构实战演练

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用

网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2--RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjectProxy(new LocalRPCClient()); : 绑定目标对象 2. IUserService userService = (IUserService) rpcObjectProxy.create(IUserService.class); :返回代理类 3. List<User> u

Spring远程服务(RPC)

Spring支持几种不同的RPC模型,包括远程方法调用(RMI).Caucho的Hessian和Burlap和Spring自带的HTTP invoker.如下: 无论选择哪一种RPC模型,我们都会发现Spring对每一种模型都提供了风格一致的支持.在所有的模型中,服务都作为Spring所管理的Bean配置到我们的应用中.这是采用一个代理工厂Bean实现的,这个Bean能够像本地对象一样将远程服务装配到其他Bean的属性中去.它的工作原理如下:

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所

RPC框架性能基本比较测试

gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言. 我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持. 我们可以设想一下,未来浏览器支持HTTP2.0,并通过现有开源序列化库比如protobuf等,可以直接和各种语言的服务进行高效交互,这将是多么“美好”的场景! gPRC的Java实现底层网络库是Netty,而且是用到最新的Netty5.0.0.Alpha3的开发版本,因为最新版本针对HTTP/2做了很

python通过protobuf实现rpc

由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行google,这里只是做个简单的介绍.rpc的主要功能是让分布式系统的实现更为简单,为提供强大的远程调用而不损失本地调用语义的简洁性.为了实现这个目标,rpc框架需要提供一种透明调用机制让使用者不必显示区分本地调用还是远程调用.rpc架构涉及的组件如下: 客户方像调用本地方法一样去调用远程接口方法,R

基于protobuf的RPC实现

可以对照使用google protobuf RPC实现echo service一文看,细节本文不再描述. google protobuf只负责消息的打包和解包,并不包含RPC的实现,但其包含了RPC的定义.假设有下面的RPC定义: service MyService { rpc Echo(EchoReqMsg) returns(EchoRespMsg) } 那么要实现这个RPC需要最少做哪些事?总结起来需要完成以下几步: 客户端 RPC客户端需要实现google::protobuf::RpcCh

腾讯正式对外开源高性能 RPC 开发框架与微服务平台Tars

Tars 是将腾讯内部使用的微服务架构 TAF(Total Application Framework)多年的实践成果总结而成的开源项目,目前已于4月10日正式对外开源. 作为支持多语言的高性能 RPC 开发框架和配套一体化的服务治理平台,Tars可以帮助企业或者用户以微服务的方式快速构建稳定可靠的分布式应用,它的设计灵感来源于采取分层思想,实现开发与运营之间的分离.目前该框架在腾讯内部,已经在 160 多个业务(如手机浏览器.应用宝.手机管家.手机QQ.手机游戏等).1.6 多万台服务器上运行

Avro实现RPC

场景:一个客户端,一个服务端(创建两个avro工程).客户端向服务端发送数据,服务端根据算法算出结果,返回给客户端. Http主外,RPC主内.(解决分布式环境下,节点间的数据通信或远程过程调用) 实现步骤 1.创建两个maven工程 2.引入pom文件 3.更改maven工程结构(src/main/avro) 4.创建模式文件(协议文件) 5.根据avro插件生成文件对应的接口类 6.利用API实现rpc 具体实现: 1. 创建两个maven项目,修改jdk版本和编译的版本  1.5->1.7

RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)

服务器通讯原理就是一台socket服务器A,另一台socket客户端B,现在如果要通讯的话直接以流方式写入或读出. 这样能实现通讯,但有个问题.如何知道更多信息?比如需要发送流大小,编码,Ip等. 这样就有了协议,协议就是规范,就是发送的流中携带了很多的内容. RPC的实现就是一种规范.可参考http://javatar.iteye.com/blog/1123915 这个简单RPC实现. RPC(远程过程调用)是什么 简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服