Simple Go RPC 项目教程
1. 项目的目录结构及介绍
simple-go-rpc/
├── client/
│ ├── client.go
│ └── main.go
├── server/
│ ├── server.go
│ └── main.go
├── rpc/
│ ├── codec.go
│ ├── client.go
│ ├── server.go
│ └── types.go
├── go.mod
├── go.sum
└── README.md
目录结构介绍
client/
: 包含客户端相关代码,client.go
是客户端逻辑实现,main.go
是客户端的入口文件。server/
: 包含服务器相关代码,server.go
是服务器逻辑实现,main.go
是服务器的入口文件。rpc/
: 包含 RPC 框架的核心实现,包括编解码器、客户端和服务器的实现。go.mod
和go.sum
: Go 模块文件,用于管理项目的依赖。README.md
: 项目说明文档。
2. 项目的启动文件介绍
服务器启动文件
server/main.go
是服务器的启动文件,主要负责启动 RPC 服务器并注册服务。
package main
import (
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
"simple-go-rpc/server"
)
func main() {
rpc.Register(new(server.Service))
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)
}
go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
}
客户端启动文件
client/main.go
是客户端的启动文件,主要负责连接 RPC 服务器并调用远程方法。
package main
import (
"fmt"
"log"
"net"
"net/rpc/jsonrpc"
"simple-go-rpc/client"
)
func main() {
conn, err := net.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("Dialing error:", err)
}
client := jsonrpc.NewClient(conn)
var reply string
err = client.Call("Service.Method", "arg", &reply)
if err != nil {
log.Fatal("RPC error:", err)
}
fmt.Println("Reply:", reply)
}
3. 项目的配置文件介绍
本项目没有显式的配置文件,所有配置都是通过代码中的硬编码实现的。例如,服务器监听的端口在 server/main.go
中通过 net.Listen("tcp", ":1234")
指定。
如果需要配置文件,可以考虑使用 viper
等库来管理配置,并在代码中读取配置文件。
package main
import (
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
"simple-go-rpc/server"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigName("config")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
log.Fatal("Config file error:", err)
}
port := viper.GetString("server.port")
rpc.Register(new(server.Service))
listener, err := net.Listen("tcp", ":"+port)
if err != nil {
log.Fatal("ListenTCP error:", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
}
配置文件 config.yaml
示例:
server:
port: 1234
通过这种方式,可以将配置从代码中分离出来,便于管理和维护。