diff --git a/brain.go b/brain.go new file mode 100644 index 0000000..70f3a6e --- /dev/null +++ b/brain.go @@ -0,0 +1,15 @@ +package brain + +import ( + context "context" + + "github.com/474420502/brain/pb" +) + +// UnimplementedBrainServiceServer can be embedded to have forward compatible implementations. +type BrainService struct { +} + +func (*BrainService) Add(context.Context, *pb.Request) (*pb.Response, error) { + return &pb.Response{Code: 200}, nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..950e760 --- /dev/null +++ b/go.mod @@ -0,0 +1,13 @@ +module github.com/474420502/brain + +go 1.20 + +require ( + github.com/golang/protobuf v1.5.3 // indirect + golang.org/x/net v0.9.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.56.1 // indirect + google.golang.org/protobuf v1.31.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..59b7cd4 --- /dev/null +++ b/go.sum @@ -0,0 +1,21 @@ +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..c9dfb1d --- /dev/null +++ b/main_test.go @@ -0,0 +1,59 @@ +package brain + +import ( + "context" + "log" + "net" + "testing" + "time" + + "github.com/474420502/brain/pb" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" +) + +var lis *bufconn.Listener + +func init() { + lis = bufconn.Listen(1024 * 1024) + // lis, err := net.Listen("tcp", ":8090") + + s := grpc.NewServer( + grpc.MaxConcurrentStreams(100000), + grpc.MaxRecvMsgSize(10*1024*1024), + ) + + pb.RegisterBrainServiceServer(s, &BrainService{}) + + go func() { + if err := s.Serve(lis); err != nil { + log.Fatal(err) + } + }() +} + +func bufDialer(ctx context.Context, address string) (net.Conn, error) { + return lis.Dial() +} + +// go:generator protoc --go_out=plugins=grpc:./ ./protos/brain.proto +func TestCase(t *testing.T) { + + time.Sleep(time.Second) + + conn, err := grpc.DialContext(context.TODO(), lis.Addr().String(), grpc.WithContextDialer(bufDialer), grpc.WithInsecure()) + if err != nil { + panic(err) + } + + // 创建客户端 + client := pb.NewBrainServiceClient(conn) + + // 调用服务 + resp, err := client.Add(context.TODO(), &pb.Request{}) + if err != nil { + panic(err) + } + + log.Println(resp) +} diff --git a/pb/brain.pb.go b/pb/brain.pb.go new file mode 100644 index 0000000..ad8abbd --- /dev/null +++ b/pb/brain.pb.go @@ -0,0 +1,315 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc v3.6.1 +// source: protos/brain.proto + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Message defines the request/response structure. +type Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Case int32 `protobuf:"varint,1,opt,name=Case,proto3" json:"Case,omitempty"` + Data string `protobuf:"bytes,2,opt,name=Data,proto3" json:"Data,omitempty"` +} + +func (x *Request) Reset() { + *x = Request{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_brain_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request) ProtoMessage() {} + +func (x *Request) ProtoReflect() protoreflect.Message { + mi := &file_protos_brain_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request.ProtoReflect.Descriptor instead. +func (*Request) Descriptor() ([]byte, []int) { + return file_protos_brain_proto_rawDescGZIP(), []int{0} +} + +func (x *Request) GetCase() int32 { + if x != nil { + return x.Case + } + return 0 +} + +func (x *Request) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +// Message defines the request/response structure. +type Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code int32 `protobuf:"varint,1,opt,name=Code,proto3" json:"Code,omitempty"` + Data string `protobuf:"bytes,2,opt,name=Data,proto3" json:"Data,omitempty"` +} + +func (x *Response) Reset() { + *x = Response{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_brain_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_protos_brain_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_protos_brain_proto_rawDescGZIP(), []int{1} +} + +func (x *Response) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *Response) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +var File_protos_brain_proto protoreflect.FileDescriptor + +var file_protos_brain_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x31, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x43, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x32, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x32, + 0x30, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x20, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x42, 0x09, 0x48, 0x01, 0x5a, 0x05, 0x2e, 0x2f, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_brain_proto_rawDescOnce sync.Once + file_protos_brain_proto_rawDescData = file_protos_brain_proto_rawDesc +) + +func file_protos_brain_proto_rawDescGZIP() []byte { + file_protos_brain_proto_rawDescOnce.Do(func() { + file_protos_brain_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_brain_proto_rawDescData) + }) + return file_protos_brain_proto_rawDescData +} + +var file_protos_brain_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_brain_proto_goTypes = []interface{}{ + (*Request)(nil), // 0: pb.Request + (*Response)(nil), // 1: pb.Response +} +var file_protos_brain_proto_depIdxs = []int32{ + 0, // 0: pb.BrainService.Add:input_type -> pb.Request + 1, // 1: pb.BrainService.Add:output_type -> pb.Response + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_protos_brain_proto_init() } +func file_protos_brain_proto_init() { + if File_protos_brain_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_brain_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_brain_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_brain_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_brain_proto_goTypes, + DependencyIndexes: file_protos_brain_proto_depIdxs, + MessageInfos: file_protos_brain_proto_msgTypes, + }.Build() + File_protos_brain_proto = out.File + file_protos_brain_proto_rawDesc = nil + file_protos_brain_proto_goTypes = nil + file_protos_brain_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// 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.SupportPackageIsVersion6 + +// BrainServiceClient is the client API for BrainService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type BrainServiceClient interface { + // SayHello returns a greeting for the given name. + Add(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) +} + +type brainServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewBrainServiceClient(cc grpc.ClientConnInterface) BrainServiceClient { + return &brainServiceClient{cc} +} + +func (c *brainServiceClient) Add(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) { + out := new(Response) + err := c.cc.Invoke(ctx, "/pb.BrainService/Add", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BrainServiceServer is the server API for BrainService service. +type BrainServiceServer interface { + // SayHello returns a greeting for the given name. + Add(context.Context, *Request) (*Response, error) +} + +// UnimplementedBrainServiceServer can be embedded to have forward compatible implementations. +type UnimplementedBrainServiceServer struct { +} + +func (*UnimplementedBrainServiceServer) Add(context.Context, *Request) (*Response, error) { + return nil, status.Errorf(codes.Unimplemented, "method Add not implemented") +} + +func RegisterBrainServiceServer(s *grpc.Server, srv BrainServiceServer) { + s.RegisterService(&_BrainService_serviceDesc, srv) +} + +func _BrainService_Add_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Request) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BrainServiceServer).Add(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BrainService/Add", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BrainServiceServer).Add(ctx, req.(*Request)) + } + return interceptor(ctx, in, info, handler) +} + +var _BrainService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "pb.BrainService", + HandlerType: (*BrainServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Add", + Handler: _BrainService_Add_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/brain.proto", +} diff --git a/protos/brain.proto b/protos/brain.proto new file mode 100644 index 0000000..332e230 --- /dev/null +++ b/protos/brain.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; + +package pb; +option go_package = "./;pb"; + +// Message defines the request/response structure. +message Request { + int32 Case = 1; + string Data = 2; +} + +// Message defines the request/response structure. +message Response { + int32 Code = 1; + string Data = 2; +} + +// Service defines the available RPCs. +service BrainService { + // SayHello returns a greeting for the given name. + rpc Add (Request) returns (Response); +} + +option optimize_for = SPEED; + \ No newline at end of file