一、简介我们在上一篇文章《GolangMicroserviceToolkitGokit》中介绍了Go语言工具包Gokit,本文介绍如何基于Gokit开发Web项目.看了上一篇,我们已经知道Gokit的服务分为三层,分别是transport、endpoint和service。其中,服务层定义业务接口并实现接口方法。端点层接收请求参数并返回响应结果。需要注意的是,在端点层,endpoint.Endpoint是为业务接口方法构造的。因为endpoint.Endpoint是函数类型,所以封装了一层,方便我们使用endpoint装饰器给endpoint.Endpoint添加功能,比如日志记录,限流,负载均衡,链路跟踪等。端点层使用内置的endpoint.Endpoint调用服务层接口的方法来处理请求。传输层提供对外调用接口(http或rpc)。2、基于Gokit开发一个Web项目我们基于Gokit开发一个用户中心项目,主要包括注册和登录功能。目录结构如下:.├──endpoint#接收请求,构建端点。Endpoint调用服务层的接口方法,处理请求参数,返回响应结果给传输层│└──user.go├──go.mod├──go.sum├──main.go├──service#定义业务接口并实现接口方法│└──user.go└──transport#提供对外调用接口(httporrpc)└──http.goservice包定义服务的接口(用户服务)和实现接口方法。...typeIUserinterface{Register(ctxcontext.Context,req*RegisterRequest)(*User,error)Login(ctxcontext.Context,email,passwordstring)(*User,error)}...端点包是接口该方法构造endpoint.Endpoint,将请求参数转换成接口方法可以处理的参数,并将返回的响应结果封装成相应的响应结构返回给传输包。...typeRegisterRequeststruct{UserNamestringEmailstringPasswordstring}typeRegisterResponsestruct{User*service.User}funcMakeRegisterEndpoint(iUserservice.IUser)endpoint.Endpoint{returnfunc(ctxcontext.Context,requestinterface{})(responseinterface{},errerror){req:=request.(*RegisterRequest)user,err:=iUser.Register(ctx,&service.RegisterRequest{用户名:req.UserName,电子邮件:req.Email,密码:req.Password,})return&RegisterResponse{User:user},err}}...传输包将构造好的endpoint.Endpoint提供给调用者。...funcNewHttpHandler(ctxcontext.Context,endpoints*endpoint.Endpoints)http.Handler{r:=http.NewServeMux()r.Handle("/register",kitHttp.NewServer(endpoints.RegisterEndpoint,decRegisterRequest,encResponse))returnr}...在main函数中,创建服务、端点和传输,并启动web服务器。funcmain(){ctx:=context.Background()userService:=service.NewUserService()endpoints:=&endpoint.Endpoints{RegisterEndpoint:endpoint.MakeRegisterEndpoint(userService),LoginEndpoint:endpoint.MakeLoginEndpoint(userService),}r:=transport.NewHttpHandler(ctx,endpoints)err:=http.ListenAndServe(":8080",r)iferr!=nil{log.Fatal(err)return}}使用gorun命令启动,使用cURL调用http接口。gorunmain.gocurl-XPOSThttp://localhost:8080/register\-d'email=gopher@88.com&password=123456&username=gopher'3.小结本文以一个简单的用户中心项目来介绍如何tokit开发网络项目。为了让读者更容易理解代码,项目代码中没有使用其他组件。有兴趣的读者可以尝试对其进行改进,比如添加操作数据库的代码。
