本文主要介绍如何在grpc中使用负载均衡。
我们使用的是别人写好的一个包mbobakov/grpc-consul-resolver,这个包的使用也很简单,只需要导入进来,在初始化的时候添加
1package main
2
3import (
4 "time"
5 "log"
6
7 // 添加的
8 _ "github.com/mbobakov/grpc-consul-resolver" // It's important
9
10 "google.golang.org/grpc"
11)
12
13func main() {
14 conn, err := grpc.Dial(
15 "consul://127.0.0.1:8500/whoami?wait=14s&tag=manual",
16 grpc.WithInsecure(),
17 // 添加的
18 grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
19 )
20 if err != nil {
21 log.Fatal(err)
22 }
23 defer conn.Close()
24 ...
25}
在这里我们要做一个关于优雅终止的。当我们要结束掉进程之后,我们要把服务在注册中心注销掉。
shop\service\user_srv\main.go
最后
1 // 由于我们要一直监听操作,这些启动一个协程
2 go func() {
3 err = server.Serve(lis)
4 if err != nil {
5 global.Logger.Fatal("cannot run server.....")
6 }
7 }()
8 // 优雅退出
9 quit := make(chan os.Signal)
10 // 监听信号
11 signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
12 <-quit
13 if err = client.Agent().ServiceDeregister(serviceID.String()); err != nil {
14 global.Logger.Info("服务注销失败", zap.String("serviceID", serviceID.String()))
15 }
16 cl.Close()
17 global.Logger.Info("服务已注销", zap.String("serviceID", serviceID.String()))