文章

gin在微服务架构go-micro中使用

2018-06-20 | 1 minute read |标签 golang micro-server go-micro |分类 开发

GIN在微服务架构go-micro中的使用

1.为什么引入gin

go-micro 自带的micro web 封装太过简单,有时候由于团队使用并不方便,所以整合gin与go-micro集成具有现实意义,

2.如何整合gin

得益于go-micro优秀的封装,micro在封装web handler时候,使用的是http官方包的interface,具体代码如下

func (s *service) Handle(pattern string, handler http.Handler) {
   var seen bool
   for _, ep := range s.srv.Endpoints {
      if ep.Name == pattern {
         seen = true
         break
      }
   }
   if !seen {
      s.srv.Endpoints = append(s.srv.Endpoints, &registry.Endpoint{
         Name:     pattern,
         Metadata: api.Encode(&api.Endpoint{Name: pattern, Path: []string{pattern}, Handler: api.Web}),
      })
   }

   s.mux.Handle(pattern, handler)
}

这对我们使用gin形成了方便

由于gin在封装底层时候使用的engine对象正好的是实现了http.Handler的,所以我们利用gin使用router.POST("/login", user.Login)返回值正好可以实现两个框架的整合

全部代码如下

package main

import (
   "encoding/json"
   "errors"
   "log"
   "net/http"
   "github.com/gin-gonic/gin"
   "github.com/micro/go-web"
)
type User struct{}
func (u *User) Login(c *gin.Context) {
   log.Print("Received Login API request")
   var req map[string]interface{}
   err := json.NewDecoder(c.Request.Body).Decode(&req)
   if err != nil {
      c.Error(err)
      c.JSON(http.StatusInternalServerError, gin.H{"result": false, "error": err.Error()})
      return
   }
   if req["username"] == nil {
      err := errors.New("Field username is rquired.")
      c.Error(err)
      c.JSON(http.StatusInternalServerError, gin.H{"result": false, "error": err.Error()})
      return
   }
   if req["password"] == nil {
      err := errors.New("Field password is rquired.")
      c.Error(err)
      c.JSON(http.StatusInternalServerError, gin.H{"result": false, "error": err.Error()})
      return
   }
   c.JSON(http.StatusOK, gin.H{"result": true, "data": req})
}
func main() {
   service := web.NewService(
      web.Name("go.micro.api.login"),
   )
   service.Init()
   user := new(User)
   router := gin.Default()
   router.HandleMethodNotAllowed = true
   router.NoMethod(func(c *gin.Context) {
      c.JSON(http.StatusMethodNotAllowed, gin.H{"result": false, "error": "Method Not Allowed"})
      return
   })
   router.NoRoute(func(c *gin.Context) {
      c.JSON(http.StatusNotFound, gin.H{"result": false, "error": "Endpoint Not Found"})
      return
   })
   router.POST("/login", user.Login)
   service.Handle("/", router)
   if err := service.Run(); err != nil {log.Fatal(err)}
}

以上就是完成go-micro与go-gin框架的集成