grpcexercises/consuldemo/server/main.go

163 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}