Golang 微服务实例求解

本贴最后更新于 2502 天前,其中的信息可能已经东海扬尘

最近在看微服务,了解到一个微服务应用是多个后台服务组合起来的应用,这些个后台服务有自己的接口,自己的处理器,自己的数据库等。
概念看了很多,也有那么一丝丝理解,跟着一篇文档敲了一次代码,感觉下来还是一个单体应用,丝毫没有看到微服务的影子呀。。
代码如下:

`package main` `import ( ` `"encoding/json"` `"fmt"` `"log"` `"net/http"` `"goji.io"` `"goji.io/pat"` `"gopkg.in/mgo.v2"` `"gopkg.in/mgo.v2/bson"` `)` `func ErrorWithJSON(w http.ResponseWriter, message string, code` `int``) { ` `w.Header().Set(``"Content-Type"``,` `"application/json; charset=utf-8"``)` `w.WriteHeader(code)` `fmt.Fprintf(w,` `"{message: %q}"``, message)` `}` `func ResponseWithJSON(w http.ResponseWriter, json []byte, code` `int``) { ` `w.Header().Set(``"Content-Type"``,` `"application/json; charset=utf-8"``)` `w.WriteHeader(code)` `w.Write(json)` `}` `type Book` `struct` `{ ` `ISBN    string   `json:``"isbn" `Title   string   `json:``"title" `Authors []string `json:``"authors" `Price   string   `json:``"price" `}` `func main() { ` `session, err := mgo.Dial(``"localhost"``)` `if` `err != nil {` `panic(err)` `}` `defer session.Close()` `session.SetMode(mgo.Monotonic,` `true``)` `ensureIndex(session)` `mux := goji.NewMux()` `mux.HandleFunc(pat.Get(``"/books"``), allBooks(session))` `mux.HandleFunc(pat.Post(``"/books"``), addBook(session))` `mux.HandleFunc(pat.Get(``"/books/:isbn"``), bookByISBN(session))` `mux.HandleFunc(pat.Put(``"/books/:isbn"``), updateBook(session))` `mux.HandleFunc(pat.Delete(``"/books/:isbn"``), deleteBook(session))` `http.ListenAndServe(``"localhost:8080"``, mux)` `}` `func ensureIndex(s *mgo.Session) { ` `session := s.Copy()` `defer session.Close()` `c := session.DB(``"store"``).C(``"books"``)` `index := mgo.Index{` `Key:        []string{``"isbn"``},` `Unique:` `true``,` `DropDups:` `true``,` `Background:` `true``,` `Sparse:` `true``,` `}` `err := c.EnsureIndex(index)` `if``err != nil {` `panic(err)` `}` `}` `func allBooks(s *mgo.Session) func(w http.ResponseWriter, r *http.Request) { ` `return` `func(w http.ResponseWriter, r *http.Request) {` `session := s.Copy()` `defer session.Close()` `c := session.DB(``"store"``).C(``"books"``)` `var books []Book` `err := c.Find(bson.M{}).All(&books)` `if` `err != nil {` `ErrorWithJSON(w,` `"Database error"``, http.StatusInternalServerError)` `log``.Println(``"Failed get all books: "``, err)` `return` `}` `respBody, err := json.MarshalIndent(books,` `""``,` `"  "``)` `if` `err != nil {` `log``.Fatal(err)` `}` `ResponseWithJSON(w, respBody, http.StatusOK)` `}` `}` `func addBook(s *mgo.Session) func(w http.ResponseWriter, r *http.Request) { ` `return` `func(w http.ResponseWriter, r *http.Request) {` `session := s.Copy()` `defer session.Close()` `var book Book` `decoder := json.NewDecoder(r.Body)` `err := decoder.Decode(&book)` `if` `err != nil {` `ErrorWithJSON(w,` `"Incorrect body"``, http.StatusBadRequest)` `return` `}` `c := session.DB(``"store"``).C(``"books"``)` `err = c.Insert(book)` `if` `err != nil {` `if` `mgo.IsDup(err) {` `ErrorWithJSON(w,` `"Book with this ISBN already exists"``, http.StatusBadRequest)` `return` `}` `ErrorWithJSON(w,` `"Database error"``, http.StatusInternalServerError)` `log``.Println(``"Failed insert book: "``, err)` `return` `}` `w.Header().Set(``"Content-Type"``,` `"application/json"``)` `w.Header().Set(``"Location"``, r.URL.Path+``"/"``+book.ISBN)` `w.WriteHeader(http.StatusCreated)` `}` `}` `func bookByISBN(s *mgo.Session) func(w http.ResponseWriter, r *http.Request) { ` `return` `func(w http.ResponseWriter, r *http.Request) {` `session := s.Copy()` `defer session.Close()` `isbn := pat.Param(r,` `"isbn"``)` `c := session.DB(``"store"``).C(``"books"``)` `var book Book` `err := c.Find(bson.M{``"isbn"``: isbn}).One(&book)` `if` `err != nil {` `ErrorWithJSON(w,` `"Database error"``, http.StatusInternalServerError)` `log``.Println(``"Failed find book: "``, err)` `return` `}` `if` `book.ISBN ==` `""` `{` `ErrorWithJSON(w,` `"Book not found"``, http.StatusNotFound)` `return` `}` `respBody, err := json.MarshalIndent(book,` `""``,` `"  "``)` `if` `err != nil {` `log``.Fatal(err)` `}` `ResponseWithJSON(w, respBody, http.StatusOK)` `}` `}` `func updateBook(s *mgo.Session) func(w http.ResponseWriter, r *http.Request) { ` `return` `func(w http.ResponseWriter, r *http.Request) {` `session := s.Copy()` `defer session.Close()` `isbn := pat.Param(r,` `"isbn"``)` `var book Book` `decoder := json.NewDecoder(r.Body)` `err := decoder.Decode(&book)` `if` `err != nil {` `ErrorWithJSON(w,` `"Incorrect body"``, http.StatusBadRequest)` `return` `}` `c := session.DB(``"store"``).C(``"books"``)` `err = c.Update(bson.M{``"isbn"``: isbn}, &book)` `if` `err != nil {` `switch` `err {` `default``:` `ErrorWithJSON(w,` `"Database error"``, http.StatusInternalServerError)` `log``.Println(``"Failed update book: "``, err)` `return` `case` `mgo.ErrNotFound:` `ErrorWithJSON(w,` `"Book not found"``, http.StatusNotFound)` `return` `}` `}` `w.WriteHeader(http.StatusNoContent)` `}` `}` `func deleteBook(s *mgo.Session) func(w http.ResponseWriter, r *http.Request) { ` `return` `func(w http.ResponseWriter, r *http.Request) {` `session := s.Copy()` `defer session.Close()` `isbn := pat.Param(r,` `"isbn"``)` `c := session.DB(``"store"``).C(``"books"``)` `err := c.Remove(bson.M{``"isbn"``: isbn})` `if` `err != nil {` `switch` `err {` `default``:` `ErrorWithJSON(w,` `"Database error"``, http.StatusInternalServerError)` `log``.Println(``"Failed delete book: "``, err)` `return` `case` `mgo.ErrNotFound:` `ErrorWithJSON(w,` `"Book not found"``, http.StatusNotFound)` `return` `}` `}` `w.WriteHeader(http.StatusNoContent)` `}` `}`

