栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

grpc远程进程调用

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

grpc远程进程调用

grpc 实现rpc方法一net/rpc库

服务端代码

package main

import (
	"fmt"
	"log"
	"net"
	"net/http"
	"net/rpc"
	"os"
)

// 算术运算结构体
type Arith struct {
}

// 算术运算请求结构体
type ArithRequest struct {
	A int
	B int
}

// 算术运算响应结构体
type ArithResponse struct {
	Res int
}

// 加法方法实现
func (*Arith) Add(req ArithRequest, res *ArithResponse) error {
	res.Res = req.A + req.B
	return nil
}

func main() {
	// 注册rpc服务
	rpc.Register(new(Arith))
	// 采用http协议作为rpc载体
	rpc.HandleHTTP()

	l, err := net.Listen("tcp", "127.0.0.1:8890")
	if err != nil {
		log.Fatalln("fatal error:", err)
	}
	fmt.Fprintf(os.Stdout, "%s", "start connection")
	http.Serve(l, nil)

}

客户端代码

package main

import (
	"fmt"
	"log"
	"net/rpc"
)

// 算术运算请求结构体
type ArithRequest struct {
	A int
	B int
}

// 算术运算响应结构体
type ArithResponse struct {
	Res int
}

func main() {
	c, err := rpc.DialHTTP("tcp", "127.0.0.1:8890")
	if err != nil {
		log.Fatalln("error:", err)
	}

	req := ArithRequest{9, 2}
	var res ArithResponse

	// 加法运算
	err2 := c.Call("Arith.Add", req, &res)
	if err2 != nil {
		log.Fatalln("error:", err2)

	}
	fmt.Printf("res.Res: %vn", res.Res)
}

运行结果

实现rpc方法二jsonrpc库

此方式实现的RPC方法支持跨语言调用
服务端代码

package main

import (
	"fmt"
	"log"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
	"os"
)

// 算术运算结构体
type Arith struct {
}

// 算术运算请求结构体
type ArithRequest struct {
	A int
	B int
}

// 算术运算响应结构体
type ArithResponse struct {
	Res int
}

// 加法方法实现
func (*Arith) Add(req ArithRequest, res *ArithResponse) error {
	res.Res = req.A + req.B
	return nil
}

func main() {
	// 注册rpc服务
	rpc.Register(new(Arith))
	l, err := net.Listen("tcp", "127.0.0.1:8890")
	if err != nil {
		log.Fatalln("fatal error:", err)
	}
	fmt.Fprintf(os.Stdout, "%s", "start connectionn")

	for {
		conn, err := l.Accept() // 接收客户端连接请求
		if err != nil {
			continue
		}

		go func(conn net.Conn) { // 并发处理客户端请求
			fmt.Fprintf(os.Stdout, "%s", "new client in comingn")
			jsonrpc.ServeConn(conn)
		}(conn)
	}
}

go客户端代码

package main

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

// 算术运算请求结构体
type ArithRequest struct {
	A int
	B int
}

// 算术运算响应结构体
type ArithResponse struct {
	Res int
}

func main() {
	conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8890")
	if err != nil {
		log.Fatalln("dailing error: ", err)
	}

	req := ArithRequest{9, 12}
	var res ArithResponse

	err = conn.Call("Arith.Add", req, &res) // 加法运算
	if err != nil {
		log.Fatalln("arith error: ", err)
	}
	fmt.Printf("res.Res: %vn", res.Res)

}

php客户端代码



private $conn;
    function __construct($host, $port) {

        $this->conn = fsockopen($host, $port, $errno, $errstr, 3);

        if (!$this->conn) {
            return false;
        }
    }
    public function Call($method, $params) {
        if ( !$this->conn ) {
            return false;
        }
        $err = fwrite($this->conn, json_encode(
            array(
                'method' => $method,
                'params' => array($params),
                'id' => 1,
            )
        ));
        if ($err === false){
            return false;
        }
        stream_set_timeout($this->conn, 0, 3000);
        $line = fgets($this->conn);
        if ($line === false) {
            return NULL;
        }
        return json_decode($line,true);
    }
}

$client = new JsonRPC("127.0.0.1", 8890);
$r = $client->Call("Arith.Add",array('A'=>1,'B'=>2));
var_dump($r);

运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/903908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号