blob: afe5b6f79ec0d1e1e9d2ca91f53bf0201dbb6415 [file] [log] [blame]
// Licensed to Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Apache Software Foundation (ASF) licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package main
import (
"context"
"fmt"
"log"
nativeHTTP "net/http"
nativeGRPC "google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"github.com/go-kratos/examples/helloworld/helloworld"
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport/http"
_ "go.uber.org/automaxprocs"
_ "github.com/apache/skywalking-go"
)
var httpClient *http.Client
var gRPCClient helloworld.GreeterClient
type server struct {
helloworld.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, in *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
return &helloworld.HelloReply{Message: fmt.Sprintf("Hello %s", in.Name)}, nil
}
func consumerHandler(w nativeHTTP.ResponseWriter, r *nativeHTTP.Request) {
var resp *helloworld.HelloReply
err := httpClient.Invoke(context.Background(), "GET", "/helloworld/test", nil, &resp)
if err != nil {
log.Printf("request provider error: %v", err)
w.WriteHeader(nativeHTTP.StatusInternalServerError)
return
}
hello, err := gRPCClient.SayHello(context.Background(), &helloworld.HelloRequest{Name: "kratos"})
if err != nil {
log.Printf("request provider error: %v", err)
w.WriteHeader(nativeHTTP.StatusInternalServerError)
return
}
_, _ = w.Write([]byte(resp.Message + hello.Message))
}
func main() {
httpSvr := http.NewServer(http.Address(":8000"))
grpcSvr := grpc.NewServer(grpc.Address(":9000"))
if c, err := http.NewClient(context.Background(), http.WithEndpoint("http://localhost:8000")); err != nil {
log.Fatalf("creating HTTP client error: %v", err)
} else {
httpClient = c
}
if dial, err := grpc.Dial(context.Background(),
grpc.WithEndpoint("localhost:9000"),
grpc.WithOptions(nativeGRPC.WithTransportCredentials(insecure.NewCredentials()))); err != nil {
log.Fatalf("creating gRPC client error: %v", err)
} else {
gRPCClient = helloworld.NewGreeterClient(dial)
}
s := &server{}
helloworld.RegisterGreeterHTTPServer(httpSvr, s)
helloworld.RegisterGreeterServer(grpcSvr, s)
app := kratos.New(
kratos.Name("krago-test"),
kratos.Server(httpSvr, grpcSvr),
)
nativeHTTP.HandleFunc("/consumer", consumerHandler)
nativeHTTP.HandleFunc("/health", func(writer nativeHTTP.ResponseWriter, request *nativeHTTP.Request) {
writer.WriteHeader(nativeHTTP.StatusOK)
})
go func() {
_ = nativeHTTP.ListenAndServe(":8080", nil)
}()
if err := app.Run(); err != nil {
panic(err)
}
}