Go云原生开发有着天然的优势,云原生体系需求可扩展、耦合、弹性可办理。 Go的规划便是为云原生年代构建的言语:简略高效、快速编译、支撑现代网络和多核计算、支撑高并发、内存安全,协助用户专心于处理问题而不是受限于言语的复杂性。

打好基础

要想一文入门Go微服务仍是需求有些前提条件的,打好基础:

  1. 现已掌握了Golang的基础常识,假如基础薄弱,欢迎学习的我的Go言语学习专栏,查漏补缺。

  2. 了解Protobuf,知晓相关常识点。 补课能够阅览这篇文章:# 一文带你玩转ProtoBuf

  3. 了解RPC的概念,知晓gRPC怎么运用。能够阅览这2篇文章快速入门:# Go RPC入门攻略:RPC的运用鸿沟在哪里?怎么完成跨言语调用?和 # 开发gRPC一共分三步。

微服务结构比照

目前Go微服务结构许多,包含:go-micro、go-zero、go-kit、go-kratos、tars-go、dubbo-go、jupiter等等…

我简略整理了一下,让咱们先有个整体的知道:

简略横评各个结构

结构 作者 开源时间 一句话概述 优势 缺陷 最新star数
go-micro 国外大佬Asim团队 2015年 是最早,最经典的Go微服务结构之一 轻量级结构,入门简略,文档清晰 版别兼容性差,社区活泼度一般 19.4k
go-zero 国内大佬万俊峰团队 2020 供给了微服务结构需求具有的通用才能 社区生态十分好,无论是文档更新仍是技术群都很活泼 相比于go-micro比较重,一同也只带一部分的强约束,学习门槛比go-micro略高 20.8k
go-kit 国外大佬 2015 Go-kit将自己描绘为微服务的标准库。像Go相同,go-kit为您供给可用于构建使用程序的单独包。 极度轻量级结构 社区建设一般 24k
tars-go 腾讯开源 2018 tarsgo是tars这个大的C++重量级微服务结构下的go言语服务结构 优势在于许多才能不必从头开始做起,直接依托母体tars 缺陷是独立性较差,要选用这个tarsgo的前提,便是要先选用tars这个C++的结构 3.1k
dubbo-go 阿里开源 2019 dubbogo是dubbo这个Java重量级微服务结构下的go言语服务结构 和腾讯开源项目相似 和腾讯开源项目相似 4.2k
go-kratos B站开源 2019 轻量级的微服务结构,结构定位于处理微服务的中心诉求。 暂无,后续弥补 暂无,后续弥补 19k
jupiter 斗鱼开源 2020 面向服务管理的Golang微服务结构 暂无,后续弥补 暂无,后续弥补 3.9K

我方案体系的介绍2个微服务结构的入门和实战教程“go-micro”和“go-zero”

之所以挑选这两个结构是因为:

  1. 我司运用的go-micro,发现这个结构开发微服务够经典,够纯粹,十分合适入门学习微服务。

  2. 经过和有经验的小伙伴交流,go-zero也是一个十分优异的结构,在国内社区生态建设和保护上,完美适配国内开源的现状,社区十分活泼,运用率会越来越高。

go-zero的入门攻略,在后面会为咱们做共享,欢迎重视我。

微服务

概念

微服务是一种软件架构形式,用于将大型整体使用程序分解为更小的可办理独立服务,这些独立服务经过跨言语的协议进行通讯,每个服务都专心于做好一件作业。

软件架构演进史

假如你对上面这段界说表示晦涩难明,能够阅览这篇文章:# 给想转Go或许Go进阶同学的一些主张:

我结合自己的经历聊了聊软件架构演进史:从单机架构到集中式架构,再到当前主流的散布式微服务架构,介绍了微服务和范畴驱动规划DDD的常识点。

简略了解

用我的话解释微服务便是:

把复杂的项目拆成微(小的)服务,清晰服务与服务之间的鸿沟,服务内部高内聚,服务之间松耦合。

