163 lines
3.1 KiB
Go
163 lines
3.1 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"git.gqnotes.com/guoqiang/grpcexercises/consuldemo/pkg/consul"
|
||
"github.com/hashicorp/consul/api"
|
||
"google.golang.org/grpc/reflection"
|
||
"log"
|
||
"net"
|
||
"net/http"
|
||
"os"
|
||
"os/signal"
|
||
"syscall"
|
||
"time"
|
||
|
||
"git.gqnotes.com/guoqiang/grpcexercises/consuldemo/pb"
|
||
"go.uber.org/zap"
|
||
"golang.org/x/sync/errgroup"
|
||
"google.golang.org/grpc"
|
||
)
|
||
|
||
func main() {
|
||
// consul地址,此处为本地地址
|
||
consulAddress := "localhost:8500"
|
||
// 服务名称
|
||
serviceName := "service-grpcdemo"
|
||
|
||
logger := zap.NewExample()
|
||
// 实现服务端逻辑
|
||
lis, err := net.Listen("tcp", ":5630")
|
||
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
|
||
s := grpc.NewServer()
|
||
|
||
pb.RegisterGreetServiceServer(s, &Server{})
|
||
|
||
reflection.Register(s)
|
||
|
||
logger.Info("grpc server start")
|
||
|
||
// 启动相关服务
|
||
var gg errgroup.Group
|
||
|
||
gg.Go(func() error {
|
||
logger.Debug("grpc server start")
|
||
|
||
go func() {
|
||
if err := s.Serve(lis); err != nil {
|
||
logger.Fatal("grpc server start failed", zap.Error(err))
|
||
}
|
||
}()
|
||
|
||
return nil
|
||
})
|
||
|
||
gg.Go(func() error {
|
||
if err := consul.InitConsulClient(consulAddress); err != nil {
|
||
return err
|
||
}
|
||
|
||
logger.Debug("consul client start")
|
||
|
||
return nil
|
||
})
|
||
|
||
if err = gg.Wait(); err != nil {
|
||
logger.Fatal("server start failed", zap.Error(err))
|
||
return
|
||
}
|
||
|
||
// 注册服务
|
||
|
||
// 健康检查
|
||
go func() {
|
||
mux := http.NewServeMux()
|
||
|
||
mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
|
||
_, _ = w.Write([]byte("ok"))
|
||
})
|
||
|
||
err = http.ListenAndServe(":8081", mux)
|
||
|
||
if err != nil {
|
||
logger.Fatal("health check start failed", zap.Error(err))
|
||
}
|
||
|
||
}()
|
||
|
||
check := &api.AgentServiceCheck{
|
||
Interval: "3s",
|
||
Timeout: "2s",
|
||
DeregisterCriticalServiceAfter: "60s",
|
||
HTTP: "http://127.0.0.1:8081/health",
|
||
Method: "GET",
|
||
}
|
||
|
||
err = consul.GetConsulClient().Agent().ServiceRegister(&api.AgentServiceRegistration{
|
||
Name: serviceName,
|
||
Port: 5630,
|
||
Check: check,
|
||
ID: "1001",
|
||
Tags: []string{"grpc.port=5630"},
|
||
})
|
||
|
||
if err != nil {
|
||
logger.Fatal("register service failed", zap.Error(err))
|
||
return
|
||
}
|
||
|
||
// 优雅关闭
|
||
ch := make(chan os.Signal, 1)
|
||
|
||
// 监听信号
|
||
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL, syscall.SIGHUP, syscall.SIGQUIT)
|
||
|
||
// 阻塞等待信号
|
||
sig := <-ch
|
||
|
||
logger.Info("receive signal", zap.Any("signal", sig))
|
||
|
||
// 关闭服务
|
||
s.GracefulStop()
|
||
|
||
logger.Debug("server stop")
|
||
}
|
||
|
||
type Server struct {
|
||
pb.UnimplementedGreetServiceServer
|
||
}
|
||
|
||
func (s *Server) Greet(ctx context.Context, req *pb.GreetRequest) (resp *pb.GreetResponse, err error) {
|
||
t0 := time.Now()
|
||
|
||
defer func() {
|
||
log.Println("Greet cost:", time.Since(t0))
|
||
}()
|
||
|
||
resp = &pb.GreetResponse{
|
||
Result: "hello, " + req.Greeting + "!",
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
func (s *Server) GreetManyTimes(request *pb.GreetRequest, stream pb.GreetService_GreetManyTimesServer) (err error) {
|
||
for i := 0; i < 10; i++ {
|
||
err = stream.Send(&pb.GreetResponse{
|
||
Result: "hello, " + request.Greeting + "!",
|
||
})
|
||
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
time.Sleep(time.Millisecond * 1)
|
||
}
|
||
|
||
return
|
||
}
|