| 12
 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)
 }
 })
 }
 
 |