本文主要介绍如何在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()))