Created
August 3, 2020 10:54
-
-
Save alibo/3495b4c57dddc1f825a35d698591388e to your computer and use it in GitHub Desktop.
GRPC HTTP2+TLS Helloworld example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Code generated by protoc-gen-go. DO NOT EDIT. | |
// versions: | |
// protoc-gen-go v1.23.0 | |
// protoc v3.12.4 | |
// source: helloworld.proto | |
package main | |
import ( | |
context "context" | |
proto "github.com/golang/protobuf/proto" | |
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) | |
) | |
// This is a compile-time assertion that a sufficiently up-to-date version | |
// of the legacy proto package is being used. | |
const _ = proto.ProtoPackageIsVersion4 | |
// The request message containing the user's name. | |
type HelloRequest struct { | |
state protoimpl.MessageState | |
sizeCache protoimpl.SizeCache | |
unknownFields protoimpl.UnknownFields | |
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` | |
} | |
func (x *HelloRequest) Reset() { | |
*x = HelloRequest{} | |
if protoimpl.UnsafeEnabled { | |
mi := &file_helloworld_proto_msgTypes[0] | |
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
ms.StoreMessageInfo(mi) | |
} | |
} | |
func (x *HelloRequest) String() string { | |
return protoimpl.X.MessageStringOf(x) | |
} | |
func (*HelloRequest) ProtoMessage() {} | |
func (x *HelloRequest) ProtoReflect() protoreflect.Message { | |
mi := &file_helloworld_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 HelloRequest.ProtoReflect.Descriptor instead. | |
func (*HelloRequest) Descriptor() ([]byte, []int) { | |
return file_helloworld_proto_rawDescGZIP(), []int{0} | |
} | |
func (x *HelloRequest) GetName() string { | |
if x != nil { | |
return x.Name | |
} | |
return "" | |
} | |
// The response message containing the greetings | |
type HelloReply struct { | |
state protoimpl.MessageState | |
sizeCache protoimpl.SizeCache | |
unknownFields protoimpl.UnknownFields | |
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` | |
} | |
func (x *HelloReply) Reset() { | |
*x = HelloReply{} | |
if protoimpl.UnsafeEnabled { | |
mi := &file_helloworld_proto_msgTypes[1] | |
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
ms.StoreMessageInfo(mi) | |
} | |
} | |
func (x *HelloReply) String() string { | |
return protoimpl.X.MessageStringOf(x) | |
} | |
func (*HelloReply) ProtoMessage() {} | |
func (x *HelloReply) ProtoReflect() protoreflect.Message { | |
mi := &file_helloworld_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 HelloReply.ProtoReflect.Descriptor instead. | |
func (*HelloReply) Descriptor() ([]byte, []int) { | |
return file_helloworld_proto_rawDescGZIP(), []int{1} | |
} | |
func (x *HelloReply) GetMessage() string { | |
if x != nil { | |
return x.Message | |
} | |
return "" | |
} | |
var File_helloworld_proto protoreflect.FileDescriptor | |
var file_helloworld_proto_rawDesc = []byte{ | |
0x0a, 0x10, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x70, 0x72, 0x6f, | |
0x74, 0x6f, 0x12, 0x0a, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x22, 0x22, | |
0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, | |
0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, | |
0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, | |
0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, | |
0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x49, 0x0a, 0x07, 0x47, 0x72, | |
0x65, 0x65, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, | |
0x6f, 0x12, 0x18, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, | |
0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x68, 0x65, | |
0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, | |
0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x30, 0x0a, 0x1b, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, | |
0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, | |
0x6f, 0x72, 0x6c, 0x64, 0x42, 0x0f, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, | |
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | |
} | |
var ( | |
file_helloworld_proto_rawDescOnce sync.Once | |
file_helloworld_proto_rawDescData = file_helloworld_proto_rawDesc | |
) | |
func file_helloworld_proto_rawDescGZIP() []byte { | |
file_helloworld_proto_rawDescOnce.Do(func() { | |
file_helloworld_proto_rawDescData = protoimpl.X.CompressGZIP(file_helloworld_proto_rawDescData) | |
}) | |
return file_helloworld_proto_rawDescData | |
} | |
var file_helloworld_proto_msgTypes = make([]protoimpl.MessageInfo, 2) | |
var file_helloworld_proto_goTypes = []interface{}{ | |
(*HelloRequest)(nil), // 0: helloworld.HelloRequest | |
(*HelloReply)(nil), // 1: helloworld.HelloReply | |
} | |
var file_helloworld_proto_depIdxs = []int32{ | |
0, // 0: helloworld.Greeter.SayHello:input_type -> helloworld.HelloRequest | |
1, // 1: helloworld.Greeter.SayHello:output_type -> helloworld.HelloReply | |
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_helloworld_proto_init() } | |
func file_helloworld_proto_init() { | |
if File_helloworld_proto != nil { | |
return | |
} | |
if !protoimpl.UnsafeEnabled { | |
file_helloworld_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { | |
switch v := v.(*HelloRequest); i { | |
case 0: | |
return &v.state | |
case 1: | |
return &v.sizeCache | |
case 2: | |
return &v.unknownFields | |
default: | |
return nil | |
} | |
} | |
file_helloworld_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { | |
switch v := v.(*HelloReply); 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_helloworld_proto_rawDesc, | |
NumEnums: 0, | |
NumMessages: 2, | |
NumExtensions: 0, | |
NumServices: 1, | |
}, | |
GoTypes: file_helloworld_proto_goTypes, | |
DependencyIndexes: file_helloworld_proto_depIdxs, | |
MessageInfos: file_helloworld_proto_msgTypes, | |
}.Build() | |
File_helloworld_proto = out.File | |
file_helloworld_proto_rawDesc = nil | |
file_helloworld_proto_goTypes = nil | |
file_helloworld_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 | |
// 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 { | |
// Sends a greeting | |
SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) | |
} | |
type greeterClient struct { | |
cc grpc.ClientConnInterface | |
} | |
func NewGreeterClient(cc grpc.ClientConnInterface) 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 | |
} | |
// GreeterServer is the server API for Greeter service. | |
type GreeterServer interface { | |
// Sends a greeting | |
SayHello(context.Context, *HelloRequest) (*HelloReply, error) | |
} | |
// UnimplementedGreeterServer can be embedded to have forward compatible implementations. | |
type UnimplementedGreeterServer struct { | |
} | |
func (*UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) { | |
return nil, status.Errorf(codes.Unimplemented, "method SayHello 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) | |
} | |
var _Greeter_serviceDesc = grpc.ServiceDesc{ | |
ServiceName: "helloworld.Greeter", | |
HandlerType: (*GreeterServer)(nil), | |
Methods: []grpc.MethodDesc{ | |
{ | |
MethodName: "SayHello", | |
Handler: _Greeter_SayHello_Handler, | |
}, | |
}, | |
Streams: []grpc.StreamDesc{}, | |
Metadata: "helloworld.proto", | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// based on https://github.com/grpc/grpc-go/tree/master/examples/helloworld | |
syntax = "proto3"; | |
option java_multiple_files = true; | |
option java_package = "io.grpc.examples.helloworld"; | |
option java_outer_classname = "HelloWorldProto"; | |
package helloworld; | |
// The greeting service definition. | |
service Greeter { | |
// Sends a greeting | |
rpc SayHello (HelloRequest) returns (HelloReply) {} | |
} | |
// The request message containing the user's name. | |
message HelloRequest { | |
string name = 1; | |
} | |
// The response message containing the greetings | |
message HelloReply { | |
string message = 1; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// based on https://github.com/grpc/grpc-go/tree/master/examples/helloworld | |
package main | |
import ( | |
"context" | |
"flag" | |
"log" | |
"net" | |
"google.golang.org/grpc" | |
"google.golang.org/grpc/credentials" | |
) | |
var keyPath string | |
var crtPath string | |
var port string | |
func init() { | |
flag.StringVar(&keyPath, "tls-key", "server.key", "Path of TLS private key") | |
flag.StringVar(&crtPath, "tls-crt", "server.crt", "Path of TLS certificate / public key") | |
flag.StringVar(&port, "port", ":8000", "Listening port") | |
flag.Parse() | |
} | |
type server struct{} | |
func (s *server) SayHello(ctx context.Context, in *HelloRequest) (*HelloReply, error) { | |
log.Printf("Received: %v", in.Name) | |
return &HelloReply{Message: "Hello " + in.Name}, nil | |
} | |
func main() { | |
log.Printf("Using cert '%s' and key '%s'\n", crtPath, keyPath) | |
creds, _ := credentials.NewServerTLSFromFile(crtPath, keyPath) | |
lis, err := net.Listen("tcp", port) | |
if err != nil { | |
log.Fatalf("failed to listen: %v", err) | |
} | |
s := grpc.NewServer(grpc.Creds(creds)) | |
RegisterGreeterServer(s, &server{}) | |
log.Printf("Listening on port %s\n", port) | |
if err := s.Serve(lis); err != nil { | |
log.Fatalf("failed to serve: %v", err) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Docker image: https://hub.docker.com/r/alibo/grpc-http2-helloworld