package main
import("fmt""log""net/http""github.com/gin-gonic/gin"
pb "github.com/gin-gonic/gin/examples/grpc/pb""google.golang.org/grpc")funcmain(){// Set up a connection to the server.
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())if err !=nil{
log.Fatalf("did not connect: %v", err)}defer conn.Close()
client := pb.NewGreeterClient(conn)// Set up a http server.
r := gin.Default()
r.GET("/rest/n/:name",func(c *gin.Context){
name := c.Param("name")// Contact the server and print out its response.
req :=&pb.HelloRequest{Name: name}
res, err := client.SayHello(c, req)if err !=nil{
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error(),})return}
c.JSON(http.StatusOK, gin.H{"result": fmt.Sprint(res.Message),})})// Run http serverif err := r.Run(":8052"); err !=nil{
log.Fatalf("could not run server: %v", err)}}
grpc
server.go
package main
import("log""net"
pb "github.com/gin-gonic/gin/examples/grpc/pb""golang.org/x/net/context""google.golang.org/grpc""google.golang.org/grpc/reflection")// server is used to implement helloworld.GreeterServer.type server struct{}// SayHello implements helloworld.GreeterServerfunc(s *server)SayHello(ctx context.Context, in *pb.HelloRequest)(*pb.HelloReply,error){return&pb.HelloReply{Message:"Hello "+ in.Name},nil}funcmain(){
lis, err := net.Listen("tcp",":50051")if err !=nil{
log.Fatalf("failed to listen: %v", err)}
s := grpc.NewServer()
pb.RegisterGreeterServer(s,&server{})// Register reflection service on gRPC server.
reflection.Register(s)if err := s.Serve(lis); err !=nil{
log.Fatalf("failed to serve: %v", err)}}
pb
helloworld.proto
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;}
helloworld.pb.go
// Code generated by protoc-gen-go.// source: helloworld.proto// DO NOT EDIT!/*
Package helloworld is a generated protocol buffer package.
It is generated from these files:
helloworld.proto
It has these top-level messages:
HelloRequest
HelloReply
*/package helloworld
import proto "github.com/golang/protobuf/proto"import fmt "fmt"import math "math"import(
context "golang.org/x/net/context"
grpc "google.golang.org/grpc")// 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.ProtoPackageIsVersion2 // please upgrade the proto package// The request message containing the user's name.type HelloRequest struct{
Name string`protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`}func(m *HelloRequest)Reset(){*m = HelloRequest{}}func(m *HelloRequest)String()string{return proto.CompactTextString(m)}func(*HelloRequest)ProtoMessage(){}func(*HelloRequest)Descriptor()([]byte,[]int){return fileDescriptor0,[]int{0}}// The response message containing the greetingstype HelloReply struct{
Message string`protobuf:"bytes,1,opt,name=message" json:"message,omitempty"`}func(m *HelloReply)Reset(){*m = HelloReply{}}func(m *HelloReply)String()string{return proto.CompactTextString(m)}func(*HelloReply)ProtoMessage(){}func(*HelloReply)Descriptor()([]byte,[]int){return fileDescriptor0,[]int{1}}funcinit(){
proto.RegisterType((*HelloRequest)(nil),"helloworld.HelloRequest")
proto.RegisterType((*HelloReply)(nil),"helloworld.HelloReply")}// 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
// Client API for Greeter servicetype GreeterClient interface{// Sends a greetingSayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption)(*HelloReply,error)}type greeterClient struct{
cc *grpc.ClientConn
}funcNewGreeterClient(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 := grpc.Invoke(ctx,"/helloworld.Greeter/SayHello", in, out, c.cc, opts...)if err !=nil{returnnil, err
}return out,nil}// Server API for Greeter servicetype GreeterServer interface{// Sends a greetingSayHello(context.Context,*HelloRequest)(*HelloReply,error)}funcRegisterGreeterServer(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{returnnil, 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))}returninterceptor(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",}funcinit(){ proto.RegisterFile("helloworld.proto", fileDescriptor0)}var fileDescriptor0 =[]byte{// 174 bytes of a gzipped FileDescriptorProto0x1f,0x8b,0x08,0x00,0x00,0x09,0x6e,0x88,0x02,0xff,0xe2,0x12,0xc8,0x48,0xcd,0xc9,0xc9,0x2f,0xcf,0x2f,0xca,0x49,0xd1,0x2b,0x28,0xca,0x2f,0xc9,0x17,0xe2,0x42,0x88,0x28,0x29,0x71,0xf1,0x78,0x80,0x78,0x41,0xa9,0x85,0xa5,0xa9,0xc5,0x25,0x42,0x42,0x5c,0x2c,0x79,0x89,0xb9,0xa9,0x12,0x8c,0x0a,0x8c,0x1a,0x9c,0x41,0x60,0xb6,0x92,0x1a,0x17,0x17,0x54,0x4d,0x41,0x4e,0xa5,0x90,0x04,0x17,0x7b,0x6e,0x6a,0x71,0x71,0x62,0x3a,0x4c,0x11,0x8c,0x6b,0xe4,0xc9,0xc5,0xee,0x5e,0x94,0x9a,0x5a,0x92,0x5a,0x24,0x64,0xc7,0xc5,0x11,0x9c,0x58,0x09,0xd6,0x25,0x24,0xa1,0x87,0xe4,0x02,0x64,0xcb,0xa4,0xc4,0xb0,0xc8,0x00,0xad,0x50,0x62,0x70,0x32,0xe0,0x92,0xce,0xcc,0xd7,0x4b,0x2f,0x2a,0x48,0xd6,0x4b,0xad,0x48,0xcc,0x2d,0xc8,0x49,0x2d,0x46,0x52,0xeb,0xc4,0x0f,0x56,0x1c,0x0e,0x62,0x07,0x80,0xbc,0x14,0xc0,0x98,0xc4,0x06,0xf6,0x9b,0x31,0x20,0x00,0x00,0xff,0xff,0x0f,0xb7,0xcd,0xf2,0xef,0x00,0x00,0x00,}