IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> grpc远程进程调用 -> 正文阅读

[网络协议]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);

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

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:40:35  更:2022-04-15 00:42:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:47:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码