微服务的优点

  1. 下降开发难度:微服务架构使得团队各个成员只需求重视自己的事务,办理好自己的服务;
  2. 独立布置:各个微服务之间能够分隔布置,不影响其他服务的运用,上线布置不需求其他团队的合作支撑。
  3. 前进容错和容灾才能:微服务之间独立,最大程度下降一个服务对别的一个服务的影响;
  4. 前进团队履行效率:各个团队独立开发、布置、保护项目,不需求等候其他团队的支撑。
  5. 前进项目复用性:微服务的架构规划,能将高复用利用到极致,不同的服务不会做同一件作业,防止资源浪费。
  6. 下降企业成本:微服务支撑跨言语、跨团队开发,不需求大规模的替换单体架构或许集中式架构中的工程师。

咱们在了解微服务的优点之后,继续探求一下go-micro的特色,了解一下go-micro是怎么完成微服务开发的:

go-micro概述

go-micro是一个简化散布式开发的微服务生态体系。它为开发散布式使用程序供给了根本的构建模块。

go-miro的规划哲学是:经过供给组件东西,清晰微服务开发的鸿沟,让咱们专心于开发事务自身。

下面就要点介绍一下构成组件:

构成组件

Go Micro

  • 用于在Go中编写微服务的插件式RPC结构。它供给了用于服务发现、客户端负载平衡、编码、同步和异步通讯库
  • 这是咱们学习go-micro最重要的库,咱们开发微服务的要点也是编写RPC服务。

API

  • 供给并将HTTP恳求路由到对应微服务的API网关。它充当单个入口点,能够用作反向署理或将HTTP恳求转换为RPC。
  • 咱们开发微服务项目,说到底是编写RPC服务,怎么让外部恳求能够访问到RPC服务呢?便是经过API

Sidecar

  • 一种对言语透明的RPC署理(也便是和言语无关),具有go-micro作为HTTP端点的一切功用。虽然Go是构建微服务的优选言语,但商业项目中也经常运用其他言语一同开发微服务。因而Sidecar供给了一种将其他言语使用程序集成到Micro世界的办法。
  • Sidecar又被称为服务网格,其作用是:第一,微服务管理与事务逻辑的解耦。第二,异构体系的一致管理。

Web

  • 用于Micro Web使用程序的仪表板和反向署理。官方以为基于微服务建立web使用是通用场景,因而Web被视为微服务范畴的一等公民。它的行为十分像API反向署理,别的也包含对web sockets的支撑。
  • 咱们能够经过仪表盘直观的观察到微服务项目的运转情况,后面会要点介绍。

CLI

  • 供给指令行界面让咱们和微服务进行交互。CLI还能够使咱们利用Sidecar作为署理。
  • CLI是microservices toolkitmicro的指令行界面,包含获取服务、查看服务、查询服务健康状态等功用;咱们还能够经过Sidecar署理CLI。

Bot

  • Hubot风格的bot。在咱们的微服务平台中,能够经过Slack,HipChat,XMPP等进行交互。它经过音讯传递供给CLI的功用。能够添加其他指令来主动履行常见的操作使命。
  • 微型机器人Bot是一个位于微服务环境中的机器人,机器人是怎么作业的呢?
  • Bot运用它的命名空间监督服务注册中心的服务。默许称号空间是go.micro.bot。该称号空间内的任何服务都将主动添加到可用指令列表中。履行指令时,机器人将运用Command.Exec办法调用该服务。

总结

相比于GoFrame、Gin这类Web结构,咱们发现微服务结构的组件构成更为复杂。

Go Micro是咱们用于编写微服务的RPC结构,入门阶段要点了解Go Micro组件即可,其他的组件会在后续文章中详细介绍。

下面咱们要点看一下Go Micro组件的架构:

Go Micro组件架构

Go Micro为微服务供给了根本的构建模块,其目标是简化散布式体系开发。

因为微服务是一种架构形式,Micro的架构思路是经过东西组件进行拆分,简化咱们开发微服务项目的难度;Micro的规划哲学是可插拔的插件化架构。

Go-micro是微服务的独立RPC结构,也是咱们学习go-micro的中心。

咱们看下面的架构图:

