Создание микросервисов с Golang и MongoDB

задняя часть Микросервисы GitHub MongoDB

Создание микросервисов с Golang и MongoDB

в соответствии сumermansoor githubизPythonВерсия микросервиса трансформируется вGolangВерсия
Всего 4 микросервиса.

  • Movie Service: основная информация о фильме, название, рейтинг и т. д.
  • Сервис ShowTimes: информация о времени показа фильмов
  • Сервис бронирования: Информация о подписках на фильмы
  • Служба пользователя: информация о пользователе

Исходный код Гитхаб

Требовать

API и документация

Каждая служба независима друг от друга, с отдельными маршрутами и отдельными базами данных, а связь между каждой службой осуществляется черезHTTP JSON, Результат возврата API каждой службы также имеет тип JSON, вы можете обратиться кСоздание RESTful API с помощью Golang и MongoDB, чтобы извлечь общие вещи между каждой службой, независимо от службы, для вызова службы

  • Инкапсуляция возвращаемого результата

helper/utils.go

func ResponseWithJson(w http.ResponseWriter, code int, payload interface{}) {
	response, _ := json.Marshal(payload)
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(code)
	w.Write(response)
}

  • Основные данные

models/models.go

type User struct {
	Id   string `bson:"_id" json:"id"`
	Name string `bson:"name" json:"name"`
}

type Movie struct {
	Id       string  `bson:"_id" json:"id"`
	Title    string  `bson:"title" json:"title"`
	Rating   float32 `bson:"rating" json:"rating"`
	Director string  `bson:"director" json:"director"`
}

type ShowTimes struct {
	Id     string   `bson:"_id" json:"id"`
	Date   string   `bson:"date" json:"date"`
	Movies []string `bson:"movies" json:"movies"`
}

type Booking struct {
	Id    string     `bson:"_id" json:"id"`
	Name  string     `bson:"name" json:"name"`
	Books []BookInfo `bson:"books" json:"books"`
}

type BookInfo struct {
	Date   string   `bson:"date" json:"date"`
	Movies []string `bson:"movies" json:"movies"`
}

type Result struct {
	Name  string       `json:"name"`
	Books []ResultInfo `json:"books"`
}

type ResultInfo struct {
	Date   string  `json:"date"`
	Movies []Movie `json:"movies"`
}
  • Инкапсуляция базы данных

dao/db.go, пожалуйста, обратитесь кИнкапсуляция основных операций mgo в MongoDB

func Insert(db, collection string, docs ...interface{}) error {
	ms, c := connect(db, collection)
	defer ms.Close()
	return c.Insert(docs...)
}

func FindOne(db, collection string, query, selector, result interface{}) error {
	ms, c := connect(db, collection)
	defer ms.Close()
	return c.Find(query).Select(selector).One(result)
}
...

Служить

Конкретная ссылка на конкретную логику каждой службыСоздание RESTful API с помощью Golang и MongoDB

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

служебная связь

При запросе информации о фильмах, на которые подписан пользователь, вам необходимо сначала передатьUser ServiceСлужба запрашивает этого пользователя по имени пользователя черезBooking ServiceЗапросите информацию о подписке пользователя, а затем передайтеMovie ServiceСервис запрашивает информацию о соответствующем фильме на протяжении всегоHTTPкоммуникация

params := mux.Vars(r)
	name := params["name"]
	var user models.User
	if err := dao.FindOne(db, collection, bson.M{"_id": name}, nil, &user); err != nil {
		helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request")
		return
	}
	res, err := http.Get("http://127.0.0.1:8003/booking/" + name)
	if err != nil {
		helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request by name "+name)
		return
	}

	defer res.Body.Close()
	result, err := ioutil.ReadAll(res.Body)
	if err != nil {
		helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request of booking by name "+name)
		return
	}
	var booking models.Booking
	var resResult models.Result
	resResult.Name = name
	var resInfo models.ResultInfo

	if err := json.Unmarshal(result, &booking); err == nil {
		for _, book := range booking.Books {
			resInfo.Date = book.Date
			for _, movie := range book.Movies {
				res, err := http.Get("http://127.0.0.1:8001/movies/" + movie)
				if err == nil {
					result, err := ioutil.ReadAll(res.Body)
					if err == nil {
						var movie models.Movie
						if err := json.Unmarshal(result, &movie); err == nil {
							resInfo.Movies = append(resInfo.Movies, movie)
						}
					}
				}
			}
			resResult.Books = append(resResult.Books, resInfo)
		}
		helper.ResponseWithJson(w, http.StatusOK, resResult)
	} else {
		helper.ResponseWithJson(w, http.StatusBadRequest, "invalid request")
	}