以下是一个简单的使用 go-kit apigateway 构建微服务应用的案例:
首先,我们创建一个名为 “hello” 的微服务应用,其实现了一个简单的字符串拼接功能。代码如下:
package main
import (
"context"
"errors"
"github.com/go-kit/kit/endpoint"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
httptransport "github.com/go-kit/kit/transport/http"
)
func main() {
logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
level.Info(logger).Log("msg", "hello")
ctx := context.Background()
svc := helloService{}
helloHandler := httptransport.NewServer(
makeHelloEndpoint(svc),
decodeHelloRequest,
encodeResponse,
)
http.Handle("/hello", helloHandler)
err := http.ListenAndServe(":8080", nil)
if err != nil {
level.Error(logger).Log("err", err)
os.Exit(1)
}
}
type helloService struct{}
func (s *helloService) Hello(ctx context.Context, name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
return "Hello, " + name + "!", nil
}
type helloRequest struct {
Name string `json:"name"`
}
type helloResponse struct {
Message string `json:"message"`
}
func makeHelloEndpoint(svc helloService) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(helloRequest)
msg, err := svc.Hello(ctx, req.Name)
if err != nil {
return nil, err
}
return helloResponse{Message: msg}, nil
}
}
func decodeHelloRequest(_ context.Context, r *http.Request) (interface{}, error) {
var request helloRequest
err := json.NewDecoder(r.Body).Decode(&request)
if err != nil {
return nil, err
}
return request, nil
}
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
return json.NewEncoder(w).Encode(response)
}
在上面的代码中,我们定义了一个名为 “hello” 的微服务应用,并实现了其中的 Hello 方法。这个方法接收一个名字参数,返回一个字符串拼接的结果。
接下来,我们使用 go-kit apigateway 构建该应用的 API 网关。代码如下:
package main
import (
"context"
"encoding/json"
"net/http"
"os"
"github.com/go-kit/kit/endpoint"
httptransport "github.com/go-kit/kit/transport/http"
gkagw "github.com/codemicro/go-kit-api-gateway"
)
func main() {
ctx := context.Background()
svc := helloService{}
helloEndpoint := makeHelloEndpoint(svc)
helloHandler := gkagw.NewHTTPHandler(
helloEndpoint,
decodeHelloRequest,
encodeResponse,
)
http.Handle("/hello", helloHandler)
err := http.ListenAndServe(":8080", nil)
if err != nil {
os.Exit(1)
}
}
type helloService struct{}
func (s *helloService) Hello(ctx context.Context, name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
return "Hello, " + name + "!", nil
}
type helloRequest struct {
Name string `json:"name"`
}
type helloResponse struct {
Message string `json:"message"`
}
func makeHelloEndpoint(svc helloService) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (interface{}, error) {
req := request.(helloRequest)
msg, err := svc.Hello(ctx, req.Name)
if err != nil {
return nil, err
}
return helloResponse{Message: msg}, nil
}
}
func decodeHelloRequest(_ context.Context, r *http.Request) (interface{}, error) {
var request helloRequest
err := json.NewDecoder(r.Body).Decode(&request)
if err != nil {
return nil, err
}
return request, nil
}
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
return json.NewEncoder(w).Encode(response)
}
在上面的代码中,我们使用了 go-kit apigateway 提供的 NewHTTPHandler 函数来创建一个 HTTP 处理器。这个处理器可以将请求转发到后端微服务,并将其响应返回给客户端。
现在,我们可以通过访问 “http://localhost:8080/hello?name=world” 来测试该 API 网关。它会将请求转发给名为 “hello” 的微服务应用,并返回 “Hello, world!” 的字符串拼接结果。




