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

相关文章
|
27天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
23天前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态。
|
24天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 11 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
27天前
|
Kubernetes Cloud Native API
云原生入门:从理论到实践的探索之旅
本文旨在为初学者提供一个关于云原生技术的全面介绍,包括其定义、核心原则、关键技术组件以及如何将这些概念应用于实际项目中。我们将通过一个简易的代码示例,展示如何在云原生环境下部署一个简单的应用,从而帮助读者更好地理解云原生技术的实践意义和应用价值。
|
28天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器化到微服务
本文将带领读者踏上云原生的旅程,深入探讨容器化和微服务架构的概念、优势以及它们如何共同推动现代软件的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务应用,并解释相关的配置和操作。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供有价值的见解和实操指南。
|
29天前
|
运维 Cloud Native 开发者
云原生技术入门与实践
在云计算的浪潮中,云原生技术以其独特的优势和魅力吸引了越来越多的开发者和企业。本文将从云原生技术的基本概念、核心组件以及实际应用三个方面进行详细介绍,帮助读者更好地理解和掌握这一新兴技术。同时,文章还将分享一些实际案例和经验教训,让读者能够更深入地了解云原生技术的应用场景和发展趋势。
40 5
|
1月前
|
Cloud Native API 持续交付
云原生时代的微服务架构设计
随着云计算的蓬勃发展,云原生概念逐渐成为IT行业的热点。本文将通过深入浅出的方式,介绍在云原生环境下,如何设计一个高效、可扩展的微服务架构。文章不仅涉及理论概念,还将结合实际代码示例,帮助读者理解微服务架构的核心要素和设计原则,以及如何在云平台上实现这些设计。
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
消息中间件 运维 Cloud Native
云原生架构下的微服务优化策略####
本文深入探讨了云原生环境下微服务架构的优化路径,针对服务拆分、通信效率、资源管理及自动化运维等核心环节提出了具体的优化策略。通过案例分析与最佳实践分享,旨在为开发者提供一套系统性的解决方案,以应对日益复杂的业务需求和快速变化的技术挑战,助力企业在云端实现更高效、更稳定的服务部署与运营。 ####