Golang 微服务实例求解

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

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

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

    500 引用 • 1396 回帖 • 251 关注
  • 微服务

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

    96 引用 • 155 回帖
  • Q&A

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

    10114 引用 • 45943 回帖 • 63 关注
  • RESTful

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

    30 引用 • 114 回帖 • 6 关注

相关帖子

欢迎来到这里!

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

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

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

    1 回复
  • auuunnya
    作者

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

    1 回复
  • james via macOS

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

推荐标签 标签

  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • ActiveMQ

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

    19 引用 • 13 回帖 • 684 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 110 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    497 引用 • 934 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    591 引用 • 3528 回帖 • 1 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1444 引用 • 10083 回帖 • 508 关注
  • 倾城之链
    23 引用 • 66 回帖 • 166 关注
  • ReactiveX

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

    1 引用 • 2 回帖 • 178 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 3 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 70 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 133 关注
  • AngularJS

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

    12 引用 • 50 回帖 • 522 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 445 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 828 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • 深度学习

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

    43 引用 • 44 回帖
  • Hprose

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

    9 引用 • 17 回帖 • 641 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 2 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 120 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖 • 3 关注
  • V2Ray
    1 引用 • 15 回帖 • 4 关注
  • abitmean

    有点意思就行了

    35 关注
  • ZeroNet

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

    1 引用 • 21 回帖 • 650 关注
  • 架构

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

    142 引用 • 442 回帖 • 1 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 445 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    4 引用 • 16 回帖 • 195 关注