rpc
课件
hello rpc
满足net/rpc的 对象暴露规范:
// Hello的逻辑 就是 将对方发送的消息前面添加一个Hello 然后返还给对方
// 由于我们是一个rpc服务, 因此参数上面还是有约束:
// 第一个参数是请求
// 第二个参数是响应
// 可以类比Http handler
// 进程内调用 HelloService{}.Hello()
type HelloService struct {
}
// 需要暴露的方法符合 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
}
// 怎么调用这个rpc server 暴露的对象的方法喃?
// 通过call方法进行调用
// Call(serviceMethod string, args any, reply any) error
// serviceMethod: servivcename.fn
resp := ""
err = conn.Call("HelloService.Hello", "bob", &resp)
if err != nil {
panic(err)
}
基于接口封装
需要由接口文档(restful)
conn.Call("HelloService.Hello", "bob", &resp)
主流RPC框架:
- 定义接口(约束客户端和服务端)
- 实现服务端
- 实现客户端(自动生成)
c := NewHelloServiceClient()
resp := &service.HelloResponse{}
err := c.Hello(&service.HelloRequest{Name: "bob"}, resp)
if err != nil {
panic(err)
}
fmt.Print(resp.Message)