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: %v\n", 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 connection\n")

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

		go func(conn net.Conn) { // 并发处理客户端请求
			fmt.Fprintf(os.Stdout, "%s", "new client in coming\n")
			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: %v\n", res.Res)

}

php客户端代码

<?php

class JsonRPC{

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);

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值