e.proto
课件服务入口
package main
import (
"context"
"fmt"
"go-demo/etcd/common"
"go-demo/etcd/rpc/courseware"
"go-demo/etcd/server"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"net"
"os"
"strings"
"time"
)
var Port string
type service struct {
courseware.UnsafeCoursewareServer
}
func (s *service) Get(ctx context.Context, req *courseware.GetRequest) (res *courseware.GetResponse, err error) {
fmt.Println("获取课件详情 port:", Port, " time:", time.Now())
return &courseware.GetResponse{
Id: 1,
Code: "HD4544",
Name: "多媒体课件",
Type: 4,
}, nil
}
func main() {
args := os.Args[1:]
if len(args) == 0 {
panic("缺少port参数:port=8400")
}
for _, arg := range args {
ports := strings.Split(arg, "=")
if len(ports) < 2 || ports[0] != "port" {
panic("port参数格式错误:port=8400")
}
Port = ports[1]
}
listen, err := net.Listen("tcp", ":"+Port)
if err != nil {
fmt.Println("failed to listen", err)
return
}
s := grpc.NewServer()
courseware.RegisterCoursewareServer(s, &service{})
reflection.Register(s)
// 注册到etcd
newService, err := server.NewService(server.ServiceInfo{
Name: common.CoursewareRpc,
Ip: "127.0.0.1:" + Port,
}, common.Endpoints)
if err != nil {
fmt.Println("添加到etcd失败:", err)
return
}
go func() {
err = newService.Start(context.Background())
if err != nil {
fmt.Println("开启服务注册失败:", err)
}
}()
if err = s.Serve(listen); err != nil {
fmt.Println("开启rpc服务失败:", err)
}
}
5、api服务
package main
import (
"context"
"fmt"
"go-demo/etcd/common"
"go-demo/etcd/rpc/courseware"
"go-demo/etcd/server"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/resolver"
"time"
)
func main() {
d := server.NewDiscovery(common.Endpoints, common.CoursewareRpc)
resolver.Register(d)
for {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
// 通过etcd注册中心和grpc服务建立连接
conn, err := grpc.DialContext(ctx,
fmt.Sprintf(d.Scheme()+":///"+common.CoursewareRpc),
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithDefaultServiceConfig(`{"loadBalancingConfig": [{"round_robin":{}}]}`),
grpc.WithBlock(),
)
if err != nil {
fmt.Println("和rpc建立连接失败:", err)
return
}
client := courseware.NewCoursewareClient(conn)
get, err := client.Get(ctx, &courseware.GetRequest{Id: 1})
if err != nil {
fmt.Println("获取课件失败:", err)
return
}
fmt.Println(get)
time.Sleep(3 * time.Second)
cancel()
}
}
6、测试
开启3个服务,可以看到客户端通过负载均衡随机到一个服务请求
go run main.go port=8400
获取课件详情 port: 8400 time: 2022-08-25 18:47:43.784942 +0800 CST m=+78.228450885
获取课件详情 port: 8400 time: 2022-08-25 18:47:52.925858 +0800 CST m=+87.369721731
获取课件详情 port: 8400 time: 2022-08-25 18:48:02.001177