func makeSumEndpoint(svc server.AddService) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(*server.SumRequest) v := svc.Sum(req.A, req.B) return server.SumResponse{V: v}, nil } }
func makeConcatEndpoint(svc server.AddService) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { r := request.(io.Reader) var req server.ConcatRequest if err := json.NewDecoder(r).Decode(&req); err != nil { return nil, err } v := svc.Concat(req.A, req.B) return json.Marshal(v) } }
func main() { var ( transport = flag.String("transport", "httpjson", "httpjson, grpc, netrpc, thrift") httpAddr = flag.String("http.addr", "localhost:8001", "Address for HTTP (JSON) server") grpcAddr = flag.String("grpc.addr", "localhost:8002", "Address for gRPC server") netrpcAddr = flag.String("netrpc.addr", "localhost:8003", "Address for net/rpc server") thriftAddr = flag.String("thrift.addr", "localhost:8004", "Address for Thrift server") thriftProtocol = flag.String("thrift.protocol", "binary", "binary, compact, json, simplejson") thriftBufferSize = flag.Int("thrift.buffer.size", 0, "0 for unbuffered") thriftFramed = flag.Bool("thrift.framed", false, "true to enable framing") ) flag.Parse() if len(os.Args) < 4 { fmt.Fprintf(os.Stderr, "\n%s [flags] method arg1 arg2\n\n", filepath.Base(os.Args[0])) flag.Usage() os.Exit(1) } root := context.Background() method, s1, s2 := flag.Arg(0), flag.Arg(1), flag.Arg(2) var logger log.Logger logger = log.NewLogfmtLogger(os.Stdout) logger = log.NewContext(logger).With("caller", log.DefaultCaller) logger = log.NewContext(logger).With("transport", *transport) var svc server.AddService switch *transport { case "grpc": cc, err := grpc.Dial(*grpcAddr) if err != nil { _ = logger.Log("err", err) os.Exit(1) } defer cc.Close() svc = grpcclient.New(root, cc, logger) case "httpjson": rawurl := *httpAddr if !strings.HasPrefix("http", rawurl) { rawurl = "http://" + rawurl } baseurl, err := url.Parse(rawurl) if err != nil { _ = logger.Log("err", err) os.Exit(1) } svc = httpjsonclient.New(root, baseurl, logger, nil) case "netrpc": cli, err := rpc.DialHTTP("tcp", *netrpcAddr) if err != nil { _ = logger.Log("err", err) os.Exit(1) } defer cli.Close() svc = netrpcclient.New(cli, logger) case "thrift": var protocolFactory thrift.TProtocolFactory switch *thriftProtocol { case "compact": protocolFactory = thrift.NewTCompactProtocolFactory() case "simplejson": protocolFactory = thrift.NewTSimpleJSONProtocolFactory() case "json": protocolFactory = thrift.NewTJSONProtocolFactory() case "binary", "": protocolFactory = thrift.NewTBinaryProtocolFactoryDefault() default: _ = logger.Log("protocol", *thriftProtocol, "err", "invalid protocol") os.Exit(1) } var transportFactory thrift.TTransportFactory if *thriftBufferSize > 0 { transportFactory = thrift.NewTBufferedTransportFactory(*thriftBufferSize) } else { transportFactory = thrift.NewTTransportFactory() } if *thriftFramed { transportFactory = thrift.NewTFramedTransportFactory(transportFactory) } transportSocket, err := thrift.NewTSocket(*thriftAddr) if err != nil { _ = logger.Log("during", "thrift.NewTSocket", "err", err) os.Exit(1) } trans := transportFactory.GetTransport(transportSocket) defer trans.Close() if err := trans.Open(); err != nil { _ = logger.Log("during", "thrift transport.Open", "err", err) os.Exit(1) } cli := thriftadd.NewAddServiceClientFactory(trans, protocolFactory) svc = thriftclient.New(cli, logger) default: _ = logger.Log("err", "invalid transport") os.Exit(1) } begin := time.Now() switch method { case "sum": a, _ := strconv.Atoi(s1) b, _ := strconv.Atoi(s2) v := svc.Sum(a, b) _ = logger.Log("method", "sum", "a", a, "b", b, "v", v, "took", time.Since(begin)) case "concat": a, b := s1, s2 v := svc.Concat(a, b) _ = logger.Log("method", "concat", "a", a, "b", b, "v", v, "took", time.Since(begin)) default: _ = logger.Log("err", "invalid method "+method) os.Exit(1) } }