2025-02-16 14:56:06 +08:00

59 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"io"
"net/http"
"net/rpc"
"net/rpc/jsonrpc"
"gitlab.com/go-course-project/go17/skills/rpc/hello_world/service"
)
var _ service.HelloService = (*HelloServiceServer)(nil)
// 实现业务功能
// req := &HelloRequest{}
// resp := &HelloResponse{}
// err := &HelloServiceServer{}.Hello(req, resp)
// net/rpc
// 1. 写好的对象, 注册给RPC Server
// 2. 再把RPC Server 启动起来
type HelloServiceServer struct {
}
// HTTP Handler
func (h *HelloServiceServer) Hello(request *service.HelloRequest, response *service.HelloResponse) error {
response.Message = "hello:" + request.MyName
return nil
}
func NewRPCReadWriteCloserFromHTTP(w http.ResponseWriter, r *http.Request) *RPCReadWriteCloser {
return &RPCReadWriteCloser{w, r.Body}
}
type RPCReadWriteCloser struct {
io.Writer
io.ReadCloser
}
func main() {
// 1. 把业务 注册给RPC
// 2. RPC 业务RPC必须是满足条件的接口: (req any, req any) error
// Hello(request *HelloRequest, response *HelloResponse) error
if err := rpc.RegisterName("HelloService", &HelloServiceServer{}); err != nil {
panic(err)
}
// 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))
})
// protobuf.HelloRequest.MyName
http.ListenAndServe(":1234", nil)
}