希望各位大佬给点入门指导或者建议,最好有代码 demo,可以便于理解,我是越看越模糊了。

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 254 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9490 引用 • 43245 回帖 • 107 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 7 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • james via macOS

    估计你单个应用是体现不出来的,我们这里是有一个中心的服务注册中心,服务会注册 IP 端口等这些信息,然后各个服务通过服务名,接口到注册中心查服务信息,发送请求给各个服务。不是各个服务直接通信,中间通过一个代理来做。

    1 回复
  • auuunnya
    作者

    那么如果要在加一个服务,例如:注册,在这个代码上应该怎么做扩展,代理我也看了一般的话就是用的中间代理 apigetway,这个代理是不是就是一个一个的路由?

    1 回复
  • james via macOS

    要先把微服务框架写好,提供好 SDK。你新加一个服务,就只要调用 SDK 的时候给出服务名,本机 IP,端口。SDK 里面去做服务注册,心跳注册。
    服务调用也使用统一好的 SDK,调用的时候给出服务名,接口名,参数。SDK 厘米做服务查询,发现,发送请求,解析请求等。
    这样新加服务,及调用服务完全屏蔽调微服务层,扩展就很简单了。调用也简单,你都不用写 httpclient 就能请求获取相应。先把相应 SDK 封装好,就会好很多。

推荐标签 标签

  • Follow
    4 引用 • 12 回帖 • 11 关注
  • 反馈

    Communication channel for makers and users.

    126 引用 • 930 回帖 • 270 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 408 回帖 • 486 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 650 关注
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 30 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 83 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 637 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 162 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 400 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 391 关注
  • abitmean

    有点意思就行了

    32 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 573 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 35 关注
  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    169 引用 • 595 回帖
  • 自由行
    2 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 108 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 79 关注