Junedayday Blog

六月天天的个人博客

0%

buf是一个很棒的基于protobuf来建立微服务API体系的工具。

我个人是buf的重度用户,并已在多个企业级的项目中落地。但是,鉴于buf以下三个特点,网上的相关教程很少:

  1. 资料基本由英文文档构成
  2. 更新迭代快,有很多新增或已过时的特性
  3. 有一定的技术门槛(如熟悉protobuf生态)

今天开始,我将以Go语言为背景,开启一个buf套件相关的教程。整个教程会分为四大篇章,分别回答以下问题:

阅读全文 »

概览

通过上一讲,我们对gRPC的拦截器有了一定的认识,也能定制出很多通用的中间件。

但在大部分的业务系统中,我们面向的还是HTTP协议。那么,今天我们就从gRPC-Gateway的mux选项出发,一起来看看一些很实用的特性。

阅读全文 »

go-tip

导语

在网上搜索 Go单元测试,我们能找到各种开源工具和方法技巧,也可以照葫芦画瓢、快速地写出示例test case。但回到具体的工程项目里,当我们面对代码里的各种CRUD、接口与实现、内外部依赖时,往往发现很难写出有效的单元测试,空有一身技巧却无从下手。

我也被这个问题困扰许久,也反复在多个项目里折腾,发现要将单元测试落地到项目中,有一条被忽视的gap。下面我分享一下个人的思路。

Go单元测试的具体语法,本文会一笔带过,想了解细节的同学可以自行搜索。

阅读全文 »

概览

我们在前几讲提到过,优秀的RPC框架都提供了middleware的能力,可以减少很多重复代码的编写。在gRPC-Gateway的方案里,包括了两块中间件的能力:

  1. gRPC中的ServerOption,是所有gRPC+HTTP都会被处理
  2. gRPC-Gateway中的ServeMuxOption,只有HTTP协议会被处理

今天,我们先关注共同部分的ServerOption,它提供的能力最为全面,让我们一起了解下。

阅读全文 »

概览

gRPC-Gateway的相关方案我们已经在上一篇详细描述。为了更方面地方便大家理解,我这边整理了一个最简化的git项目:https://github.com/Junedayday/grpc-gateway-buf-example/tree/v0.0.1

它主要包含两个特点:

  1. 用buf工具构建项目
  2. 同时启动了gRPC和gRPC-Gateway服务,支持两种协议的调用

今天,我们先迈出第一步:探索RPC服务中的数据类型。掌握常见的数据类型,灵活地运用到接口设计中,能帮助我们快速地提供优雅的接口类服务。

阅读全文 »

gin框架

gin是非常流行的一款HTTP框架。相较于原生的HTTP server,gin有很多改进点,主要在于3点:

  1. 上手简单,开发思路与原生HTTP基本一致
  2. 引入多个工具库,提高了开发效率
  3. 生态丰富,有许多开源的组件

围绕着gin框架,我们将展开今天的话题。

阅读全文 »

RPC框架

作为一名开发者,我们最常见的日常工作就是web类编程:即对于CRUD请求,开发相关的业务代码。

在Go语言中,常见的RPC包括HTTP/gRPC/Thrift等,但绝大多数的开发场景仍是基于HTTP。本文对RPC的讨论,主要是基于HTTP的场景。

如果我们能熟练地掌握一套主流RPC框架,至少能提升20%的开发效率,而优秀的框架能带来更大的帮助。提效是为了有更多时间提升个人能力,我们今天就先对RPC框架有一个概览。

阅读全文 »

概览

目前,Go语言在中国市场虽然蓬勃发展,但相较于JAVA语言的成熟面试体系,Go缺少了很多“八股文”性质的资料,出现了两个问题:

  1. 对新手来说,知识很难体系化;
  2. 对面试者来说,遇到的问题千奇百怪,甚至面试官之间的答案也不一样

那么,我将挑选五个概述类的问题,并给出我的思考,希望能对大家带来帮助。

阅读全文 »

在上一讲,我们梳理了EtcdServer的关键函数processInternalRaftRequestOnce里的四个细节。

其中,wait.Wait组件使用里,我们还遗留了一个细节实现,也就是请求的处理结果是怎么通过channel返回的。

1
2
3
4
5
6
7
8
9
10
11
select {
// 正常消息的返回,也就是我们本章要研究的
case x := <-ch:
return x.(*applyResult), nil
case <-cctx.Done():
proposalsFailed.Inc()
s.w.Trigger(id, nil)
return nil, s.parseProposeCtxErr(cctx.Err(), start)
case <-s.done:
return nil, ErrStopped
}
阅读全文 »