| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | package mainimport (	"context"	"flag"	"fmt"	"github.com/go-kit/kit/log"	kitzipkin "github.com/go-kit/kit/tracing/zipkin"	"github.com/longjoy/micro-go-course/section35/zipkin-kit/pb"	edpts "github.com/longjoy/micro-go-course/section35/zipkin-kit/string-service/endpoint"	"github.com/longjoy/micro-go-course/section35/zipkin-kit/string-service/service"	"github.com/openzipkin/zipkin-go"	zipkinhttp "github.com/openzipkin/zipkin-go/reporter/http"	"google.golang.org/grpc"	"net"	"net/http"	"os"	"os/signal"	"syscall")func main() {	var (		consulHost  = flag.String("consul.host", "114.67.98.210", "consul ip address")		consulPort  = flag.String("consul.port", "8500", "consul port")		serviceHost = flag.String("service.host", "localhost", "service ip address")		servicePort = flag.String("service.port", "9009", "service port")		zipkinURL   = flag.String("zipkin.url", "http://114.67.98.210:9411/api/v2/spans", "Zipkin server url")		grpcAddr    = flag.String("grpc", ":9008", "gRPC listen address.")	)	flag.Parse()	ctx := context.Background()	errChan := make(chan error)	var logger log.Logger	{		logger = log.NewLogfmtLogger(os.Stderr)		logger = log.With(logger, "ts", log.DefaultTimestampUTC)		logger = log.With(logger, "caller", log.DefaultCaller)	}	var zipkinTracer *zipkin.Tracer	{		var (			err           error			hostPort      = *serviceHost + ":" + *servicePort			serviceName   = "string-service"			useNoopTracer = (*zipkinURL == "")			reporter      = zipkinhttp.NewReporter(*zipkinURL)		)		defer reporter.Close()		zEP, _ := zipkin.NewEndpoint(serviceName, hostPort)		zipkinTracer, err = zipkin.NewTracer(			reporter, zipkin.WithLocalEndpoint(zEP), zipkin.WithNoopTracer(useNoopTracer),		)		if err != nil {			logger.Log("err", err)			os.Exit(1)		}		if !useNoopTracer {			logger.Log("tracer", "Zipkin", "type", "Native", "URL", *zipkinURL)		}	}	var svc service.Service	svc = service.StringService{}	// add logging middleware to service	svc = LoggingMiddleware(logger)(svc)	endpoint := edpts.MakeStringEndpoint(ctx, svc)	endpoint = kitzipkin.TraceEndpoint(zipkinTracer, "string-endpoint")(endpoint)	//创建健康检查的Endpoint	healthEndpoint := edpts.MakeHealthCheckEndpoint(svc)	healthEndpoint = kitzipkin.TraceEndpoint(zipkinTracer, "health-endpoint")(healthEndpoint)	//把算术运算Endpoint和健康检查Endpoint封装至StringEndpoints	endpts := edpts.StringEndpoints{		StringEndpoint:      endpoint,		HealthCheckEndpoint: healthEndpoint,	}	//创建http.Handler	r := MakeHttpHandler(ctx, endpts, zipkinTracer, logger)	//创建注册对象	registar := Register(*consulHost, *consulPort, *serviceHost, *servicePort, logger)	go func() {		fmt.Println("Http Server start at port:" + *servicePort)		//启动前执行注册		registar.Register()		handler := r		errChan <- http.ListenAndServe(":"+*servicePort, handler)	}()	//grpc server	go func() {		fmt.Println("grpc Server start at port" + *grpcAddr)		listener, err := net.Listen("tcp", *grpcAddr)		if err != nil {			errChan <- err			return		}		serverTracer := kitzipkin.GRPCServerTrace(zipkinTracer, kitzipkin.Name("string-grpc-transport"))		handler := NewGRPCServer(ctx, endpts, serverTracer)		gRPCServer := grpc.NewServer()		pb.RegisterStringServiceServer(gRPCServer, handler)		errChan <- gRPCServer.Serve(listener)	}()	go func() {		c := make(chan os.Signal, 1)		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)		errChan <- fmt.Errorf("%s", <-c)	}()	error := <-errChan	//服务退出取消注册	registar.Deregister()	fmt.Println(error)}
 |