go语言:rpc之原生rpc

421 阅读1分钟

前言

原生rpc,就是go语言自带的rpc框架,及net/rpc.
原生rpc,就是go语言自带的rpc框架,及net/rpc

server端

// server.go

package main

import (
	"crypto/md5"
	"encoding/hex"
	"net"
	"net/http"
	"net/rpc"
)
// 加密工具类
type EncryptionUtil struct {
}

// 加密方法
func (eu *EncryptionUtil) Encryption(req string, resp *string) error {
	*resp = ToMd5(req)
	return nil
}
// 封装 md5 方法
func ToMd5(s string) string{
	m := md5.New()
	m.Write([]byte (s))
	return hex.EncodeToString(m.Sum(nil))
}

func main() {
	// 功能对象注册
	encryption :=  new(EncryptionUtil)
	err := rpc.Register(encryption)  //rpc.RegisterName("自定义服务名",encryption)
	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)

}

client端口

#client.go
package main

import (
	"fmt"
	"net/rpc"
)

func main()  {
	// 建立连接
	client, err := rpc.DialHTTP("tcp", "这里填写server端ip地址:8081")
	if err != nil {
		panic(err.Error())
	}
	// 参数
	req := "mclink"
	var resp *string
	// 同步调用
	err = client.Call("EncryptionUtil.Encryption", req, &resp)
	if err!= nil {
		panic(err.Error())
	}
	fmt.Println(*resp)

	// 异步调用
	syncCall := client.Go("EncryptionUtil.Encryption", req, &resp, nil)
	// 阻塞,异步调用成功后解除阻塞
	replayDone := <-syncCall.Done
	fmt.Println(replayDone)
	fmt.Println(*resp)
        
        // 以上的同步调用模式和异步调用模式,二选一
}