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

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

见下文:一文入门Go云原生微服务「爆肝6千字」一+地址链接:https://developer.aliyun.com/article/1393833


准备工作

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

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

image.png

2.1 解决报错

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

go mod init
go mod tidy

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

image.png

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

3.1 编写服务端

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

image.png

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

image.png

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

3.3 启动服务,进行调用

1.先启动服务端

我们打开控制台,切换到项目根目录下,执行命令:

go run main.go

执行效果如下,服务端已经启动:

image.png

2.再启动客户端

我们另外打开一个控制台,启动客户端服务:

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

执行效果如下,和我们预期的效果一样,成功的打印出了Hello World:

image.png

总结

分布式微服务架构已成趋势,越来越多的公司在从单体应用或集中式应用向分布式应用转型。开篇类比了主流Go微服务框架的特点,Go的微服务生态可以说是百家争鸣。

本文也介绍了微服务的特点和优势,go-micro的架构和构成组件;类比原生开发rpc项目,用go-micro实现了经典的Hello World问候服务,带大家入门了微服务开发。

关于专栏

近期会更新一系列Go实战进阶的文章,欢迎大家关注我的:# Go语言进阶实战专栏

image.png

这是近期会更新文章的知识脉络图,感兴趣的小伙伴可以关注一波,欢迎日常催更。


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

相关文章
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
3月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
84 3
|
3天前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
19天前
|
Go C语言
Go语言入门:分支结构
本文介绍了Go语言中的条件语句,包括`if...else`、`if...else if`和`switch`结构,并通过多个练习详细解释了它们的用法。`if...else`用于简单的条件判断;`if...else if`处理多条件分支;`switch`则适用于基于不同值的选择逻辑。特别地,文章还介绍了`fallthrough`关键字,用于优化重复代码。通过实例如判断年龄、奇偶数、公交乘车及成绩等级等,帮助读者更好地理解和应用这些结构。
36 14
|
2月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器化到微服务
本文将带领读者踏上云原生的旅程,深入探讨容器化和微服务架构的概念、优势以及它们如何共同推动现代软件的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务应用,并解释相关的配置和操作。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供有价值的见解和实操指南。
|
2月前
|
Cloud Native API 持续交付
云原生时代的微服务架构设计
随着云计算的蓬勃发展,云原生概念逐渐成为IT行业的热点。本文将通过深入浅出的方式,介绍在云原生环境下,如何设计一个高效、可扩展的微服务架构。文章不仅涉及理论概念,还将结合实际代码示例,帮助读者理解微服务架构的核心要素和设计原则,以及如何在云平台上实现这些设计。
|
3月前
|
Kubernetes Cloud Native 开发者
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
3月前
|
消息中间件 运维 Cloud Native
云原生架构下的微服务优化策略####
本文深入探讨了云原生环境下微服务架构的优化路径,针对服务拆分、通信效率、资源管理及自动化运维等核心环节提出了具体的优化策略。通过案例分析与最佳实践分享,旨在为开发者提供一套系统性的解决方案,以应对日益复杂的业务需求和快速变化的技术挑战,助力企业在云端实现更高效、更稳定的服务部署与运营。 ####
|
2月前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
78 0
|
2月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。

热门文章

最新文章