Golang 微服务实例求解

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

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

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

    497 引用 • 1387 回帖 • 313 关注
  • 微服务

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

    96 引用 • 155 回帖 • 1 关注
  • Q&A

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

    7594 引用 • 34587 回帖 • 200 关注
  • RESTful

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

    30 引用 • 114 回帖

相关帖子

欢迎来到这里!

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

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

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

    1 回复
  • 其他回帖
  • auuunnya
    作者

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

    1 回复
  • james

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

推荐标签 标签

  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 97 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 5 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 737 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3170 引用 • 8209 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 34 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 14 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • 安装

    你若安好,便是晴天。

    131 引用 • 1184 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 5 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 467 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 517 关注
  • IBM

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

    17 引用 • 53 回帖 • 133 关注
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖
  • RabbitMQ

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

    49 引用 • 60 回帖 • 387 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 662 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 649 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 347 关注
  • OnlyOffice
    4 引用
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 344 回帖 • 1 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    345 引用 • 1778 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 627 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 4 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖
  • 创业

    你比 99% 的人都优秀么?

    83 引用 • 1399 回帖