04-数据绑定和验证
概述上篇文章分享了 Gin 框架使用 Logrus 进行日志记录,这篇文章分享 Gin 框架的数据绑定与验证。 有读者咨询我一个问题,如何让框架的运行日志不输出控制台? 解决方案: 12engine := gin.Default() //修改成如下engine := gin.New() 我是怎么知道的?看框架代码。 Default(): 123456func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine} New() 代码我就不贴了。 我们看到 Default() 使用了两个中间件 Logger(), Recovery(),如果不想使用,那就直接使用 New() 就可以了。 开始今天的文章。 比如,请求 v1/member/add 新增会员方法,name、age 为必填,同时 name 不能等于 admin 字符串,10 <= age <= 120。 ...
05-自定义错误处理
概述开始今天的文章,为什么要自定义错误处理?默认的错误处理方式是什么? 那好,咱们就先说下默认的错误处理。 默认的错误处理是 errors.New("错误信息"),这个信息通过 error 类型的返回值进行返回。 举个简单的例子: 12345678func hello(name string) (str string, err error) { if name == "" { err = errors.New("name 不能为空") return } str = fmt.Sprintf("hello: %s", name) return} 当调用这个方法时: 123456var name = ""str, err := hello(name)if err != nil { fmt.Println(err.Error()) return} 这就是默认的错误处理,下面还会用这个例子进行说。 这个默认的错误处理,只是...
2-go操作etcd
原文链接:《go操作etcd》–李文周 其他参考: 《etcd 快速入门》 etcd 是近几年比较火热的一个开源的、分布式的键值对数据存储系统,提供共享配置、服务的注册和发现,本文主要介绍 etcd 的安装和使用。 .1 etcd介绍etcd 是使用 Go 语言开发的一个开源的、高可用的分布式 key-value 存储系统,可以用于配置共享和服务的注册和发现。 类似项目有 zookeeper 和 consul 。 etcd 具有以下特点: 完全复制:集群中的每个节点都可以使用完整的存档 高可用性:Etcd 可用于避免硬件的单点故障或网络问题 一致性:每次读取都会返回跨多主机的最新写入 简单:包括一个定义良好、面向用户的 API(gRPC) 安全:实现了带有可选的客户端证书身份验证的自动化 TLS 快速:每秒 10000 次写入的基准速度 可靠:使用 Raft 算法实现了强一致、高可用的服务存储目录 .2 etcd 应用场景.2.1 服务发现服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务...
06-统一定义 API 错误码
改之前在使用 gin 开发接口的时候,返回接口数据是这样写的。 123456789101112type response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"`}// always return http.StatusOKc.JSON(http.StatusOK, response{ Code: 20101, Msg: "用户手机号不合法", Data: nil,}) 这种写法 code、msg 都是在哪需要返回在哪定义,没有进行统一管理。 改之后12345// 比如,返回“用户手机号不合法”错误c.JSON(http.StatusOK, errno.ErrUserPhone.WithID(c.GetString("trace-id")))// 正确返回c.J...
01-Go gRPC Hello World
概述开始 gRPC 了,这篇文章学习使用 gRPC,输出一个 Hello World。 用 Go 实现 gRPC 的服务端。 用 Go 实现 gRPC 的客户端。 gRPC 支持 4 类服务方法,咱们这次实现 单项 RPC 和 服务端流式 RPC。 四类服务方法单项 RPC 服务端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。 1rpc SayHello(HelloRequest) returns (HelloResponse){} 服务端流式 RPC 客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。 1rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){} 客户端流式 RPC 客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。 1rpc LotsOfGreetings(stream HelloRequest...
02-Go gRPC 调试工具
概述最近这段时间工作挺忙的,发现已经 3 周没更文了… 感谢你们还在,今天给大家分享一款 gRPC 的调试工具。 进入正题。 当我们在写 HTTP 接口的时候,使用的是 Postman 进行接口调试,那么在写 gRPC 接口的时候,有没有类似于 Postman 的调试工具呢? 这是有的。 咱们一起看下 grpcui,源码地址: https://github.com/fullstorydev/grpcui 看下官方描述: grpcui is a command-line tool that lets you interact with gRPC servers via a browser. It’s sort of like Postman, but for gRPC APIs instead of REST. 写一个 gRPC API我原来写过 Demo,可以直接用原来写的 listen 项目。 端口:9901 .proto 文件: 123456789101112131415161718192021syntax = "proto3"; // 指定 pro...
1-gRPC
原文:《gRPC快速入门》 RPC 算是近些年比较火热的概念了,随着微服务架构的兴起,RPC 的应用越来越广泛。本文介绍了 RPC 和 gRPC 的相关概念,并且通过详细的代码示例介绍了 gRPC 的基本使用。 .1 RPC 和 gRPC 含义.1.1 RPC 是什么在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。 RPC 是一种 服务器-客户端(Client/Server)模式,经典实现是一个通过 发送请求-接受回应 进行信息交互的系统。 .1.2 gRPC 是什么gRPC 是一种现代化开源的高性能 RPC 框架,能够运行于任意环境之中。最初由谷歌进行开发。它使用HTTP/2 作为传输协议。 在 gRPC 里,客户端可以像调用本地方法一样直接调用其他机器上的服务端应用程序的方法,帮助你更容易创建分布式应用程序和服务。 与许多 RPC 系统一样...
gRPC介绍与安装
grpc是高性能的rpc框架,基于http2协议(双向流、头部压缩、多复用请求等),默认使用protobuf序列化协议 安装123456789# grpc编译器curl -fsSL https://goo.gl/getgrpc | bash -s -- --with-plugins# Golang protobuf插件# 编译后会安装protoc-gen-go到$GOBIN目录, 默认在 $GOPATH/bin. 该目录必须在系统的环境变量$PATH中,这样在编译.proto文件时protocol编译器才能找到插件go get -u github.com/golang/protobuf/{proto,protoc-gen-go}# grpc-gogo get -u google.golang.org/grpc 参考https://segmentfault.com/a/1190000007880647
2-protobuf初识
原文链接:《protobuf初识》——李文周(本文原作者) 其他参考: 深入 ProtoBuf - 简介 深入 ProtoBuf - 编码 深入 ProtoBuf - 序列化源码解析 深入 ProtoBuf - 反射原理解析 .1 protobuf 介绍Protobuf 是 Protocol Buffer 的简称,它是 Google 公司于 2008 年开源的一种高效的平台无关、语言无关、可扩展的数据格式。目前 Protobuf 作为接口规范的描述语言,可以作为 Go 语言 RPC 接口的基础工具。 .2 protobuf 语法 protobuf3语法指南 其他参考: 深入 ProtoBuf - 简介 深入 ProtoBuf - 编码 深入 ProtoBuf - 序列化源码解析 深入 ProtoBuf - 反射原理解析 ProtoBuf 官方文档翻译(和上面四篇文章同一作者) .3 protobuf 使用protobuf 是一个与语言无关的一个数据协议,所以我们需要先编写 IDL 文件然后借助专用工具生成指定语言的代码,从而实现数据的序列化与反序列化过程。 大致开...
gRPC内置trace
1234567891011121314func main() { go startTrace() }func startTrace() { grpc.EnableTracing = true trace.AuthRequest = func(req *http.Request) (any, sensitive bool) { return true, true } go http.ListenAndServe(":9503", nil) log.Println("trace listen on 9503")} 通过http://localhost:9503/debug/requests查看请求 通过http://localhost:9503/debug/events查看事件













