使用Golang和MongoDB构建微服务

https://juejin.im/post/5b4740a06fb9a04f89781fcf

使用Golang和MongoDB构建微服务





根据 umermansoor githubPython版本的微服务改造成 Golang版本
一共有4个微服务

  • Movie Service: 是关于电影的基本信息,标题、评分等
  • ShowTimes Service: 关于电影上映时间的信息
  • Booking Service: 关于电影的订阅的信息
  • User Service: 用户的信息

源码 Github

要求

API和文档

各个服务之间相互独立,单独的路由和单独的数据库,各个服务之间的通信是通过 HTTP JSON,每个服务的API的返回结果也是JSON类型,可以参考 使用Golang和MongoDB构建 RESTful API,提取出各个服务之间共同的东西,独立于服务之外,供服务调用

  • 返回的结果封装

helper/utils.go

  1. func ResponseWithJson(w http.ResponseWriter, code int, payload interface{}) {
  2. response, _ := json.Marshal(payload)
  3. w.Header().Set("Content-Type", "application/json")
  4. w.WriteHeader(code)
  5. w.Write(response)
  6. }
  • 基础数据 Entity

models/models.go

  1. type User struct {
  2. Id string `bson:"_id" json:"id"`
  3. Name string `bson:"name" json:"name"`
  4. }
  5. type Movie struct {
  6. Id string `bson:"_id" json:"id"`
  7. Title string `bson:"title" json:"title"`
  8. Rating float32 `bson:"rating" json:"rating"`
  9. Director string `bson:"director" json:"director"`
  10. }
  11. type ShowTimes struct {
  12. Id string `bson:"_id" json:"id"`
  13. Date string `bson:"date" json:"date"`
  14. Movies []string `bson:"movies" json:"movies"`
  15. }
  16. type Booking struct {
  17. Id string `bson:"_id" json:"id"`
  18. Name string `bson:"name" json:"name"`
  19. Books []BookInfo `bson:"books" json:"books"`
  20. }
  21. type BookInfo struct {
  22. Date string `bson:"date" json:"date"`
  23. Movies []string `bson:"movies" json:"movies"`
  24. }
  25. type Result struct {
  26. Name string `json:"name"`
  27. Books []ResultInfo `json:"books"`
  28. }
  29. type ResultInfo struct {
  30. Date string `json:"date"`
  31. Movies []Movie `json:"movies"`
  32. }
  • 关于数据库的封装

dao/db.go,具体的请参考 对 mgo关于MongoDB的基础操作的封装

  1. func Insert(db, collection string, docs ...interface{}) error {
  2. ms, c := connect(db, collection)
  3. defer ms.Close()
  4. return c.Insert(docs...)
  5. }
  6. func FindOne(db, collection string, query, selector, result interface{}) error {
  7. ms, c := connect(db, collection)
  8. defer ms.Close()
  9. return c.Find(query).Select(selector).One(result)
  10. }
  11. ...

服务

各个服务具体的逻辑具体的参考 使用Golang和MongoDB构建 RESTful API

  • User Service(port 8000)
  • Movie Service(port 8001)
  • ShowTimes Service(port 8002)
  • Booking Service(port 8003)

服务通信

查询某个用户的订阅的电影信息时,需要先通过 User Service 服务查询这个用户,根据用户名通过 Booking Service查询用户的订阅信息,然后通过 Movie Service服务查询对应的电影的信息,都是通过 HTTP 通信

  1. params := mux.Vars(r)
  2. name := params["name"]
  3. var user models.User
  4. if err := dao.FindOne(db, collection, bson.M{"_id": name}, nil, &user); err != nil {
  5. helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request")
  6. return
  7. }
  8. res, err := http.Get("http://127.0.0.1:8003/booking/" + name)
  9. if err != nil {
  10. helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request by name "+name)
  11. return
  12. }
  13. defer res.Body.Close()
  14. result, err := ioutil.ReadAll(res.Body)
  15. if err != nil {
  16. helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request of booking by name "+name)
  17. return
  18. }
  19. var booking models.Booking
  20. var resResult models.Result
  21. resResult.Name = name
  22. var resInfo models.ResultInfo
  23. if err := json.Unmarshal(result, &booking); err == nil {
  24. for _, book := range booking.Books {
  25. resInfo.Date = book.Date
  26. for _, movie := range book.Movies {
  27. res, err := http.Get("http://127.0.0.1:8001/movies/" + movie)
  28. if err == nil {
  29. result, err := ioutil.ReadAll(res.Body)
  30. if err == nil {
  31. var movie models.Movie
  32. if err := json.Unmarshal(result, &movie); err == nil {
  33. resInfo.Movies = append(resInfo.Movies, movie)
  34. }
  35. }
  36. }
  37. }
  38. resResult.Books = append(resResult.Books, resInfo)
  39. }
  40. helper.ResponseWithJson(w, http.StatusOK, resResult)
  41. } else {
  42. helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request")
  43. }
ft_authoradmin  ft_create_time2019-04-26 18:11
 ft_update_time2019-04-26 18:12