微服务框架Go-kit 01 - 基础示例

一、Go kit简介

Go kit 是一个用于构建可扩展、灵活和可维护微服务的框架和工具集合。它提供了一系列库和组件,涵盖了微服务开发的各个方面,包括服务发现、负载均衡、通信、日志记录、请求跟踪、限流、熔断等。

Go kit 构建微服务时遵循一种类似于传统三层架构的模式,这个模式通常包括以下层:

  • Service(服务):
    Service 是一个定义了特定业务逻辑的接口,它封装了应用程序的业务功能。
    在 Go kit 中,你可以创建一个或多个 Service 接口的实现,用于处理具体的业务逻辑。每个 Service 可以包含多个方法来执行不同的操作。
  • Endpoint(端点):
    Endpoint 是将外部请求转换为内部服务调用的中间件。
    在 Go kit 中,你可以使用 Endpoint 来定义和包装每个服务方法(service method)。每个端点都负责处理特定的请求,并将其转发到相应的 Service 方法。
  • Transport(传输):
    Transport 是负责处理外部请求和服务之间通信的组件。
    在 Go kit 中,你可以使用不同的传输层,如 HTTP、gRPC 或任何其他自定义传输层,来处理请求和响应的编码、解码、路由等。

在 Go kit 中,将服务的业务逻辑封装到 Service 接口的实现中,然后通过 Endpoint 将外部请求转发到相应的 Service 方法。最后,通过 Transport 处理请求和响应的传输细节。

二、搭建简单的http服务

下面演示如何使用 Go kit 快速搭建一个微服务,实现通过userId获取用户名

项目结构

go 复制代码
// 项目结构
-| Server
----| UserServer.go
-| EndPoint
----| UserEndPoint.go
-| Transport
----| UserTransport.go
- main.go
- go.mod

2.1 Server层

Server层实现业务逻辑

go 复制代码
// UserService.go 实现业务
package Service

// IUserService 用于定义业务方法的接口
type IUserService interface {
	GetName(userId int) string
}

// UserService 用于实现上面定义的接口
type UserService struct{}

// 实现上方定义的业务方法
func (s UserService) GetName(userId int) string {
	if userId == 101 {
		return "Jerry"
	}
	return "Tom"
}

2.2 EndPoint层

EndPoint层 定义 Request、Response 格式,也就是声明 接收数据和响应数据的结构体

go 复制代码
// UserEndPoint.go 定义 Request、Response 格式,也就是声明 接收数据和响应数据的结构体
package EndPoint

import (
	"context"
	"main/Service"

	"github.com/go-kit/kit/endpoint"
)

// Request 请求格式
type UserRequest struct {
	UserId int `json:"userId"`
}

// Response 响应格式
type UserResponse struct {
	Name string `json:"name"`
}

// 这里创建构造函数 GetName方法的业务处理
func GetUserEnpoint(userService Service.IUserService) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
		//通过类型断言获取请求结构体
		req, ok := request.(UserRequest)
		if !ok {
			return UserResponse{}, nil
		}

		// 这里实际上就是调用我们在Server/UserServer.go中定义的业务逻辑
		name := userService.GetName(req.UserId)
		return UserResponse{Name: name}, nil
	}
}

2.3 Transport层

Transport主要负责HTTP、gRpc、thrift等相关的逻辑。当外部请求过来时,需要对Request进行解码,对Response进行编码

go 复制代码
// Transport/UserTransport.go 主要负责HTTP、gRpc、thrift等相关的逻辑
// 当外部请求过来时,需要对Request进行解码,对Response进行编码
package Transport

import (
	"context"
	"encoding/json"
	"errors"
	"main/EndPoint"
	"net/http"
	"strconv"
)

func DecodeUserRequest(ctx context.Context, request *http.Request) (interface{}, error) {
	// 这里主要就是通过 request 拿到对应的参数构造成在 EndPoint中定义的 Request结构体即可
	if request.URL.Query().Get("userId") != "" {
		userId, _ := strconv.Atoi(request.URL.Query().Get("userId"))
		return EndPoint.UserRequest{UserId: userId}, nil
	}
	return nil, errors.New("参数错误")
}

func EncodeUserResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
	// 这里将Response返回成有效的json格式给http

	// 设置请求头信息
	w.Header().Set("Content-Type", "application/json")
	// 使用内置json包转换
	return json.NewEncoder(w).Encode(response)
}

2.4 启动服务

go 复制代码
// 服务启动
package main

import (
	"main/EndPoint"
	"main/Service"
	"main/Transport"
	"net/http"

	httpTransport "github.com/go-kit/kit/transport/http"
)

// 服务发布
func main() {
	// 1.先创建我们最开始定义的Server/UserService.go
	user := Service.UserService{}

	// 2.在用EndPoint/UserEnpoint.go 创建业务服务
	endp := EndPoint.GetUserEnpoint(user)

	// 3.使用 kit 创建 handler
	// 固定格式
	// 传入 业务服务 以及 定义的 加密解密方法
	httpHanlder := httpTransport.NewServer(endp, Transport.DecodeUserRequest, Transport.EncodeUserResponse)

	// 使用http包启动服务
	http.ListenAndServe(":8080", httpHanlder)
}

结果展示

对C++或者Golang编程技术感兴趣的朋友请点击这里:零声学院课程

相关推荐
mCell3 小时前
从 VS Code 学系统架构:回到当时,理解它为什么这样演进
架构·源码阅读·visual studio code
国科安芯8 小时前
航天电子模拟前端三大支柱:精密运放、高速运放与电压监控的协同设计方法——ASL8522S/ASL622S/ASL706S技术解析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试
listening7778 小时前
HarmonyOS 6.1 全场景开发终篇:从单设备到万物互联的实战复盘与架构思考
华为·架构·harmonyos
heimeiyingwang10 小时前
【架构实战】缓存一致性:Cache Aside与双写问题的破解
spring·缓存·架构
feiyu_gao12 小时前
别再让 AI 从零开始了
人工智能·架构·aigc
通问AI12 小时前
GPT-5.6 三模型架构深度解析:Sol/Terra/Luna 技术对比与工程落地指南
gpt·架构
QN1幻化引擎13 小时前
我写了一个「有八层意识结构」的 Python 认知引擎,它没有用任何 LLM
人工智能·算法·架构
李燚15 小时前
Eino devops 调试系统源码:GraphCompileCallback 怎么工作(第50篇-E36)
数据库·golang·agent·devops·graphql·aiagent·eino
还有多久拿退休金16 小时前
AI 写了代码,谁替你"试毒"?
前端·架构·ai编程
名字还没想好☜18 小时前
Go 内存逃逸分析:什么时候变量跑到堆上
开发语言·算法·性能优化·golang·go·内存逃逸