Golang 微服务实例求解

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

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

`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 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 373 关注
  • 微服务

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

    96 引用 • 155 回帖
  • Q&A

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

    6538 引用 • 29397 回帖 • 246 关注
  • RESTful

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

    30 引用 • 114 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

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

  • 其他回帖
  • james

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

    1 回复
  • auuunnya
    作者

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

    1 回复

推荐标签 标签

  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 166 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 126 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    85 引用 • 895 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 28 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 693 关注
  • danl
    62 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • 导航

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

    37 引用 • 168 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    368 引用 • 1212 回帖 • 581 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 36 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 395 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖
  • 笔记

    好记性不如烂笔头。

    303 引用 • 777 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 16 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 93 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 121 关注
  • Bootstrap

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

    18 引用 • 33 回帖 • 683 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 497 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 598 关注
  • 微软

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

    8 引用 • 44 回帖
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