RPC学习

RPC

RPC入门

RPC是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC和IPC一样成为一个不可或缺的基础构件。

  • RPC传输协议
  • 消息序列化与反序列化

go语言rpc的hello world代码演示
server.go

package main

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

func main() {
	//	net/rpc
	//	1.编写一个符合rpc框架的对象
	//	2.怎么通过rpc框架暴露该对象,提供rpc调用

	// 注册被托管的rpc对象
	err := rpc.RegisterName("HelloService", &HelloService{})
	if err != nil {
		panic(err)
	}
	//	然后我们建立一个唯一的TCP连接
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal("ListenTCP error:", err)
	}
	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Fatal("Accept error:", err)
		}
		//	conn ---> a ---> hello service
		// rpc 封装的网络调用
		go rpc.ServeConn(conn)
	}

}

// HelloService 进程内部调用 HelloService{}.Hello()
type HelloService struct {
}

// Hello 需要暴露的方法符合 net/rpc框架约束(类似于http.Handler)
// Fn(request any,Response *any)error
func (s *HelloService) Hello(req string, resp *string) error {
	// req client远程调用时的参数
	// resp 返回给客户端的响应
	*resp = fmt.Sprintf("hello,%s", req)
	return nil
}

client.go

package main

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

func main() {
	//	建立网络连接,拨号(rpc server
	// 首先是通过rpc.Dial拨号RPC服务,建立连接
	conn, err := rpc.Dial("tcp", "localhost:1234")
	if err != nil {
		log.Fatal("dialing:", err)
	}
	// 怎么调用这个rpc 暴露的对象的方法?
	// 通过call方法进行调用
	resp := ""
	err = conn.Call("HelloService.Hello", "Bob", &resp)
	if err != nil {
		panic(err)
	}

	//	打印返回的结果
	fmt.Println(resp)
}

posted @ 2024-01-05 16:57  jasmine456  阅读(3)  评论(0编辑  收藏  举报