美文网首页求阙
golang实现RPC调用

golang实现RPC调用

作者: limonade_JN | 来源:发表于2020-02-22 15:41 被阅读0次

RPC远程调用

RPC通信过程
  1. 调用者(客户端Client)以本地调用的方式发起调用
  2. Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体;
  3. Client stub将消息体通过网络发送给服务端;
  4. Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数;
  5. Server stub根据方法名和参数进行本地调用;
  6. 被调用者(Server)本地调用执行后将结果返回给server stub;
  7. Server stub将返回值打包编码成消息
  8. 通过网络发送给客户端
  9. Client stub收到消息后,进行拆包解码,返回给Client;
  10. Client得到本次RPC调用的最终结果.

RPC实现

  1. server端代码
package main

import (
    "math"
    "net"
    "net/http"
    "net/rpc"
)

type MathUtil struct {
}

func (mu *MathUtil) CirculateArea(req float32, resp *float32) error {
    *resp = math.Pi * req * req
    return nil
}
func main() {
    mathUtil := new(MathUtil)
    /*将服务对象进行注册*/
    err := rpc.Register(mathUtil)
    if err != nil {
        panic(err.Error())
    }
    /*将函数的服务注册到HTTP上*/
    rpc.HandleHTTP()

    /*在特定的端口进行监听*/
    listen, err := net.Listen("tcp", ":8081")
    if err != nil {
        panic(err.Error())
    }
    http.Serve(listen, nil)
}

  1. client端代码
package main

import (
    "fmt"
    "net/rpc"
)

func main() {
    client,err:=rpc.DialHTTP("tcp","localhost:8081")
    if err != nil {
        panic(err.Error())

    }
    var req float32=3 
    /*同步调用方式*/
    /*
    var resp *float32
    err=client.Call("MathUtil.CirculateArea",req,&resp)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(*resp)*/
    
    /*异步通道*/
    var respSync *float32
    syncCall:=client.Go("MathUtil.CirculateArea",req,&respSync,nil)
    replayDone:=<-syncCall.Done
    fmt.Println(replayDone)
    fmt.Println(*respSync)
}


```![M5I(KF0QXC6~E0[WRD34_DM.png](https://img.haomeiwen.com/i15579061/e4148514aa273401.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

相关文章

  • golang实现RPC调用

    RPC远程调用 调用者(客户端Client)以本地调用的方式发起调用 Client stub(客户端存根)收到调用...

  • golang-rpc

    参考 golang中的RPC调用服务器方法 golang rpc的两种调用方法 Go官方库RPC开发指南 示例 s...

  • Dubbo

    Dubbo(服务治理框架) RPC 各服务都要实现rpc协议,才能实现服务间的调用 rpc:远程过程调用协议,是一...

  • 那些与Netty有关的知识点,你知道多少(二)

    Netty RPC 实现 概念 RPC,即 Remote Procedure Call(远程过程调用),调用远程计...

  • gRPC基于Golang和Java的简单实现

    原文连接: 一文了解RPC以及gRPC基于Golang和Java的简单实现 一:什么是RPC 简介:RPC:Re...

  • RPC远程过程调用概念及实现2018-04-16

    RPC远程过程调用概念及实现 RPC框架学习笔记 >>什么是RPC RPC 的全称是 Remote Procedu...

  • Netty实现RPC的思路

    RPC RPC(Remote Procedure Call)远程过程调用,是一个计算机通信协议,可以实现远程调用远...

  • RPMsg:协议简介

    0. 起因 之前在RPC原理与FastRPC实现一文中介绍过RPC的原理,简而言之,RPC就是实现本地程序调用位于...

  • 基于Netty+动态代理+反射 实现简单的RPC调用

    前言 本文只是简单实现了一次RPC调用示例,以理解其调用原理。一些主流RPC框架的其他功能并没有实现。(如服务自动...

  • 文件创建流程

    NameNodeRpcServer 实现了ClientProtocol协议,rpc调用create方法;creat...

网友评论

    本文标题:golang实现RPC调用

    本文链接:https://www.haomeiwen.com/subject/usvlqhtx.html