1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| func main() { endPoint := "localhost:9000" listen, err := net.Listen("tcp", endPoint) if err != nil { fmt.Printf("tcp listen err:%v\n", err) return }
opts := make([]grpc.ServerOption, 0) creds, err := credentials.NewServerTLSFromFile("./keys/server.pem", "./keys/server.key") if err != nil { fmt.Printf("failed to generate credentials err:%v\n", err) return } opts = append(opts, grpc.Creds(creds)) opts = append(opts, grpc.UnaryInterceptor(interceptor.Interceptor)) server := grpc.NewServer(opts...) protobuf.RegisterHelloServiceServer(server, &service.HelloService)
gwOpts := make([]grpc.DialOption, 0) gwCreds, err := credentials.NewClientTLSFromFile("./keys/server.pem", "www.zhouxuwen.com") if err != nil { fmt.Printf("failed to generate credentials err:%v\n", err) return } gwOpts = append(gwOpts, grpc.WithTransportCredentials(gwCreds)) gwOpts = append(gwOpts, grpc.WithPerRPCCredentials(&interceptor.AuthCredential)) gwOpts = append(gwOpts, grpc.WithUnaryInterceptor(interceptor.ClientInterceptor))
gwmux := runtime.NewServeMux() err = protobuf.RegisterHelloServiceHandlerFromEndpoint(context.Background(), gwmux, endPoint, gwOpts) if err != nil { fmt.Printf("register http gateway server fail. err: %v\n", err) return }
mux := http.NewServeMux() mux.Handle("/", gwmux) tlsConfig, err := getTLSConfig() if err != nil { fmt.Printf("get tls config err :%v\n", err) return } srv := &http.Server{ Addr: endPoint, Handler: grpcHandlerFunc(server, mux), TLSConfig: tlsConfig, }
fmt.Printf("gRPC and http listen at :%v\n", endPoint) err = srv.Serve(tls.NewListener(listen, tlsConfig)) if err != nil { fmt.Printf("%v\n", errors.New(fmt.Sprintf("failed to serve: %v", err))) } }
func getTLSConfig() (*tls.Config, error) { cert, _ := ioutil.ReadFile("./keys/server.pem") key, _ := ioutil.ReadFile("./keys/server.key") var demoKeyPair *tls.Certificate pair, err := tls.X509KeyPair(cert, key) if err != nil { fmt.Printf("TLS KeyPair err: %v\n", err) return nil, err } demoKeyPair = &pair return &tls.Config{ Certificates: []tls.Certificate{*demoKeyPair}, NextProtos: []string{http2.NextProtoTLS}, }, nil }
func grpcHandlerFunc(grpcServer *grpc.Server, otherHandler http.Handler) http.Handler { if otherHandler == nil { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { grpcServer.ServeHTTP(w, r) }) } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") { grpcServer.ServeHTTP(w, r) } else { otherHandler.ServeHTTP(w, r) } }) }
|