文章目录
Go云原生开发有着天然的优势,云原生系统需要可扩展、耦合、弹性可管理。Go微服务框架很多,包括:go-micro、go-zero、go-kit、go-kratos、tars-go、dubbo-go、jupiter等等…
Go 的设计就是为云原生时代构建的语言:简单高效、快速编译、支持现代网络和多核计算、支持高并发、内存安全,帮助用户专注于解决问题而不是受限于语言的复杂性。
要想一文入门Go微服务还是需要有些前提条件的,打好基础:
已经掌握了Golang的基础知识,如果基础薄弱,欢迎学习的我的Go语言学习专栏,查漏补缺。
了解Protobuf,知晓相关知识点。
补课可以阅读这篇文章:# 一文带你玩转ProtoBuf
了解RPC的概念,知晓gRPC如何使用。可以阅读这2篇文章快速入门:# Go RPC入门指南:RPC的使用边界在哪里?如何实现跨语言调用?和 # 开发gRPC总共分三步。
我简单整理了一下,让大家先有个整体的认识:
| 框架 | 作者 | 开源时间 | 一句话概述 | 优势 | 缺点 | 最新star数 |
|---|---|---|---|---|---|---|
| go-micro | 国外大佬Asim团队 | 2015年 | 是最早,最经典的Go微服务框架之一 | 轻量级框架,入门简单,文档清晰 | 版本兼容性差,社区活跃度一般 | 19.4k |
| go-zero | 国内大佬万俊峰团队 | 2020 | 提供了微服务框架需要具备的通用能力 | 社区生态非常好,无论是文档更新还是技术群都很活跃 | 相比于go-micro比较重,同时也只带一部分的强约束,学习门槛比go-micro略高 | 20.8k |
| go-kit | 国外大佬 | 2015 | Go-kit将自己描述为微服务的标准库。像Go一样,go-kit为您提供可用于构建应用程序的单独包。 | 极度轻量级框架 | 社区建设一般 | |
| tars-go | 腾讯开源 | 2018 | tarsgo是tars这个大的C++重量级微服务框架下的go语言服务框架 | 优势在于很多能力不用从头开始做起,直接依托母体tars | 缺点是独立性较差,要选用这个tarsgo的前提,就是要先选用tars这个C++的框架 | 3.1k |
| dubbo-go | 阿里开源 | 2019 | dubbogo是dubbo这个Java重量级微服务框架下的go语言服务框架 | 和腾讯开源项目类似 | 和腾讯开源项目类似 | 4.2k |
| go-kratos | B站开源 | 2019 | 轻量级的微服务框架,框架定位于解决微服务的核心诉求。 | 暂无,后续补充 | 暂无,后续补充 | 19k |
| jupiter | 斗鱼开源 | 2020 | 面向服务治理的Golang微服务框架 | 暂无,后续补充 | 暂无,后续补充 | 3.9K |
我计划系统的介绍2个微服务框架的入门和实战教程:“go-micro”和“go-zero”。
之所以选择这两个框架是因为:
我司使用的go-micro,发现这个框架开发微服务够经典,够纯粹,非常适合入门学习微服务。
通过和有经验的小伙伴交流,go-zero也是一个非常优秀的框架,在国内社区生态建设和维护上,完美适配国内开源的现状,社区非常活跃,使用率会越来越高。
go-zero的入门指南,在后面会为大家做分享,欢迎关注我。
微服务是一种软件架构模式,用于将大型整体应用程序分解为更小的可管理独立服务,这些独立服务通过跨语言的协议进行通信,每个服务都专注于做好一件事情。
如果你对上面这段定义表示晦涩难懂,可以阅读这篇文章:# 给想转Go或者Go进阶同学的一些建议:
我结合自己的经历聊了聊软件架构演进史:从单机架构到集中式架构,再到当前主流的分布式微服务架构,介绍了微服务和领域驱动设计DDD的知识点。
用我的话解释微服务就是:
把复杂的项目拆成微(小的)服务,明确服务与服务之间的边界,服务内部高内聚,服务之间松耦合。
我们在了解微服务的好处之后,继续探究一下go-micro的特点,了解一下go-micro是如何实现微服务开发的:
go-micro是一个简化分布式开发的微服务生态系统。它为开发分布式应用程序提供了基本的构建模块。
go-miro的设计哲学是:通过提供组件工具,明确微服务开发的边界,让我们专注于开发业务本身。
下面就重点介绍一下构成组件:
go.micro.bot。该名称空间内的任何服务都将自动添加到可用命令列表中。执行命令时,机器人将使用Command.Exec方法调用该服务。相比于GoFrame、Gin这类Web框架,我们发现微服务框架的组件构成更为复杂。
Go Micro是我们用于编写微服务的RPC框架,入门阶段重点理解Go Micro组件即可,其他的组件会在后续文章中详细介绍。
下面我们重点看一下Go Micro组件的架构:
Go Micro为微服务提供了基本的构建模块,其目标是简化分布式系统开发。
因为微服务是一种架构模式,Micro的架构思路是通过工具组件进行拆分,简化我们开发微服务项目的难度;Micro的设计哲学是可插拔的插件化架构。
Go-micro是微服务的独立RPC框架,也是我们学习go-micro的核心。
我们看下面的架构图:

