2025-02-16 10:49:17 +08:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2025-02-16 12:09:05 +08:00
|
|
|
|
"io"
|
|
|
|
|
"net/http"
|
2025-02-16 10:49:17 +08:00
|
|
|
|
"net/rpc"
|
2025-02-16 12:00:21 +08:00
|
|
|
|
"net/rpc/jsonrpc"
|
2025-02-16 11:41:36 +08:00
|
|
|
|
|
|
|
|
|
"gitlab.com/go-course-project/go17/skills/rpc/hello_world/service"
|
2025-02-16 10:49:17 +08:00
|
|
|
|
)
|
|
|
|
|
|
2025-02-16 11:41:36 +08:00
|
|
|
|
var _ service.HelloService = (*HelloServiceServer)(nil)
|
|
|
|
|
|
2025-02-16 10:49:17 +08:00
|
|
|
|
// 实现业务功能
|
|
|
|
|
// req := &HelloRequest{}
|
|
|
|
|
// resp := &HelloResponse{}
|
2025-02-16 11:41:36 +08:00
|
|
|
|
// err := &HelloServiceServer{}.Hello(req, resp)
|
2025-02-16 10:49:17 +08:00
|
|
|
|
// net/rpc
|
|
|
|
|
// 1. 写好的对象, 注册给RPC Server
|
|
|
|
|
// 2. 再把RPC Server 启动起来
|
2025-02-16 11:41:36 +08:00
|
|
|
|
type HelloServiceServer struct {
|
2025-02-16 10:49:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// HTTP Handler
|
2025-02-16 11:41:36 +08:00
|
|
|
|
func (h *HelloServiceServer) Hello(request *service.HelloRequest, response *service.HelloResponse) error {
|
2025-02-16 11:09:03 +08:00
|
|
|
|
response.Message = "hello:" + request.MyName
|
2025-02-16 10:49:17 +08:00
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-16 12:09:05 +08:00
|
|
|
|
func NewRPCReadWriteCloserFromHTTP(w http.ResponseWriter, r *http.Request) *RPCReadWriteCloser {
|
|
|
|
|
return &RPCReadWriteCloser{w, r.Body}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type RPCReadWriteCloser struct {
|
|
|
|
|
io.Writer
|
|
|
|
|
io.ReadCloser
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-16 10:49:17 +08:00
|
|
|
|
func main() {
|
|
|
|
|
// 1. 把业务 注册给RPC
|
|
|
|
|
// 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error
|
|
|
|
|
// Hello(request *HelloRequest, response *HelloResponse) error
|
2025-02-16 11:41:36 +08:00
|
|
|
|
if err := rpc.RegisterName("HelloService", &HelloServiceServer{}); err != nil {
|
2025-02-16 10:49:17 +08:00
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-16 12:09:05 +08:00
|
|
|
|
// RPC的服务架设在“/jsonrpc”路径,
|
|
|
|
|
// 在处理函数中基于http.ResponseWriter和http.Request类型的参数构造一个io.ReadWriteCloser类型的conn通道。
|
|
|
|
|
// 然后基于conn构建针对服务端的json编码解码器。
|
|
|
|
|
// 最后通过rpc.ServeRequest函数为每次请求处理一次RPC方法调用
|
|
|
|
|
http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
conn := NewRPCReadWriteCloserFromHTTP(w, r)
|
|
|
|
|
rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
http.ListenAndServe(":1234", nil)
|
2025-02-16 10:49:17 +08:00
|
|
|
|
}
|