[ GO语言微服务 | 青训营笔记 ]

63 阅读3分钟

Go语言微服务入门:让你的应用变得更健壮

随着互联网应用的日益复杂,针对每种功能需求都单独编写一个大型的单体应用越来越难以维护,并且在团队分工协作中也不太方便。针对这种情况,微服务应运而生。在微服务架构下,我们将一个大型的应用按照每个独立的领域将其拆分成多个小的服务,并提供一套良好的标准接口进行调用,来实现应用的复杂逻辑。

在微服务中,Go 语言已经成为了一个热门选择。Go 语言本身就是一种并发性很强的语言,因此它天生就很适合用于编写高并发或分布式系统的轻量级服务。

在本文中,我们将简单介绍 Go 语言微服务的基本概念,并使用一个实际的示例来演示如何使用 Go 编写一个简单但完整的微服务应用。

基本概念

以“订单服务”为例,我们需要将一个单体应用拆分成若干个独立的小服务,例如下面这些:

  • 用户服务:提供用户的注册、登录、查询等相关接口。
  • 商品服务:提供商品的查询、添加、删除等相关接口。
  • 订单服务:提供下单、取消、查询等相关接口。
  • 支付服务:提供支付相关接口。

每个服务都是独立开发、测试、部署和运行的。服务之间通过 REST API、gRPC 等方式进行通讯。

示例代码

在这里,我们将展示一个简单的 Go 微服务示例。该服务提供一个“Hello World”的 REST API,以及一个查询 user 表的 API。我们首先需要创建一个 server.go 文件,加入以下代码:

package main

import (
    "database/sql"
    "encoding/json"
    "log"
    "net/http"

    _ "github.com/go-sql-driver/mysql"
    "github.com/gorilla/mux"
    "github.com/rs/cors"
)

type User struct {
    ID   string `json:"id,omitempty"`
    Name string `json:"name,omitempty"`
}

func main() {
    router := mux.NewRouter()

    router.HandleFunc("/", helloWorld).Methods("GET")
    router.HandleFunc("/users", getUser).Methods("GET")

    handler := cors.Default().Handler(router)

    log.Fatal(http.ListenAndServe(":8080", handler))
}

func helloWorld(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)

    type Message struct {
        Text string `json:"text"`
    }

    json.NewEncoder(w).Encode(&Message{Text: "Hello, World!"})
}

func getUser(w http.ResponseWriter, r *http.Request) {
    db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test")

    if err != nil {
        log.Fatal(err)
    }

    defer db.Close()

    rows, err := db.Query("SELECT id, name FROM user")

    if err != nil {
        log.Fatal(err)
    }

    defer rows.Close()

    users := []User{}

    for rows.Next() {
        var id string
        var name string

        if err := rows.Scan(&id, &name); err != nil {
            log.Fatal(err)
        }

        user := User{id, name}

        users = append(users, user)
    }

    w.Header().Set("Content-Type", "application/json")

    json.NewEncoder(w).Encode(users)
}

以上代码通过 gorilla/mux 包提供路由,使用 rs/cors 包处理跨域问题。其中 getUser() 方法通过 sql 包查询数据库中的 user 表,返回 json 格式的用户数据。

我们可以通过以下命令来启动运行此服务:

$ go run main.go

访问 http://localhost:8080 即可看到响应的 “Hello, World!” 消息。

此外,我们可以通过访问 http://localhost:8080/users 查看 user 表中的用户数据。

文章引用

除了上述示例代码,我们还可以参考以下这些优秀的文章以进一步了解 Go 微服务:

  • 《Building Microservices in Go》:本书介绍了使用 Go 编写具有分布式系统特点的微服务。
  • 《Microservices with Go》:本书介绍了使用 Go 开发微服务并通过 Docker 进行部署的过程。
  • 《Go Microservices Toolkit》:在本文章中,作者介绍了使用 Go 编写微服务的最佳实践并提供了相关的 Github 代码仓库。

总结

在本文中,我们简要介绍了 Go 微服务的基本概念,并提供了一个简单的示例代码来演示如何使用 Go 编写微服务。通过这样的方式,我们可以清晰地知道 Go 如何帮助我们构建高效的微服务应用并使其更健壮。