架构图中最底层的组件对于初学微服务的同学肯定不熟悉,下面来重点介绍一下:
注册中心提供可插入的服务发现库,来查找正在运行的服务。 默认的实现方式是consul。
我们也可以很方便的修改为etcd,kubernetes等。毕竟可插拔是go-micro重要特性。
Selector选择器实现go-micro的负载均衡机制。
原理是这样的:当客户端向服务器发出请求时,首先查询服务的注册中心,注册中心会返回一个正在运行服务的节点列表,选择器将选择这些节点中的其中一个用于查询请求。
多次调用选择器将使用平衡算法。目前的方法是循环法、随机哈希、黑名单。go-micro就是通过这种机制实现负载均衡的。
Broker是发布和订阅的可插入接口。
微服务是一个事件驱动的架构,发布和订阅事件应该是一流的公民。目前的实现包括nats,rabbitmq和http。
传输是通过点对点传输消息的可插拔接口。
目前的实现是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:
#安装go-micro
go get github.com/micro/go-micro/v2
#安装工具集
go get github.com/micro/micro/v2
#安装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自动生成代码,所以需要提前安装好依赖。
我们在合适的目录创建项目目录,比如我选择在我的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总共分三步”是一样的:
我们在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;
}
我们打开控制台,切换到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文件。
但是有报错,不用担心,接着往下看:

报错原因是因为没有导入依赖,我们在项目根目录下执行:
go mod init
go mod tidy
同步依赖后,发现报错消失了:


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)
}
}
服务端编写好之后我们再编写客户端:
在项目根目录下,新建client目录,新建client.go文件,用于编写客户端代码
创建目录和文件:
mkdir client
cd client
touch client.go
编写代码:
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方法:

到这里我们就编码完毕,看下执行效果:
我们打开控制台,切换到项目根目录下,执行命令:
go run main.go
执行效果如下,服务端已经启动:

我们另外打开一个控制台,启动客户端服务:
cd go-micro/helloworld/client/
go run client.go
执行效果如下,和我们预期的效果一样,成功的打印出了Hello World:

分布式微服务架构已成趋势,越来越多的公司在从单体应用或集中式应用向分布式应用转型。开篇类比了主流Go微服务框架的特点,Go的微服务生态可以说是百家争鸣。
本文也介绍了微服务的特点和优势,go-micro的架构和构成组件;类比原生开发rpc项目,用go-micro实现了经典的Hello World问候服务,带大家入门了微服务开发。
近期会更新一系列Go实战进阶的文章,欢迎大家关注我的:
# Go语言进阶实战专栏。

这是近期会更新文章的知识脉络图,感兴趣的小伙伴可以关注一波,欢迎日常催更。
有问题和建议欢迎留言讨论。
欢迎在CSDN私信我,也欢迎 加我好友 一起学习。
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol
文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一