不看后悔,一文入门Go云原生微服务(1),【一步教学,一步到位

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

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组件架构

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总共分三步”是一样的:

  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文件。

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

2.1 解决报错

报错原因是因为没有导入依赖,我们在项目根目录下执行:

go mod init
go mod tidy

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

3. 编写业务逻辑代码提供服务

3.1 编写服务端
  1. 我们直接在main.go中编写服务
  2. import中的 proto 对应的目录改成自己的。你自己的module名称可以在go.mod中查看:

  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方法:

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

3.3 启动服务,进行调用
1.先启动服务端

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
micro.go文件的源码,
重点看一下Hello方法:

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

3.3 启动服务,进行调用
1.先启动服务端

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-3KOso6o5-1713451153245)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我很乐意帮助您入门Docker!Docker是一个开源的容器化平台,它可以帮助您打包、发布和运行应用程序。以下是一些关键概念和步骤来帮助您入门Docker: 1. 安装Docker:首先,您需要在您的机器上安装Docker。Docker提供了适用于不同操作系统(如Windows、Mac和Linux)的安装程序。您可以在Docker官方网站上找到相应的安装指南。 2. Docker镜像:Docker镜像是一个轻量级的独立软件包,其中包含了运行应用程序所需的所有内容(包括代码、运行时环境、库和依赖项等)。您可以通过构建自己的镜像或者从Docker Hub等镜像仓库中获取现有的镜像。 3. Docker容器:Docker容器是从Docker镜像创建的运行实例。容器可以独立运行,并且具有自己的文件系统、网络和进程空间。您可以使用Docker命令来创建、启动、停止和删除容器。 4. Dockerfile:Dockerfile是一个文本文件,其中包含了一系列的指令,用于构建Docker镜像。通过编写Dockerfile,您可以定义应用程序的所需环境、依赖项和配置等信息,并将其打包到镜像中。 5. Docker Compose:Docker Compose是一个用于定义和运行多个Docker容器的工具。通过编写一个YAML格式的配置文件,您可以定义多个服务(每个服务对应一个容器),并指定它们之间的关联和依赖关系。 以上是Docker的一些基本概念和步骤,希望对您入门Docker有所帮助。如果您有更具体的问题或者需要进一步了解,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值