• 【RPC和Protobuf】之RPC入门


    一,概念

    RPCRemote procedure call(远程过程调用),分布式系统中不同节点之间流行的通信方式

    服务端:

    注:

    1、执行下面的代码之后,会相应的启动一个tcp进程

    C:\Users\lWX1011939>netstat -aon|findstr 1234           1234是代码中指定的端口号

      TCP    127.0.0.1:1234         0.0.0.0:0              LISTENING       10960

    2、终止进程:C:\Users\lWX1011939>taskkill /F  /pid 10960      /F:表示强制终止

    成功已终止 PID  10960 的进程。

    package main

    import (

    "log"

    "net"

    "net/rpc"

    )

    type HelloService struct {

    //构造一个HelloService类型

    }

    //一个满足rpc规则的方法(方法只能有两个可序列化的参数,第二个参数是指针类型,方法返回error类型)

    func (p *HelloService) Hello(request string, reply *string) error {

    *reply = "hello " + request

    return nil

    }

    func main() {

    //rpc.RegisterName会将传入的对象类型中所有满足RPC规则的方法注册为RPC函,比如这里的Hello函数

    rpc.RegisterName("HelloService", new(HelloService))

    //建立唯一的tcp链接

    listener, listenErrInfo := net.Listen("tcp", "localhost:1234")

    if listenErrInfo != nil {

    log.Fatal("Listen tcp error by: ", listenErrInfo)

    }

    connector, acceptErrInfo := listener.Accept()

    if acceptErrInfo != nil {

    log.Fatal("Accept error : ", acceptErrInfo)

    }

    //通过rpc.ServeConn函数在该TCP链接上为对方提供RPC服务

    rpc.ServeConn(connector)

    }

    客户端:

    package main

    import (

    "fmt"

    "log"

    "net/rpc"

    )

    func main() {

    //客户端请求HelloService服务。首先通过rpc.Dial拨号RPC服务

    client, dialErrInfo := rpc.Dial("tcp", "localhost:1234")

    if dialErrInfo != nil {

    log.Fatal("Dial error: ", dialErrInfo)

    }

    var reply string

    //通过client.Call调用具体的RPC方法第一个参数是用点号链接的RPC服务名字和方法名字,第二和第三个参数分别我们定义RPC方法的两个参数

    callErrInfo := client.Call("HelloService.Hello", "hello", &reply)

    if callErrInfo != nil {

    log.Fatal("Call error info: ", callErrInfo)

    }

    fmt.Println("reply: ", reply)           这里会打印出reply:  hello hello

    }

  • 相关阅读:
    粗浅看Struts2和Hibernate框架
    使用nexus搭建Maven私服
    在线支付功能的设计及其实现
    用户注册的邮箱激活模块的设计与实现
    WebService案例入门(基础篇)
    过滤器应用案例分析
    Java web文件上传下载
    Servlet常用操作(基础)
    AndroidStudio中导入SlidingMenu报错解决方案
    新浪微博Oauth2.0授权认证及SDK、API的使用(Android)
  • 原文地址:https://www.cnblogs.com/gongxianjin/p/16457451.html
Copyright © 2020-2023  润新知