既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
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 toolkit micro的命令行界面,包括获取服务、查看服务、查询服务健康状态等功能;我们还可以通过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组件架构
因为微服务是一种架构模式,micro的架构思路是通过工具组件进行拆分,简化我们开发微服务项目的难度;micro的设计哲学是可插拔的插件化架构。
go-micro是微服务的独立rpc框架,也是我们学习go-micro的核心。
我们看下面的架构图:
- 最顶层是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总共分三步”是一样的:
- 写proto文件定义服务和消息
- 使用protoc工具生成代码
- 编写业务逻辑代码提供服务
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文件。
但是有报错,不用担心,接着往下看:
2.1 解决报错
报错原因是因为没有导入依赖,我们在项目根目录下执行:
go mod init
go mod tidy
同步依赖后,发现报错消失了:
3. 编写业务逻辑代码提供服务
3.1 编写服务端
- 我们直接在main.go中编写服务
- import中的 proto 对应的目录改成自己的。你自己的module名称可以在go.mod中查看:
- 关键代码已加注释,逻辑和# 开发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
编写代码:
- 关键逻辑已经添加注释
- newgreeterservice()和hello()都是proto文件自动生成的的,定义在.pb.micro文件中
package main



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
经添加注释
2. newgreeterservice()和hello()都是proto文件自动生成的的,定义在.pb.micro文件中
package main
[外链图片转存中…(img-lijahmj4-1715520402061)]
[外链图片转存中…(img-lnrbvcpp-1715520402061)]
[外链图片转存中…(img-wlom7wgs-1715520402061)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
发表评论