mirror of
				https://github.com/linka-cloud/grpc.git
				synced 2025-11-04 03:21:50 +00:00 
			
		
		
		
	[wip] base options, command, service
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
.idea
 | 
			
		||||
							
								
								
									
										54
									
								
								example/example.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								example/example.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	service2 "gitlab.bertha.cloud/partitio/grpc-service/service"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type GreeterHandler struct{}
 | 
			
		||||
 | 
			
		||||
func hello(name string) string {
 | 
			
		||||
	return fmt.Sprintf("Hello %s !", name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *GreeterHandler) SayHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
 | 
			
		||||
	return &HelloReply{Message: hello(req.Name)}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g *GreeterHandler) SayHelloStream(req *HelloStreamRequest, s Greeter_SayHelloStreamServer) error {
 | 
			
		||||
	for i := int64(0); i < req.Count; i++ {
 | 
			
		||||
		if err := s.Send(&HelloReply{Message: hello(req.Name)}); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	var svc service2.Service
 | 
			
		||||
	var err error
 | 
			
		||||
	svc, err = service2.New(
 | 
			
		||||
		service2.WithContext(ctx),
 | 
			
		||||
		service2.WithName("Greeting"),
 | 
			
		||||
		service2.WithAfterStart(func() error {
 | 
			
		||||
			fmt.Println("Server listening on", svc.Options().Address())
 | 
			
		||||
			return nil
 | 
			
		||||
		}),
 | 
			
		||||
		service2.WithAfterStop(func() error {
 | 
			
		||||
			fmt.Println("Stopping server")
 | 
			
		||||
			return nil
 | 
			
		||||
		}),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	RegisterGreeterServer(svc.Server(), &GreeterHandler{})
 | 
			
		||||
	if err := svc.Start(); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										319
									
								
								example/example.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								example/example.pb.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,319 @@
 | 
			
		||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
			
		||||
// source: example.proto
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	context "context"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/golang/protobuf/proto"
 | 
			
		||||
	grpc "google.golang.org/grpc"
 | 
			
		||||
	codes "google.golang.org/grpc/codes"
 | 
			
		||||
	status "google.golang.org/grpc/status"
 | 
			
		||||
	math "math"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
type HelloRequest struct {
 | 
			
		||||
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *HelloRequest) Reset()         { *m = HelloRequest{} }
 | 
			
		||||
func (m *HelloRequest) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*HelloRequest) ProtoMessage()    {}
 | 
			
		||||
func (*HelloRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_15a1dc8d40dadaa6, []int{0}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *HelloRequest) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_HelloRequest.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_HelloRequest.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloRequest) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_HelloRequest.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloRequest) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_HelloRequest.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloRequest) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_HelloRequest.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_HelloRequest proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *HelloRequest) GetName() string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Name
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type HelloReply struct {
 | 
			
		||||
	Message              string   `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *HelloReply) Reset()         { *m = HelloReply{} }
 | 
			
		||||
func (m *HelloReply) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*HelloReply) ProtoMessage()    {}
 | 
			
		||||
func (*HelloReply) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_15a1dc8d40dadaa6, []int{1}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *HelloReply) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_HelloReply.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_HelloReply.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloReply) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_HelloReply.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloReply) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_HelloReply.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloReply) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_HelloReply.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_HelloReply proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *HelloReply) GetMessage() string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Message
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type HelloStreamRequest struct {
 | 
			
		||||
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 | 
			
		||||
	Count                int64    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *HelloStreamRequest) Reset()         { *m = HelloStreamRequest{} }
 | 
			
		||||
func (m *HelloStreamRequest) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*HelloStreamRequest) ProtoMessage()    {}
 | 
			
		||||
func (*HelloStreamRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_15a1dc8d40dadaa6, []int{2}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *HelloStreamRequest) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_HelloStreamRequest.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_HelloStreamRequest.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloStreamRequest) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_HelloStreamRequest.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloStreamRequest) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_HelloStreamRequest.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *HelloStreamRequest) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_HelloStreamRequest.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_HelloStreamRequest proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *HelloStreamRequest) GetName() string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Name
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *HelloStreamRequest) GetCount() int64 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Count
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*HelloRequest)(nil), "helloworld.HelloRequest")
 | 
			
		||||
	proto.RegisterType((*HelloReply)(nil), "helloworld.HelloReply")
 | 
			
		||||
	proto.RegisterType((*HelloStreamRequest)(nil), "helloworld.HelloStreamRequest")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("example.proto", fileDescriptor_15a1dc8d40dadaa6) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_15a1dc8d40dadaa6 = []byte{
 | 
			
		||||
	// 208 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4d, 0xad, 0x48, 0xcc,
 | 
			
		||||
	0x2d, 0xc8, 0x49, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xca, 0x48, 0xcd, 0xc9, 0xc9,
 | 
			
		||||
	0x2f, 0xcf, 0x2f, 0xca, 0x49, 0x51, 0x52, 0xe2, 0xe2, 0xf1, 0x00, 0xf1, 0x82, 0x52, 0x0b, 0x4b,
 | 
			
		||||
	0x53, 0x8b, 0x4b, 0x84, 0x84, 0xb8, 0x58, 0xf2, 0x12, 0x73, 0x53, 0x25, 0x18, 0x15, 0x18, 0x35,
 | 
			
		||||
	0x38, 0x83, 0xc0, 0x6c, 0x25, 0x35, 0x2e, 0x2e, 0xa8, 0x9a, 0x82, 0x9c, 0x4a, 0x21, 0x09, 0x2e,
 | 
			
		||||
	0xf6, 0xdc, 0xd4, 0xe2, 0xe2, 0xc4, 0x74, 0x98, 0x22, 0x18, 0x57, 0xc9, 0x8e, 0x4b, 0x08, 0xac,
 | 
			
		||||
	0x2e, 0xb8, 0xa4, 0x28, 0x35, 0x31, 0x17, 0x8f, 0x89, 0x42, 0x22, 0x5c, 0xac, 0xc9, 0xf9, 0xa5,
 | 
			
		||||
	0x79, 0x25, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x10, 0x8e, 0xd1, 0x74, 0x46, 0x2e, 0x76,
 | 
			
		||||
	0xf7, 0xa2, 0xd4, 0xd4, 0x92, 0xd4, 0x22, 0x21, 0x3b, 0x2e, 0x8e, 0xe0, 0xc4, 0x4a, 0xb0, 0x71,
 | 
			
		||||
	0x42, 0x12, 0x7a, 0x08, 0x07, 0xeb, 0x21, 0xbb, 0x56, 0x4a, 0x0c, 0x8b, 0x4c, 0x41, 0x4e, 0xa5,
 | 
			
		||||
	0x12, 0x83, 0x90, 0x0f, 0x17, 0x1f, 0x4c, 0x3f, 0xc4, 0x39, 0x42, 0x72, 0x18, 0x6a, 0x51, 0xdc,
 | 
			
		||||
	0x89, 0xdb, 0x2c, 0x03, 0x46, 0x27, 0xb6, 0x28, 0x96, 0xdc, 0xc4, 0xcc, 0xbc, 0x24, 0x36, 0x70,
 | 
			
		||||
	0x00, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd0, 0x30, 0x8a, 0x2d, 0x51, 0x01, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ context.Context
 | 
			
		||||
var _ grpc.ClientConn
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the grpc package it is being compiled against.
 | 
			
		||||
const _ = grpc.SupportPackageIsVersion4
 | 
			
		||||
 | 
			
		||||
// GreeterClient is the client API for Greeter service.
 | 
			
		||||
//
 | 
			
		||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
			
		||||
type GreeterClient interface {
 | 
			
		||||
	SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
 | 
			
		||||
	SayHelloStream(ctx context.Context, in *HelloStreamRequest, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type greeterClient struct {
 | 
			
		||||
	cc *grpc.ClientConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewGreeterClient(cc *grpc.ClientConn) GreeterClient {
 | 
			
		||||
	return &greeterClient{cc}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) {
 | 
			
		||||
	out := new(HelloReply)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/helloworld.Greeter/SayHello", in, out, opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *greeterClient) SayHelloStream(ctx context.Context, in *HelloStreamRequest, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error) {
 | 
			
		||||
	stream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[0], "/helloworld.Greeter/SayHelloStream", opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	x := &greeterSayHelloStreamClient{stream}
 | 
			
		||||
	if err := x.ClientStream.SendMsg(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if err := x.ClientStream.CloseSend(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return x, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Greeter_SayHelloStreamClient interface {
 | 
			
		||||
	Recv() (*HelloReply, error)
 | 
			
		||||
	grpc.ClientStream
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type greeterSayHelloStreamClient struct {
 | 
			
		||||
	grpc.ClientStream
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *greeterSayHelloStreamClient) Recv() (*HelloReply, error) {
 | 
			
		||||
	m := new(HelloReply)
 | 
			
		||||
	if err := x.ClientStream.RecvMsg(m); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return m, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GreeterServer is the server API for Greeter service.
 | 
			
		||||
type GreeterServer interface {
 | 
			
		||||
	SayHello(context.Context, *HelloRequest) (*HelloReply, error)
 | 
			
		||||
	SayHelloStream(*HelloStreamRequest, Greeter_SayHelloStreamServer) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnimplementedGreeterServer can be embedded to have forward compatible implementations.
 | 
			
		||||
type UnimplementedGreeterServer struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*UnimplementedGreeterServer) SayHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
 | 
			
		||||
}
 | 
			
		||||
func (*UnimplementedGreeterServer) SayHelloStream(req *HelloStreamRequest, srv Greeter_SayHelloStreamServer) error {
 | 
			
		||||
	return status.Errorf(codes.Unimplemented, "method SayHelloStream not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) {
 | 
			
		||||
	s.RegisterService(&_Greeter_serviceDesc, srv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(HelloRequest)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if interceptor == nil {
 | 
			
		||||
		return srv.(GreeterServer).SayHello(ctx, in)
 | 
			
		||||
	}
 | 
			
		||||
	info := &grpc.UnaryServerInfo{
 | 
			
		||||
		Server:     srv,
 | 
			
		||||
		FullMethod: "/helloworld.Greeter/SayHello",
 | 
			
		||||
	}
 | 
			
		||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
			
		||||
		return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
 | 
			
		||||
	}
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _Greeter_SayHelloStream_Handler(srv interface{}, stream grpc.ServerStream) error {
 | 
			
		||||
	m := new(HelloStreamRequest)
 | 
			
		||||
	if err := stream.RecvMsg(m); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return srv.(GreeterServer).SayHelloStream(m, &greeterSayHelloStreamServer{stream})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Greeter_SayHelloStreamServer interface {
 | 
			
		||||
	Send(*HelloReply) error
 | 
			
		||||
	grpc.ServerStream
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type greeterSayHelloStreamServer struct {
 | 
			
		||||
	grpc.ServerStream
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *greeterSayHelloStreamServer) Send(m *HelloReply) error {
 | 
			
		||||
	return x.ServerStream.SendMsg(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _Greeter_serviceDesc = grpc.ServiceDesc{
 | 
			
		||||
	ServiceName: "helloworld.Greeter",
 | 
			
		||||
	HandlerType: (*GreeterServer)(nil),
 | 
			
		||||
	Methods: []grpc.MethodDesc{
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "SayHello",
 | 
			
		||||
			Handler:    _Greeter_SayHello_Handler,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	Streams: []grpc.StreamDesc{
 | 
			
		||||
		{
 | 
			
		||||
			StreamName:    "SayHelloStream",
 | 
			
		||||
			Handler:       _Greeter_SayHelloStream_Handler,
 | 
			
		||||
			ServerStreams: true,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	Metadata: "example.proto",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								example/example.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								example/example.proto
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
syntax = "proto3";
 | 
			
		||||
 | 
			
		||||
package helloworld;
 | 
			
		||||
 | 
			
		||||
option go_package = "main";
 | 
			
		||||
 | 
			
		||||
service Greeter {
 | 
			
		||||
    rpc SayHello (HelloRequest) returns (HelloReply) {}
 | 
			
		||||
    rpc SayHelloStream (HelloStreamRequest) returns (stream HelloReply) {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message HelloRequest {
 | 
			
		||||
    string name = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message HelloReply {
 | 
			
		||||
    string message = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message HelloStreamRequest {
 | 
			
		||||
    string name = 1;
 | 
			
		||||
    int64 count = 2;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
module gitlab.bertha.cloud/partitio/grpc-service
 | 
			
		||||
 | 
			
		||||
go 1.13
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/golang/protobuf v1.3.2
 | 
			
		||||
	github.com/grpc-ecosystem/go-grpc-middleware v1.1.0
 | 
			
		||||
	github.com/jinzhu/gorm v1.9.12
 | 
			
		||||
	github.com/nats-io/stan.go v0.6.0 // indirect
 | 
			
		||||
	github.com/spf13/cobra v0.0.5
 | 
			
		||||
	github.com/spf13/pflag v1.0.3
 | 
			
		||||
	github.com/spf13/viper v1.6.2
 | 
			
		||||
	google.golang.org/grpc v1.26.0
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										214
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,214 @@
 | 
			
		||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
			
		||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
			
		||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
			
		||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
			
		||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
			
		||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
			
		||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
			
		||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 | 
			
		||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
			
		||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
 | 
			
		||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
			
		||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
			
		||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
			
		||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
			
		||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
			
		||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
			
		||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
			
		||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
			
		||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
			
		||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
			
		||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 | 
			
		||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
			
		||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 | 
			
		||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
 | 
			
		||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 | 
			
		||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
 | 
			
		||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
			
		||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
			
		||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
			
		||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 | 
			
		||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
			
		||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
			
		||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
			
		||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg=
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE=
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
			
		||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
			
		||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
			
		||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 | 
			
		||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
			
		||||
github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q=
 | 
			
		||||
github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 | 
			
		||||
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 | 
			
		||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
			
		||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
			
		||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
			
		||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
			
		||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
			
		||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
			
		||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
			
		||||
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
			
		||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
			
		||||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
 | 
			
		||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
			
		||||
github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
			
		||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
			
		||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
			
		||||
github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo=
 | 
			
		||||
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
 | 
			
		||||
github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ=
 | 
			
		||||
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
 | 
			
		||||
github.com/nats-io/nkeys v0.1.0 h1:qMd4+pRHgdr1nAClu+2h/2a5F2TmKcCzjCDazVgRoX4=
 | 
			
		||||
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
 | 
			
		||||
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 | 
			
		||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
 | 
			
		||||
github.com/nats-io/stan.go v0.6.0 h1:26IJPeykh88d8KVLT4jJCIxCyUBOC5/IQup8oWD/QYY=
 | 
			
		||||
github.com/nats-io/stan.go v0.6.0/go.mod h1:eIcD5bi3pqbHT/xIIvXMwvzXYElgouBvaVRftaE+eac=
 | 
			
		||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 | 
			
		||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 | 
			
		||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 | 
			
		||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
			
		||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
			
		||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
			
		||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
			
		||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
			
		||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 | 
			
		||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
			
		||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
			
		||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
			
		||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
			
		||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
			
		||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
			
		||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
			
		||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
			
		||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
			
		||||
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
 | 
			
		||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 | 
			
		||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
 | 
			
		||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
			
		||||
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
 | 
			
		||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 | 
			
		||||
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
 | 
			
		||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
			
		||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 | 
			
		||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
			
		||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 | 
			
		||||
github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E=
 | 
			
		||||
github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
			
		||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
			
		||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
			
		||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
			
		||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
 | 
			
		||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
			
		||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
			
		||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
			
		||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
			
		||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 | 
			
		||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
			
		||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
			
		||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
 | 
			
		||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
			
		||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
			
		||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
			
		||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
			
		||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
 | 
			
		||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
			
		||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
			
		||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
			
		||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
			
		||||
google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg=
 | 
			
		||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
			
		||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
 | 
			
		||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
			
		||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
			
		||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
			
		||||
							
								
								
									
										41
									
								
								service/command.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								service/command.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
package service
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var cmd = &cobra.Command{
 | 
			
		||||
	Short: "A gRPC micro service",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	caCert = "ca_cert"
 | 
			
		||||
	serverAddress = "server_address"
 | 
			
		||||
	serverCert = "server_cert"
 | 
			
		||||
	serverKey = "server_key"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	viper.AutomaticEnv()
 | 
			
		||||
	// server_address
 | 
			
		||||
	cmd.Flags().String(serverAddress, "0.0.0.0:0", "Bind address for the server. 127.0.0.1:9090 [$SERVER_ADDRESS]")
 | 
			
		||||
	viper.BindPFlag(serverAddress, cmd.Flags().Lookup(serverAddress))
 | 
			
		||||
	// ca_cert
 | 
			
		||||
	cmd.Flags().String(caCert, "", "Path to Root CA certificate [$CA_CERT]")
 | 
			
		||||
	viper.BindPFlag(caCert, cmd.Flags().Lookup(caCert))
 | 
			
		||||
	// server_cert
 | 
			
		||||
	cmd.Flags().String(serverCert, "", "Path to Server certificate [$SERVER_CERT]")
 | 
			
		||||
	viper.BindPFlag(serverCert, cmd.Flags().Lookup(serverCert))
 | 
			
		||||
	// server_key
 | 
			
		||||
	cmd.Flags().String(serverKey, "", "Path to Server key [$SERVER_KEY]")
 | 
			
		||||
	viper.BindPFlag(serverKey, cmd.Flags().Lookup(serverKey))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseFlags(o *options) *options {
 | 
			
		||||
	o.address = viper.GetString(serverAddress)
 | 
			
		||||
	o.caCert = viper.GetString(caCert)
 | 
			
		||||
	o.cert = viper.GetString(serverCert)
 | 
			
		||||
	o.key = viper.GetString(serverKey)
 | 
			
		||||
	return o
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										337
									
								
								service/options.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										337
									
								
								service/options.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,337 @@
 | 
			
		||||
package service
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"crypto/x509"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"reflect"
 | 
			
		||||
 | 
			
		||||
	"github.com/jinzhu/gorm"
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
GLOBAL OPTIONS:
 | 
			
		||||
   	--client value                  Client for go-micro; rpc [$MICRO_CLIENT]
 | 
			
		||||
   	--client_request_timeout value  Sets the client request timeout. e.g 500ms, 5s, 1m. Default: 5s [$MICRO_CLIENT_REQUEST_TIMEOUT]
 | 
			
		||||
   	--client_retries value          Sets the client retries. Default: 1 (default: 1) [$MICRO_CLIENT_RETRIES]
 | 
			
		||||
   	--client_pool_size value        Sets the client connection pool size. Default: 1 (default: 0) [$MICRO_CLIENT_POOL_SIZE]
 | 
			
		||||
   	--client_pool_ttl value         Sets the client connection pool ttl. e.g 500ms, 5s, 1m. Default: 1m [$MICRO_CLIENT_POOL_TTL]
 | 
			
		||||
   	--register_ttl value            Register TTL in seconds (default: 0) [$MICRO_REGISTER_TTL]
 | 
			
		||||
   	--register_interval value       Register interval in seconds (default: 0) [$MICRO_REGISTER_INTERVAL]
 | 
			
		||||
   	--server value                  Server for go-micro; rpc [$MICRO_SERVER]
 | 
			
		||||
   	--server_name value             Name of the server. go.micro.srv.example [$MICRO_SERVER_NAME]
 | 
			
		||||
   	--server_version value          Version of the server. 1.1.0 [$MICRO_SERVER_VERSION]
 | 
			
		||||
   	--server_id value               Id of the server. Auto-generated if not specified [$MICRO_SERVER_ID]
 | 
			
		||||
   	--server_address value          Bind address for the server. 127.0.0.1:8080 [$MICRO_SERVER_ADDRESS]
 | 
			
		||||
   	--server_advertise value        Used instead of the server_address when registering with discovery. 127.0.0.1:8080 [$MICRO_SERVER_ADVERTISE]
 | 
			
		||||
   	--server_metadata value         A list of key-value pairs defining metadata. version=1.0.0 [$MICRO_SERVER_METADATA]
 | 
			
		||||
   	--broker value                  Broker for pub/sub. http, nats, rabbitmq [$MICRO_BROKER]
 | 
			
		||||
   	--broker_address value          Comma-separated list of broker addresses [$MICRO_BROKER_ADDRESS]
 | 
			
		||||
   	--registry value                Registry for discovery. consul, mdns [$MICRO_REGISTRY]
 | 
			
		||||
   	--registry_address value        Comma-separated list of registry addresses [$MICRO_REGISTRY_ADDRESS]
 | 
			
		||||
   	--selector value                Selector used to pick nodes for querying [$MICRO_SELECTOR]
 | 
			
		||||
   	--transport value               Transport mechanism used; http [$MICRO_TRANSPORT]
 | 
			
		||||
   	--transport_address value       Comma-separated list of transport addresses [$MICRO_TRANSPORT_ADDRESS]
 | 
			
		||||
   	--db_path value                 Path to sqlite db (e.g. /data/agents.db) (default: "agents.db") [$DB_PATH]
 | 
			
		||||
   	--help, -h                      show help
 | 
			
		||||
 | 
			
		||||
   	--register_ttl            REGISTER_TTL
 | 
			
		||||
   	--register_interval       REGISTER_INTERVAL
 | 
			
		||||
   	--server_name             SERVER_NAME
 | 
			
		||||
   	--server_version          SERVER_VERSION
 | 
			
		||||
   	--server_id               SERVER_ID
 | 
			
		||||
   	--server_advertise        SERVER_ADVERTISE
 | 
			
		||||
   	--broker                  BROKER
 | 
			
		||||
   	--broker_address          BROKER_ADDRESS
 | 
			
		||||
   	--registry                REGISTRY
 | 
			
		||||
   	--registry_address        REGISTRY_ADDRESS
 | 
			
		||||
   	--selector                SELECTOR
 | 
			
		||||
   	--transport               TRANSPORT
 | 
			
		||||
   	--transport_address       TRANSPORT_ADDRESS
 | 
			
		||||
   	--db_path                 DB_PATH
 | 
			
		||||
 | 
			
		||||
	--server_address          SERVER_ADDRESS
 | 
			
		||||
   	--ca_cert				  CA_CERT
 | 
			
		||||
	--server_cert			  SERVER_CERT
 | 
			
		||||
    --server_key			  SERVER_KEY
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
type Options interface {
 | 
			
		||||
	Context() context.Context
 | 
			
		||||
	Name() string
 | 
			
		||||
	Address() string
 | 
			
		||||
	CACert() string
 | 
			
		||||
	Cert() string
 | 
			
		||||
	Key() string
 | 
			
		||||
	TLSConfig() tls.Config
 | 
			
		||||
	DB() *gorm.DB
 | 
			
		||||
	BeforeStart() []func() error
 | 
			
		||||
	AfterStart() []func() error
 | 
			
		||||
	BeforeStop() []func() error
 | 
			
		||||
	AfterStop() []func() error
 | 
			
		||||
	ServerOpts() []grpc.ServerOption
 | 
			
		||||
	ServerInterceptors() []grpc.UnaryServerInterceptor
 | 
			
		||||
	StreamServerInterceptors() []grpc.StreamServerInterceptor
 | 
			
		||||
	ClientInterceptors() []grpc.UnaryClientInterceptor
 | 
			
		||||
	StreamClientInterceptors() []grpc.StreamClientInterceptor
 | 
			
		||||
	Defaults()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewOptions() *options {
 | 
			
		||||
	return &options{
 | 
			
		||||
		ctx:     context.Background(),
 | 
			
		||||
		address: ":0",
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) Defaults() {
 | 
			
		||||
	if o.ctx == nil {
 | 
			
		||||
		o.ctx = context.Background()
 | 
			
		||||
	}
 | 
			
		||||
	if o.address == "" {
 | 
			
		||||
		o.address = "0.0.0.0:0"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Option func(*options)
 | 
			
		||||
 | 
			
		||||
func WithName(name string) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.name = name
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Context specifies a context for the service.
 | 
			
		||||
// Can be used to signal shutdown of the service.
 | 
			
		||||
// Can be used for extra option values.
 | 
			
		||||
func WithContext(ctx context.Context) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.ctx = ctx
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Address sets the address of the server
 | 
			
		||||
func WithAddress(addr string) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.address = addr
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithGRPCServerOpts(opts ...grpc.ServerOption) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.serverOpts = append(o.serverOpts, opts...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithCACert(path string) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.caCert = path
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithCert(path string) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.cert = path
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithKey(path string) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.key = path
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithDB(db *gorm.DB) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.db = db
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithTLSConfig(conf *tls.Config) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		if conf != nil {
 | 
			
		||||
			o.tlsConfig = *conf
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithBeforeStart(fn ...func() error) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.beforeStart = append(o.beforeStart, fn...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithBeforeStop(fn ...func() error) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.beforeStop = append(o.beforeStop, fn...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithAfterStart(fn ...func() error) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.afterStart = append(o.afterStart, fn...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithAfterStop(fn ...func() error) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.afterStop = append(o.afterStop, fn...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithUnaryClientInterceptor(i ...grpc.UnaryClientInterceptor) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.clientInterceptors = append(o.clientInterceptors, i...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WrapHandler adds a handler Wrapper to a list of options passed into the server
 | 
			
		||||
func WithUnaryServerInterceptor(i ...grpc.UnaryServerInterceptor) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.serverInterceptors = append(o.serverInterceptors, i...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithStreamServerInterceptor(i ...grpc.StreamServerInterceptor) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.streamServerInterceptors = append(o.streamServerInterceptors, i...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WithStreamClientInterceptor(i ...grpc.StreamClientInterceptor) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
		o.streamClientInterceptors = append(o.streamClientInterceptors, i...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WrapSubscriber adds a subscriber Wrapper to a list of options passed into the server
 | 
			
		||||
func WithSubscriberInterceptor(w ...interface{}) Option {
 | 
			
		||||
	return func(o *options) {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type options struct {
 | 
			
		||||
	ctx       context.Context
 | 
			
		||||
	name      string
 | 
			
		||||
	address   string
 | 
			
		||||
	caCert    string
 | 
			
		||||
	cert      string
 | 
			
		||||
	key       string
 | 
			
		||||
	tlsConfig tls.Config
 | 
			
		||||
	db        *gorm.DB
 | 
			
		||||
 | 
			
		||||
	beforeStart []func() error
 | 
			
		||||
	afterStart  []func() error
 | 
			
		||||
	beforeStop  []func() error
 | 
			
		||||
	afterStop   []func() error
 | 
			
		||||
 | 
			
		||||
	serverOpts []grpc.ServerOption
 | 
			
		||||
 | 
			
		||||
	serverInterceptors       []grpc.UnaryServerInterceptor
 | 
			
		||||
	streamServerInterceptors []grpc.StreamServerInterceptor
 | 
			
		||||
 | 
			
		||||
	clientInterceptors       []grpc.UnaryClientInterceptor
 | 
			
		||||
	streamClientInterceptors []grpc.StreamClientInterceptor
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) Name() string {
 | 
			
		||||
	return o.name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) Context() context.Context {
 | 
			
		||||
	return o.ctx
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) Address() string {
 | 
			
		||||
	return o.address
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) CACert() string {
 | 
			
		||||
	return o.caCert
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) Cert() string {
 | 
			
		||||
	return o.cert
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) Key() string {
 | 
			
		||||
	return o.key
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) TLSConfig() tls.Config {
 | 
			
		||||
	return o.tlsConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) DB() *gorm.DB {
 | 
			
		||||
	return o.db
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) BeforeStart() []func() error {
 | 
			
		||||
	return o.beforeStart
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) AfterStart() []func() error {
 | 
			
		||||
	return o.afterStart
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) BeforeStop() []func() error {
 | 
			
		||||
	return o.beforeStop
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) AfterStop() []func() error {
 | 
			
		||||
	return o.afterStop
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) ServerOpts() []grpc.ServerOption {
 | 
			
		||||
	return o.serverOpts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) ServerInterceptors() []grpc.UnaryServerInterceptor {
 | 
			
		||||
	return o.serverInterceptors
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) StreamServerInterceptors() []grpc.StreamServerInterceptor {
 | 
			
		||||
	return o.streamServerInterceptors
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) ClientInterceptors() []grpc.UnaryClientInterceptor {
 | 
			
		||||
	return o.clientInterceptors
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) StreamClientInterceptors() []grpc.StreamClientInterceptor {
 | 
			
		||||
	return o.streamClientInterceptors
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) parseTLSConfig() error {
 | 
			
		||||
	if o.hasTLSConfig() {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	caCert, err := ioutil.ReadFile(o.caCert)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	caCertPool := x509.NewCertPool()
 | 
			
		||||
	ok := caCertPool.AppendCertsFromPEM(caCert)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return fmt.Errorf("failed to load CA Cert from %s", o.caCert)
 | 
			
		||||
	}
 | 
			
		||||
	cert, err := tls.LoadX509KeyPair(o.cert, o.key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	o.tlsConfig = tls.Config{
 | 
			
		||||
		ClientAuth:   tls.RequireAndVerifyClientCert,
 | 
			
		||||
		ClientCAs:    caCertPool,
 | 
			
		||||
		RootCAs:      caCertPool,
 | 
			
		||||
		Certificates: []tls.Certificate{cert},
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o *options) hasTLSConfig() bool {
 | 
			
		||||
	return reflect.DeepEqual(o.tlsConfig, tls.Config{})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										148
									
								
								service/service.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								service/service.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,148 @@
 | 
			
		||||
package service
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	grpcmiddleware "github.com/grpc-ecosystem/go-grpc-middleware"
 | 
			
		||||
	"github.com/jinzhu/gorm"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Service interface {
 | 
			
		||||
	Options() Options
 | 
			
		||||
	Server() *grpc.Server
 | 
			
		||||
	DB() *gorm.DB
 | 
			
		||||
	Start() error
 | 
			
		||||
	Stop() error
 | 
			
		||||
	Close() error
 | 
			
		||||
	Cmd() *cobra.Command
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func New(opts ...Option) (Service, error) {
 | 
			
		||||
	return newService(opts...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type service struct {
 | 
			
		||||
	cmd    *cobra.Command
 | 
			
		||||
	opts   *options
 | 
			
		||||
	server *grpc.Server
 | 
			
		||||
	list   net.Listener
 | 
			
		||||
	mu     sync.Mutex
 | 
			
		||||
	running bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newService(opts ...Option) (*service, error) {
 | 
			
		||||
	cmd.ParseFlags(os.Args)
 | 
			
		||||
	s := &service{
 | 
			
		||||
		opts: parseFlags(NewOptions()),
 | 
			
		||||
		cmd:  cmd,
 | 
			
		||||
	}
 | 
			
		||||
	s.mu.Lock()
 | 
			
		||||
	defer s.mu.Unlock()
 | 
			
		||||
	for _, f := range opts {
 | 
			
		||||
		f(s.opts)
 | 
			
		||||
	}
 | 
			
		||||
	go func() {
 | 
			
		||||
		for {
 | 
			
		||||
			select {
 | 
			
		||||
			case <-s.opts.ctx.Done():
 | 
			
		||||
				s.Stop()
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	if err := s.opts.parseTLSConfig(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	cmd.Use = s.opts.name
 | 
			
		||||
	cmd.RunE = func(cmd *cobra.Command, args []string) error {
 | 
			
		||||
		if cmd.Use == "" {
 | 
			
		||||
			cmd.Use = os.Args[0]
 | 
			
		||||
		}
 | 
			
		||||
		return s.run()
 | 
			
		||||
	}
 | 
			
		||||
	gopts := []grpc.ServerOption{grpc.UnaryInterceptor(grpcmiddleware.ChainUnaryServer(s.opts.serverInterceptors...))}
 | 
			
		||||
	// TODO : check tls config and tls auth
 | 
			
		||||
	// grpc.Creds(credentials.NewTLS(&s.opts.tlsConfig))
 | 
			
		||||
	s.server = grpc.NewServer(append(gopts, s.opts.serverOpts...)...)
 | 
			
		||||
	return s, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) Options() Options {
 | 
			
		||||
	return s.opts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) DB() *gorm.DB {
 | 
			
		||||
	return s.opts.db
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) Server() *grpc.Server {
 | 
			
		||||
	return s.server
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) Cmd() *cobra.Command {
 | 
			
		||||
	return s.cmd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) run() error {
 | 
			
		||||
	s.mu.Lock()
 | 
			
		||||
	for i := range s.opts.beforeStart {
 | 
			
		||||
		if err := s.opts.beforeStart[i](); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	var err error
 | 
			
		||||
	s.running = true
 | 
			
		||||
	s.list, err = net.Listen("tcp", s.opts.address)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		s.mu.Unlock()
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	s.opts.address = s.list.Addr().String()
 | 
			
		||||
	errs := make(chan error)
 | 
			
		||||
	go func() {
 | 
			
		||||
		errs <- s.server.Serve(s.list)
 | 
			
		||||
	}()
 | 
			
		||||
	for i := range s.opts.afterStart {
 | 
			
		||||
		if err := s.opts.afterStart[i](); err != nil {
 | 
			
		||||
			s.mu.Unlock()
 | 
			
		||||
			s.Stop()
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	s.mu.Unlock()
 | 
			
		||||
	return <- errs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) Start() error {
 | 
			
		||||
	return s.cmd.Execute()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) Stop() error {
 | 
			
		||||
	s.mu.Lock()
 | 
			
		||||
	defer s.mu.Unlock()
 | 
			
		||||
	if ! s.running {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	for i := range s.opts.beforeStop {
 | 
			
		||||
		if err := s.opts.beforeStop[i](); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	s.server.GracefulStop()
 | 
			
		||||
	s.running = false
 | 
			
		||||
	for i := range s.opts.afterStop {
 | 
			
		||||
		if err := s.opts.afterStop[i](); err != nil {
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) Close() error {
 | 
			
		||||
	s.mu.Lock()
 | 
			
		||||
	defer s.mu.Unlock()
 | 
			
		||||
	return s.Stop()
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user