go-kit golang下的微服务模式

news/2025/1/15 18:55:56/

go-kit是什么?

gokit是构建golang微服务的工具集,能够帮助我们构建基础的、可靠的、可扩展的微服务,使用go语言实现的。

架构设计

gk使用分层模式,如果你是从PHP、Ruby、Django等语言过渡到go语言,那么经典的MVC分层肯定很熟悉,gk的也分为三层:

1.Transport层 (传输)

2.Endpoint层 (终点)

3.Service层 (逻辑服务)

请求从1->3, 响应从3->1

Transports 层

transport 域会绑定到具体的传输协议上,例如:HTTP或者gRPC; 总而言之,微服务可能会支持多种传输协议;这是非常重要且强力的,可以在一个简单的微服务中支持HTTP API和 RPC service。

当实现一个Restful HTTP API时,路由定义在httptransport中. 设置的路由代码如下:


userRegisterHandler := httptransport.NewServer(selfendpoint.MakeUserRegisterHandler(s),decodeUserRegisterRequest,encodeUserRegisterResponse,opt...,)r := mux.NewRouter()r.Handle("/user/register", userRegisterHandler).Methods("POST")

Endpoints 层

endpoint 就像controller中的action/handler;该层是处理request和response的地方;如果你实现了两种transport (http/grpc), 那么两个方法会发送请求到相同的endpoint。代码会如下


// UserRegisterRequest 用户注册请求
type UserRegisterRequest struct {Email           stringFirstName       stringLastName        stringPassword        stringConfirmPassword string
}// UserRegisterResponse 用户注册响应
type UserRegisterResponse struct {UID usermodel.UID `json:"uid,omitempty"`Err error         `json:"err,omitempty"`
}func MakeUserRegisterHandler(service user.UserService) endpoint.Endpoint {return func(ctx context.Context, request interface{}) (response interface{}, err error) {req := request.(UserRegisterRequest)uid, err := service.Register(gin.Context{}, req.Email, req.FirstName, req.LastName, req.Password, req.ConfirmPassword)return UserRegisterResponse{uid, err}, nil}
}

Services层

service 层是所有业务逻辑实现的地方. service经常将多个endpoints粘合在一起.service 经常被声明为interface,为了实现业务逻辑去实现interface下的方法,可以采用六边形设计模式(Hexagonal Architecture). 业务逻辑不会关心endpoint或者特殊的transport域:services不应该知道任何关于http headers 或者 grpc error codes。代码块如下:


type UserService interface {Register(ctx gin.Context, email string, firstname string, lastname string, password string, confirmpassword string) (models.UID, error)
}


Middlewares 中间件

gk 使用严格的分层,所以使用中间件模式来添加注入例如日志、请求频率、负载均衡、分布式tracing. 在endpoint和service层可以使用中间件。

设计

上图是官网摘录的,可以看到该图像个洋葱一样,有很多层。

所有的层可以归纳到3个域中:最里面的service域,中间的endpoint域,和最外层的transport域

为了实现business logic,我们在service层定义interface,并且提供一个实现logic.go


type UserLogic struct {repo UserRepository
}var (ErrParamsEmpty       = errors.New("request params empty")ErrUserAlreadyExists = errors.New("user already exists")ErrConfirmPassword   = errors.New("confirm password conflict")
)func NewUserLogic(repo UserRepository) UserService {return &UserLogic{repo: repo,}
}func (u *UserLogic) Register(ctx gin.Context, email string, firstname string, lastname string, password string, confirmpassword string) (uid models.UID, err error) {if email == "" || firstname == "" || lastname == "" || password == "" || confirmpassword == "" {return uid, ErrParamsEmpty}// 查找用户是否存在,存在则报错existUser, err := u.repo.FindByEmail(email)if existUser != nil || err != nil {return uid, ErrUserAlreadyExists}if password != confirmpassword {return uid, ErrConfirmPassword}return u.repo.Create(ctx)
}

我们可以在logic中注入middleware. 简而言之,gk严格的分层可以通过middleware来注入。

 


http://www.ppmy.cn/news/284272.html

相关文章

使用 Go、gRPC 和 Kubernetes 构建微服务

本文旨在简单介绍如何使用 gRPC 在 Go 中构建微服务,并将它们部署到 Kubernetes 集群。它展示了如何设置两个容器化、可扩展的服务,使用请求/响应机制相互通信。 一个微服务将负责计算两个整数的最大公约数 (GCD),做为…

AVP 6目GoPro全景拼接

from:http://mt.sohu.com/20160810/n463563619.shtml 自从VR圈内人开通以来,每天都有很多读者小伙伴在后台咨询VR相关问题,为此观察君采访了包括HTC、三星、暴风魔镜、大朋、诺亦腾、派华、米多、青瞳等VR行业内各领域顶尖公司,以及北大、清华…

Docker部署go语言web服务器

一.准备 1.win10环境 2.下载建议迅雷 二.安装docker 1.右击开始->应用与功能->启用Hyper-V和容器功能 2.安装docker 官方地址:下载docker 安装后打开docker,在命令行输入 docker version查看client和server信息 3.安装mingw使用make 下载地…

SpringBoot微服务搭建 Nacos/GateWay 鱼无水

目录 一、创建Maven父子项目 二、搭建Gateway网关服务 三、按照项目架构搭建其他服务 四、集成MyBatisPlus 五、代码生成器 一、创建Maven父子项目 父项目导入依赖 1.SpringBoot依赖 <parent><groupId> org.springframework.boot</groupId><artifac…

go微服务系列(四):微服务docker容器化部署和kubernetes编排

文章目录 Docker 简介Docker 部署 user 服务Kubernetes 简介Kubernetes 部署 user 服务 本章节大量涉及一些docker和kubernetes非常基础的知识&#xff0c;有些啰嗦&#xff0c;实际上&#xff0c;学go微服务开发&#xff0c;一般都是对这些容器编排和容器引擎技术很熟悉&#…

(11)go-micro微服务雪花算法

文章目录 一 雪花算法介绍二 雪花算法优缺点三 雪花算法实现四 最后 一 雪花算法介绍 雪花算法是推特开源的分布式ID生成算法&#xff0c;用于在不同的机器上生成唯一的ID的算法。 该算法生成一个64bit的数字作为分布式ID&#xff0c;保证这个ID自增并且全局唯一。 1.第一位占…

Go:微服务架构下的单元测试(基于 Ginkgo、gomock 、Gomega)

文章目录 简介一、Ginkgo包的引入和简单介绍二、Dockertest 使用三、编写单元测试1. 编写 data 层的测试代码 四、引入 gomock 包&#xff0c;mock 对象模拟依赖项1. 编写生成 mock 文件方法2. 编写 biz 层的测试方法3. 验证单元测试 小结 简介 本文主要使用 Ginkgo[2] 、gomo…

Go:十大主流微服务框架

1.Istio&#xff08;31.7K&#xff09; 项目简介&#xff1a;Istio是由Google、IBM和Lyft开源的微服务管理、保护和监控框架。使用istio可以很简单的创建具有负载均衡、服务间认证、监控等功能的服务网络&#xff0c;而不需要对服务的代码进行任何修改。 仓库地址&#xff1a…