一文入门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

相关文章
|
5天前
|
Go 开发者
Golang深入浅出之-Go语言结构体(struct)入门:定义与使用
【4月更文挑战第22天】Go语言中的结构体是构建复杂数据类型的关键,允许组合多种字段。本文探讨了结构体定义、使用及常见问题。结构体定义如`type Person struct { Name string; Age int; Address Address }`。问题包括未初始化字段的默认值、比较含不可比较字段的结构体以及嵌入结构体字段重名。避免方法包括初始化结构体、自定义比较逻辑和使用明确字段选择器。结构体方法、指针接收者和匿名字段嵌入提供了灵活性。理解这些问题和解决策略能提升Go语言编程的效率和代码质量。
21 1
|
6天前
|
Cloud Native Java 程序员
[云原生] Go并发基础
[云原生] Go并发基础
|
7天前
|
编译器 Go 开发者
Go语言入门|包、关键字和标识符
Go语言入门|包、关键字和标识符
24 0
|
11天前
|
Kubernetes Cloud Native Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(下)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
51 0
|
11天前
|
Cloud Native 算法 Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(上)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
39 0
|
17天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
18 4
|
2月前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
40 0
|
10天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
10天前
|
消息中间件 监控 持续交付
构建高效微服务架构:后端开发的进阶之路
【4月更文挑战第20天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。微服务架构作为一种新兴的分布式系统设计方式,以其独立部署、易于扩展和维护的特点,成为解决这一问题的关键。本文将深入探讨微服务的核心概念、设计原则以及在后端开发实践中如何构建一个高效的微服务架构。我们将从服务划分、通信机制、数据一致性、服务发现与注册等方面入手,提供一系列实用的策略和建议,帮助开发者优化后端系统的性能和可维护性。
|
5天前
|
消息中间件 负载均衡 持续交付
构建高效微服务架构:后端开发者的终极指南
【4月更文挑战第25天】在当今软件工程领域,微服务架构已经成为实现可扩展、灵活且容错的系统的首选模式。本文将探讨如何从零开始构建一个高效的微服务系统,涵盖关键组件的选择、通信机制、数据管理以及持续集成和部署策略。通过深入分析与案例研究,我们旨在为后端开发者提供一个全面的微服务实践指南,帮助他们在构建现代化应用时做出明智的架构决策。

热门文章

最新文章