一文入门Go云原生微服务「爆肝6千字」

  • 最顶层是service,代表一个微服务
  • 服务下面是两个端:客户端和服务端。(留意区分Service和Server,我在刚接触的时分混杂了这两个概念,service指的是服务;server服务端包含在service中,和client客户端一同作为service的底层支撑
    • 服务端Server:用于构建微服务的接口,供给用于RPC恳求的办法。
    • 客户端Client:供给RPC查询办法,它结合了注册表,挑选器,署理和传输。它还供给重试机制,超时机制,运用上下文等,是咱们入门阶段的要点。

架构图中最底层的组件关于初学微服务的同学肯定不熟悉,下面来要点介绍一下:

Registry注册中心

注册中心供给可插入的服务发现库,来查找正在运转的服务。 默许的完成办法是consul。

咱们也能够很便利的修改为etcd,kubernetes等。毕竟可插拔是go-micro重要特性。

Selector负载均衡

Selector挑选器完成go-micro的负载均衡机制。

原理是这样的:当客户端向服务器宣布恳求时,首先查询服务的注册中心,注册中心会返回一个正在运转服务的节点列表,挑选器将挑选这些节点中的其间一个用于查询恳求。

多次调用挑选器将运用平衡算法。目前的办法是循环法、随机哈希、黑名单。go-micro便是经过这种机制完成负载均衡的。

Broker事情驱动:发布订阅

Broker是发布和订阅的可插入接口。

微服务是一个事情驱动的架构,发布和订阅事情应该是一流的公民。目前的完成包含nats,rabbitmq和http。

Transport音讯传输

传输是经过点对点传输音讯的可插拔接口。

目前的完成是http,rabbitmq和nats。经过供给这种笼统,运送能够无缝地换出。

总结

以上这些便是go-micro RPC结构的底层支撑组件。

咱们了解微服务和go-micro的常识点后可能仍是有些懵,这很正常,毕竟常识点过于密集。

快速入门

下面和我一同动手实践吧:

留意:go-micro版别不兼容的问题最被咱们吐槽,下面我演示的依靠装置和示例代码,均以我司运用的go-micro v2版别。

我决议运用# 和大象装冰箱相同:开发gRPC一共分三步的示例,编写go-micro的入门示例: 经过原生开发gRPC和运用go-micro开发做个比照,你会发现运用go-micro开发微服务多么的简略。

咱们参阅go-micro的官方示例,完成一个问好服务,完成经典的Hello World:

准备作业

1. 装置micro v2

#装置go-micro
go get github.com/micro/go-micro/v2
#装置东西集
go get github.com/micro/micro/v2

2. 装置protobuf插件

#装置protobuf
go get github.com/golang/protobuf/{proto,protoc-gen-go}
#指定版别装置生成micro代码的东西集
go get github.com/micro/micro/v2/cmd/protoc-gen-micro

咱们在编写proto文件之后,运用protoc-gen-go主动生成代码,所以需求提早装置好依靠。

3. 创立项目结构

咱们在合适的目录创立项目目录,比如我挑选在我的Go装置目录/Users/wangzhongyang/go/src/ 新建go-micro目录,用于一致办理go-micro相关的项目。

cd /Users/wangzhongyang/go/src/
mkdir go-micro

在go-micro目录下创立helloworld目录,用于编写本次的演示项目。

cd go-micro
mkdir helloworld
cd helloworld

在helloworld目录下新建proto目录用于编写proto文件,别的创立main.go文件作为服务的入口文件:

touch main.go
mkdir proto

准备作业做好之后,下面开发微服务的过程和“开发gRPC一共分三步”是相同的:

  1. 写proto文件界说服务和音讯
  2. 运用protoc东西生成代码
  3. 编写事务逻辑代码供给服务

1. 编写proto文件

咱们在helloword/proto目录下 新建greeter.proto文件

编写proto文件和用什么微服务结构没有关系,咱们都需求界说syntax、service和message

syntax = "proto3";
//pb是protoc 生成go文件的包名
option go_package ="./;pb";
service Greeter {
  rpc Hello(Request) returns (Response) {}
}
message Request {
  string name = 1;
}
message Response {
  string greeting = 1;
}

2. 运用protoc东西生成代码

咱们翻开控制台,切换到proto目录下,比如我的目录是:

cd  /Users/wangzhongyang/go/src/go-micro/helloworld/proto

履行主动生成代码指令:

留意:咱们必须运用带有 micro plugin 的 protoc 编译它。

protoc --proto_path=. --micro_out=. --go_out=. greeter.proto

咱们发现履行上述指令后,生成了pb.go文件和pb.micro.go文件。

但是有报错,不必担心,接着往下看:

一文入门Go云原生微服务「爆肝6千字」

2.1 处理报错

报错原因是因为没有导入依靠,咱们在项目根目录下履行:

go mod init
go mod tidy

同步依靠后,发现报错消失了:

一文入门Go云原生微服务「爆肝6千字」

3. 编写事务逻辑代码供给服务

3.1 编写服务端

  1. 咱们直接在main.go中编写服务
  2. import中的 proto 对应的目录改成自己的。你自己的module称号能够在go.mod中查看:

一文入门Go云原生微服务「爆肝6千字」

  1. 要害代码已加注释,逻辑和# 开发gRPC一共分三步 的入门实践部分十分像。
package main
import (
   "context"
   "fmt"
   micro "github.com/micro/go-micro/v2"
   proto "go-micro/helloworld/proto" //留意这里:修改成你自己的
)
//界说结构体 作为办法调用方
type Greeter struct{}
//完成 .pb.micro.go中的Hello办法 界说rsp的返回值
func (g *Greeter) Hello(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
   rsp.Greeting = "Hello " + req.Name
   return nil
}
func main() {
   //界说服务
   service := micro.NewService(
      micro.Name("greeter"),
   )
   //服务初始化
   service.Init()
   // 注册handler
   err := proto.RegisterGreeterHandler(service.Server(), new(Greeter))
   if err != nil {
      return
   }
   //发动服务
   if err := service.Run(); err != nil {
      fmt.Println(err)
   }
}

服务端编写好之后咱们再编写客户端:

3.2 编写客户端

在项目根目录下,新建client目录,新建client.go文件,用于编写客户端代码

创立目录和文件:

mkdir client
cd client
touch client.go

编写代码:

  1. 要害逻辑现已添加注释
  2. NewGreeterService()和Hello()都是proto文件主动生成的的,界说在.pb.micro文件中
package main
import (
   "context"
   "fmt"
   micro "github.com/micro/go-micro/v2"
   proto "go-micro/helloworld/proto"
)
func main() {
   //创立一个新的服务 命名
   service := micro.NewService(micro.Name("greeter.client"))
   //服务初始化
   service.Init()
   //创立服务 绑定客户端 这个办法是在proto生成的文件中界说的
   greeter := proto.NewGreeterService("greeter", service.Client())
   //调用Hello办法 Hello办法同样是在proto生成的文件中界说的
   rsp, err := greeter.Hello(context.TODO(), &proto.Request{Name: "World"})
   if err != nil {
      fmt.Println(err)
   }
   //打印结果
   fmt.Println(rsp.Greeting)
}

咱们来看一下 .pb.micro.go文件的源码, 要点看一下Hello办法:

一文入门Go云原生微服务「爆肝6千字」

到这里咱们就编码完毕,看下履行效果:

3.3 发动服务,进行调用

1.先发动服务端

咱们翻开控制台,切换到项目根目录下,履行指令:

go run main.go

履行效果如下,服务端现已发动:

一文入门Go云原生微服务「爆肝6千字」

2.再发动客户端

咱们别的翻开一个控制台,发动客户端服务:

cd go-micro/helloworld/client/
go run client.go

履行效果如下,和咱们预期的效果相同,成功的打印出了Hello World:

一文入门Go云原生微服务「爆肝6千字」

总结

散布式微服务架构已成趋势,越来越多的公司在从单体使用或集中式使用向散布式使用转型。开篇类比了主流Go微服务结构的特色,Go的微服务生态能够说是百家争鸣。

本文也介绍了微服务的特色和优势,go-micro的架构和构成组件;类比原生开发rpc项目,用go-micro完成了经典的Hello World问好服务,带咱们入门了微服务开发。

关于专栏

近期会更新一系列Go实战进阶的文章,欢迎咱们重视我的: # Go言语进阶实战专栏。

一文入门Go云原生微服务「爆肝6千字」

这是近期会更新文章的常识头绪图,感兴趣的小伙伴能够重视一波,欢迎日常催更。

有问题和主张欢迎留言讨论。

一同前进

一文入门Go云原生微服务「爆肝6千字」

欢迎和我一同学习前进:能够在私信我

也能够加我微信号:wangzhongyang1993 公众号:程序员升职加薪之旅 B站视频:王中阳Go