自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 资源 (2)
  • 论坛 (5)
  • 收藏
  • 关注

原创 一文搞懂一致性hash的原理和实现

在 go-zero 的分布式缓存系统分享里,Kevin 重点讲到过一致性hash的原理和分布式缓存中的实践。本文来详细讲讲一致性hash的原理和在 go-zero 中的实现。以存储为例,在整个微服务系统中,我们的存储不可能说只是一个单节点。 一是为了提高稳定,单节点宕机情况下,整个存储就面临服务不可用; 二是数据容错,同样单节点数据物理损毁,而多节点情况下,节点有备份,除非互为备份的节点同时损毁。 那么问题来了,多节点情况下,数据应该写入哪个节点呢?hash所以本质来讲:

2021-07-20 11:12:41 19 1

原创 听说过对 Go map 做 GC 吗?

在 Golang 中的 map 结构,在删除键值对的时候,并不会真正的删除,而是标记。那么随着键值对越来越多,会不会造成大量内存浪费?首先答案是会的,很有可能导致 OOM,而且针对这个还有一个讨论:[https://github.com/golang/go/issues/20135](https://github.com/golang/go/issues/20135)。大致的意思就是在很大的 `map` 中,`delete` 操作没有真正释放内存而可能导致内存 OOM。所以一般的做法:就是 **重建

2021-07-14 13:50:15 9

原创 一文讲懂服务的优雅重启和更新

在服务端程序更新或重启时,如果我们直接 `kill -9` 杀掉旧进程并启动新进程,会有以下几个问题:1. 旧的请求未处理完,如果服务端进程直接退出,会造成客户端链接中断(收到 `RST`)2. 新请求打过来,服务还没重启完毕,造成 `connection refused`3. 即使是要退出程序,直接 `kill -9` 仍然会让正在处理的请求中断很直接的感受就是:在重启过程中,会有一段时间不能给用户提供正常服务;同时粗鲁关闭服务,也可能会对业务依赖的数据库等状态服务造成污染。所以我们服务重

2021-06-07 13:16:19 37 1

原创 自适应微服务治理背后的算法

前言go-zero 群里经常有同学问:服务监控是通过什么算法实现的?滑动窗口是怎么工作的?能否讲讲这块的原理?熔断算法是怎么设计的?为啥没有半开半闭状态呢?本篇文章,来分析一下 go-zero 中指标统计背后的实现算法和逻辑。指标怎么统计这个我们直接看 breaker :type googleBreaker struct { k float64 stat *collection.RollingWindow proba *mathx.Proba}go-zero

2021-06-01 07:57:14 21

原创 一文带你搞懂 RPC 到底是个啥

RPC(Remote Procedure Call),是一个大家既熟悉又陌生的词,只要涉及到通信,必然需要某种网络协议。我们很可能用过HTTP,那么RPC又和HTTP有什么区别呢?RPC还有什么特点,常见的选型有哪些?1. RPC是什么RPC可以分为两部分:用户调用接口 + 具体网络协议。前者为开发者需要关心的,后者由框架来实现。举个例子,我们定义一个函数,我们希望函数如果输入为“Hello World”的话,输出给一个“OK”,那么这个函数是个本地调用。如果一个远程服务收到“Hello Wor..

2021-05-31 09:35:03 80

原创 通用连接池帮你解决资源管理难题

前言群里老有同学问,go-zero 的 数据库 和 redis 库是否有连接池支持。先说结论:有的,可以放心大胆用!从框架设计来说,对于数据库连接这种资源当然是尽可能减少频繁操作:为业务减负提升框架自身的性能池化技术是一个通用化技术,本身就应该作为一个通用库支撑框架的上层业务所以不管是 sqlx,redis,以及 mongo,等以后可能要支持的数据源类型,底层的池化处理都是通用的;所以当开发者需要一个池化处理组件时,go-zero 也是提供的。池化技术支持的库就位于:core/resour

2021-05-26 08:34:56 18

原创 懂得取舍才是缓存设计的真谛

Previously前两篇文章(缓存稳定性 和 缓存正确性)跟大家讨论了缓存的『稳定性』和『正确性』,缓存常见问题还剩下『可观测性』和『规范落地&工具建设』稳定性正确性可观测性规范落地和工具建设上周文章发完之后,很多同学对我留的问题进行了深入的讨论,我相信经过深度的思考,会让你对缓存一致性的理解更加深刻!首先,各个 Go 群和 go-zero 群里有很多的讨论,但是大家也都没有找到非常满意的答案。让我们来一起分析一下这个问题的几种可能解法:利用分布式锁让每次的更新变成一个原

2021-05-24 08:58:00 9 1

原创 进程内缓存助你提高并发能力!

前言缓存,设计的初衷是为了减少繁重的IO操作,增加系统并发能力。不管是 CPU多级缓存,page cache,还是我们业务中熟悉的 redis 缓存,本质都是将有限的热点数据存储在一个存取更快的存储介质中。计算机本身的缓存设计就是 CPU 采取多级缓存。那对我们服务来说,我们是不是也可以采用这种多级缓存的方式来组织我们的缓存数据。同时 redis 的存取都会经过网络IO,那我们能不能把热点数据直接存在本进程内,由进程自己缓存一份最近最热的这批数据呢?这就引出了我们今天探讨的:local cache,本

2021-05-19 08:33:25 27

原创 缓存数据一致性 - 架构师峰会演讲实录

Previously缓存系统涉及的问题和知识点是比较多的,我主要分为以下几个方面来跟大家探讨:稳定性正确性可观测性规范落地和工具建设上篇 我们分析了缓存系统的稳定性,介绍了 go-zero 是怎么解决缓存穿透、缓存击穿、缓存雪崩问题的。比较浅显易懂,且具有比较强的实战意义,推荐一读。本文作为系列文章第二篇,主要跟大家探讨『缓存数据一致性』缓存正确性上篇文章提到,我们引入缓存的初衷是为了减小DB压力,增加系统稳定性,所以我们一开始关注的是缓存系统的稳定性。当稳定性解决之后,一般我们就会

2021-05-17 09:03:23 11 1

原创 如何让消息队列达到最大吞吐量?

你在使用消息队列的时候关注过吞吐量吗?思考过吞吐量的影响因素吗?考虑过怎么提高吗?总结过最佳实践吗?本文带你一起探讨下消息队列消费端高吞吐的 Go 框架实现。Let’s go!关于吞吐量的一些思考写入消息队列吞吐量取决于以下两个方面网络带宽消息队列(比如Kafka)写入速度最佳吞吐量是让其中之一打满,而一般情况下内网带宽都会非常高,不太可能被打满,所以自然就是讲消息队列的写入速度打满,这就就有两个点需要平衡批量写入的消息量大小或者字节数多少延迟多久写入go-zero 的.

2021-05-13 08:05:00 81 4

原创 缓存系统稳定性 - 架构师峰会演讲实录

前言大家好!我是万俊峰,go-zero 作者。感谢 ArchSummit 提供这么好的机会来跟大家分享一下go-zero的缓存最佳实践。首先,大家可以想一想:我们在流量激增的情况下,服务端哪个部分最有可能会是第一个瓶颈?我相信大部分人遇到的都会是数据库首先扛不住,量一起来,数据库慢查询,甚至卡死。此时,上层服务有怎么强的治理能力都是无济于事的。所以我们常说看一个系统架构设计的好不好,很多时候看看缓存设计的如何就知道了。我们曾经遇到过这样的问题,在我加入之前,我们的服务是没有缓存的,虽然当时流量还不算高

2021-05-10 10:31:38 23

原创 一文带你理解最简消息队列实现

最近在看公司的 redis queue 时,发现底层使用的是 go-zero 的 queue 。本篇文章来看看 queue 的设计,也希望可以从里面了解到 mq 的最小型设计实践。使用结合其他 mq 的使用经历,基本的使用流程:创建 producer 或 consumer启动 mq 生产消息/消费消息对应到 queue 中,大致也是这个:创建 queue// 生产者创建工厂producer := newMockedProducer()// 消费者创建工厂consumer := n

2021-05-07 10:12:47 28 1

原创 10行C++代码实现高性能HTTP服务

前言是不是觉得C++写个服务太累,但又沉迷于C++的真香性能而无法自拔?作为一个老牌C++程序员(可以看我 github 上十几年前的C++项目:https://github.com/kevwan ),这几天听一个好友跟我聊起他写的C++框架,说极简代码即可完成各种C++服务的开发,不禁让我心生好奇!于是我去研究了一下,发现确实有点意思!实战(干货)话不多说,我们来一起看看,10行C++代码怎么实现一个高性能的Http服务,轻松QPS几十万。Linus说:talk is cheap,show me t

2021-04-28 11:44:59 78 1

原创 一文带你更方便的控制 goroutine

上一篇我们讲了 go-zero 中的并发工具包 core/syncx。从整体分析来看,并发组件主要通过 channel + mutex 控制程序中协程之间沟通。Do not communicate by sharing memory; instead, share memory by communicating.不要通过共享内存来通信,而应通过通信来共享内存。本篇来聊 go-zero 对 Go 中 goroutine 支持的并发组件。我们回顾一下,go原生支持的 goroutine 控制的工具

2021-04-19 08:20:14 43

原创 更简的并发代码,更强的并发控制

有没感觉 Go 的 sync 包不够用?有没遇到类型没有 sync/atomic 支持?我们一起看看 go-zero 的 syncx 包对标准库的一些增值补充。https://github.com/tal-tech/go-zero/tree/master/core/syncxname作用AtomicBoolbool类型 原子类AtomicDurationDuration有关 原子类AtomicFloat64float64类型 原子类Barrier栏栅【将加.

2021-04-12 08:46:11 30

原创 极速精简 Go 版 Logstash

前言今天来介绍 go-zero 生态的另一个组件 go-stash。这是一个 logstash 的 Go 语言替代版,我们用 go-stash 相比原先的 logstash 节省了2/3的服务器资源。如果你在用 logstash,不妨试试,也可以看看基于 go-zero 实现这样的工具是多么的容易,这个工具作者仅用了两天时间。整体架构先从它的配置中,我们来看看设计架构。Clusters: - Input: Kafka: # Kafka 配置 --> 联动 go-

2021-04-06 08:09:30 113

原创 用 Go + WebSocket 快速实现一个 chat 服务

前言在 go-zero 开源之后,非常多的用户询问是否可以支持以及什么时候支持 websocket,终于在 v1.1.6 里面我们从框架层面让 websocket 的支持落地了,下面我们就以 chat 作为一个示例来讲解如何用 go-zero 来实现一个 websocket 服务。整体设计我们以 zero-example 中的 chat 聊天室为例来一步步一讲解 websocket 的实现,分为如下几个部分:多客户端接入消息广播客户端的及时上线下线全双工通信【客户端本身是发送端,也是接收端】

2021-03-31 13:04:35 62

原创 一文搞懂如何实现 Go 超时控制

为什么需要超时控制?请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义过长时间的服务端处理会占用过多资源,导致并发能力下降,甚至出现不可用事故Go 超时控制必要性Go 正常都是用来写后端服务的,一般一个请求是由多个串行或并行的子任务来完成的,每个子任务可能是另外的内部请求,那么当这个请求超时的时候,我们就需要快速返回,释放占用的资源,比如goroutine,文件描述符等。服务端常见的超时控制进程内的逻辑处理读写客户端请求,比如HTTP或者RPC请求调

2021-03-29 07:53:33 55

原创 分布式任务 + 消息队列框架 go-queue

为什么写这个库应用场景有哪些如何使用总结为什么要写这个库?在开始自研 go-queue 之前,针对以下我们调研目前的开源队列方案:beanstalkdbeanstalkd 有一些特殊好用功能:支持任务priority、延时(delay)、超时重发(time-to-run)和预留(buried),能够很好的支持分布式的后台任务和定时任务处理。如下是 beanstalkd 基本部分:job:任务单元;tube:任务队列,存储统一类型 job。producer 和 consumer 操..

2021-03-22 10:15:35 364

原创 一招让Kafka达到最佳吞吐量

通过上一篇文章对 dq 生产者*的分析,我们知道 dq 是基于 beanstalk 的封装。至于 *生产者 我们在后续的文章继续分享,本篇文章先来分析一下 go-queue 中的 kq。kq 基于 kafka 封装,设计之初是为了使 kafka 的使用更人性化。那就来看看 kq 的使用。上手使用func main() { // 1. 初始化 pusher := kq.NewPusher([]string{ "127.0.0.1:19092",

2021-03-17 10:15:28 94

原创 微服务多行查询之缓存策略

在上一篇 缓存设计的好,服务基本不会倒 介绍了db层缓存,回顾一下,db层缓存主要设计可以总结为:缓存只删除不更新行记录始终只存储一份,即主键对应行记录唯一索引仅缓存主键值,不直接缓存行记录(参考mysql索引思想)防缓存穿透设计,默认一分钟,防止缓存击穿和雪崩不缓存多行记录前言在大型业务系统中,通过对持久层添加缓存,对于大多数单行记录查询,相信缓存能够帮持久层减轻很大的访问压力,但在实际业务中,数据读取不仅仅只是单行记录,面对大量多行记录的查询,这对持久层也会造成不小的访问压力,除此之外

2021-03-15 08:19:30 57

原创 还在用crontab? 分布式定时任务了解一下

前言日常任务开放中,我们会有很多异步、批量、定时、延迟任务要处理,go-zero中有 go-queue,推荐使用 go-queue 去处理,go-queue 本身也是基于 go-zero 开发的,其本身是有两种模式:dq:依赖于beanstalkd ,适合延时、定时任务执行;kq:依赖于 kafka ,适用于异步、批量任务执行;本篇就先从 dq 开始,慢慢探究 go-queue 背后执行的逻辑。dq 简介dq 封装底层 beanstalkd 操作,分布式存储,延迟、定时设置。重启服务可以重新

2021-03-08 08:11:23 68

原创 使用Prometheus搞定微服务监控

最近对服务进行监控,而当前监控最流行的数据库就是 Prometheus,同时 go-zero 默认接入也是这款数据库。今天就对 go-zero 是如何接入 Prometheus ,以及开发者如何自己定义自己监控指标。监控接入go-zero 框架中集成了基于 prometheus 的服务指标监控。但是没有显式打开,需要开发者在 config.yaml 中配置:Prometheus: Host: 127.0.0.1 Port: 9091 Path: /metrics如果开发者是在本地搭建 P

2021-03-01 14:29:46 129

原创 缓存设计的好,服务基本不会倒

本文由『Go开源说』第四期 go-zero 直播内容修改整理而成,视频内容较长,拆分成上下篇,本文内容有所删减和重构。大家好,很高兴来到“GO开源说” 跟大家分享开源项目背后的一些故事、设计思想以及使用方法,今天分享的项目是 go-zero,一个集成了各种工程实践的 web 和 rpc 框架。我是Kevin,go-zero 作者,我的 github id 是 kevwan。go-zero 概览go-zero 虽然是20年8月7号才开源,但是已经经过线上大规模检验了,也是我近20年工程经验的积累,开.

2021-02-05 10:44:47 48

原创 go-zero解读与最佳实践(上)

本文有『Go开源说』第三期 go-zero 直播内容修改整理而成,视频内容较长,拆分成上下篇,本文内容有所删减和重构。大家好,很高兴来到“GO开源说” 跟大家分享开源项目背后的一些故事、设计思想以及使用方法,今天分享的项目是 go-zero,一个集成了各种工程实践的 web 和 rpc 框架。我是Kevin,go-zero 作者,我的 github id 是 kevwan。go-zero 概览go-zero 虽然是20年8月7号才开源,但是已经经过线上大规模检验了,也是我近20年工程经验的积累,开.

2021-02-03 11:14:57 340

原创 微服务实践之分布式定时任务

承接上篇:上篇文章讲到改造 go-zero 生成的 app module 中的 gateway & RPC 。本篇讲讲如何接入 异步任务 以及 log的使用。Delay Job日常任务开放中,我们会有很多异步、批量、定时、延迟任务要处理,go-zero中有 go-queue,推荐使用 go-queue 去处理,go-queue 本身也是基于 go-zero 开发的,其本身是有两种模式:dq: 依赖于beanstalkd ,分布式,可存储,延迟、定时设置,关机重启可以重新执行,消息会丢失,使用

2021-02-01 10:15:57 162

原创 企业项目迁移go-zero全攻略(二)

承接上篇:上篇文章讲到 go-zero 架构设计和项目设计。本篇文章接着这个项目设计,将生成的 app 模块 中 gateway 和 RPC 进行改造。废话不多说,让我们开始!gateway servicegateway 中我做了一些自定义,在端请求我们后台接口情况下,虽然多数情况是不需要关心错误码的,但是避免不了要某些场景还是需要根据固定错误码去做特殊处理,我自己定义了一个错误类,这个错误类只在 gateway 中使用:err.go:package xerrimport "fmt&q

2021-01-25 09:39:06 90 1

原创 别再问我们用什么画图的了!问就是excalidraw

每次发 https://github.com/tal-tech/go-zero 相关文章时,都会有读者问我们用什么画图的。这图什么工具画的呀?好看!这个手绘风格真好看,用啥工具画的呀?可不可以介绍下这个画图的工具?诸如此类的问题,所以我决定写篇短文介绍下我们最常用的画图工具 https://excalidraw.com/我们手绘风格的流程图、架构图等等都是通过 https://excalidraw.com/ 画的一个开源免费的画图软件个人目前看到的最舒服的画图软件支持多人协作一些

2021-01-23 11:51:28 1342

原创 企业项目迁移go-zero全攻略(一)

作者:Mikael最近发现 golang 社区里出了一个新兴的微服务框架。看了一下官方提供的工具真的很好用,只需要定义好 .api 文件模版代码都可以一键生成,只需要关心业务;同时 core 中的工具极大减少了开发成本。废话不多说,来看看这个微服务框架:go-zero起源聊聊与go-zero结缘最先接触go-zero是2020年10月国庆假期,说来也巧,看到有人在go-micro群中问go-zero情况,当时go-zero作者在群中就大概回答了一下,引起了我的好奇,当时公司用的go-micro1.

2021-01-21 10:02:23 224

原创 windows下如何玩转火热的go-zero

作者:阿啄debugIT前言go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go, iOS, Android,Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。这么牛,怎么不想去试一下?!go语言环境搭建配置GO语言环境新增go的代理GOPROXY=https

2021-01-14 11:39:51 72

原创 从代码到部署微服务实战(一)

当前微服务已经成为服务端开发的主流架构,而Go语言因其简单易学、内置高并发、快速编译、占用内存小等特点也越来越受到开发者的青睐,微服务实战系列文章将从实战的角度和大家一起学习微服务相关的知识。本系列文章将以一个“博客系统”由浅入深的和大家一起一步步搭建起一个完整的微服务系统该篇文章为微服务实战系列的第一篇文章,我们将基于go-zero+gitlab+jenkins+k8s构建微服务持续集成和自动构建发布系统,先对以上模块做一个简单介绍:go-zero 是一个集成了各种工程实践的 web 和 rpc 框

2021-01-06 08:53:00 117

原创 缓存原理与微服务缓存自动管理

抛开业务谈技术都是在耍流氓。—— Kevin Wan为什么需要缓存?先从一个老生常谈的问题开始谈起:我们的程序是如何运行起来的?程序存储在 disk 中程序是运行在 RAM 之中,也就是我们所说的 main memory程序的计算逻辑在 CPU 中执行来看一个最简单的例子:a = a + 1load x:x0 = x0 + 1load x0 -> RAM上面提到了3种存储介质。我们都知道,三类的读写速度和成本成反比,所以我们在克服速度问题上需要引入一个 中间层。这个中.

2020-12-30 10:34:20 106

原创 一个20年技术老兵的 2020 年度技术总结

大家好!我是 go-zero 作者 Kevin。充满惊吓的 2020 快要过去了,看到掘金上的技术人年度征文,忍不住文字记录一下艰辛而又充满收获的 2020 ✍️疫情开始春节假期疫情突然升级,我们面临着自身平台的转型升级。作为晓黑板CTO,有两个重点工作:保证大规模使用场景下平台的稳定性保证转型所需的新业务能够快速交付团队压力巨大的同时也感受到了前所未有的战斗热情,养兵千日用兵一时,不经历战与火的洗礼,怎么知道团队的技术能力是否能够经受得住流量洪峰的考验。战斗开始,迅速落实业务团队进行急需功

2020-12-28 09:16:03 124 1

原创 我用 go-zero 一周实现了一个中台系统,已开源!

作者:Jack最近发现golang社区里出了一个新星的微服务框架,来自好未来,光看这个名字,就很有奔头,之前,也只是玩过go-micro,其实真正的还没有在项目中运用过,只是觉得 微服务,grpc 这些很高大尚,还没有在项目中,真正的玩过,我看了一下官方提供的工具真的很好用,只需要定义好,舒适文件jia结构 都生成了,只需要关心业务,加上最近 有个投票的活动,加上最近这几年中台也比较火,所以决定玩一下,开源地址: https://github.com/jackluo2012/datacenter先

2020-12-21 09:13:06 385

原创 我用go-zero开发了第一个线上项目

作者:结冰前言​ 说在最前面,我是一个外表谦让,内心狂热,外表斯文,内心贪玩的一个普通人。我的职业是程序员,是一个golang语言爱好者,一半是因为golang好用,一半是因为其他语言学不好。我是从phper转为gopher的,写php的时候我认识了互联网软件,写go的时候感觉自己终于在编程。初见golang​ 我大学专业是软件。第一门编程语言是C++,知道了指针,知道了加减乘除,知道了编程去控制软硬件。后来选修了java,被ssh框架戏耍了一个暑假。再后来进入了一个社团技术部,再被ht

2020-12-18 07:00:42 1037 1

原创 微服务过载保护原理与实战

在微服务中由于服务间相互依赖很容易出现连锁故障,连锁故障可能是由于整个服务链路中的某一个服务出现故障,进而导致系统的其他部分也出现故障。例如某个服务的某个实例由于过载出现故障,导致其他实例负载升高,从而导致这些实例像多米诺骨牌一样一个个全部出现故障,这种连锁故障就是所谓的雪崩现象比如,服务A依赖服务C,服务C依赖服务D,服务D依赖服务E,当服务E过载会导致响应时间变慢甚至服务不可用,这个时候调用方D会出现大量超时连接资源被大量占用得不到释放,进而资源被耗尽导致服务D也过载,从而导致服务C过载以及整个系统雪

2020-12-16 09:11:39 94

原创 最简单的 K8S 部署文件编写姿势,没有之一!

1. 头疼编写K8S部署文件?K8S yaml 参数很多,需要边写边查?保留回滚版本数怎么设?如何探测启动成功,如何探活?如何分配和限制资源?如何设置时区?否则打印日志是GMT标准时间如何暴露服务供其它服务调用?如何根据CPU和内存使用率来配置水平伸缩?首先,你需要知道有这些知识点,其次要把这些知识点都搞明白也不容易,再次,每次编写依然容易出错!2. 创建服务镜像前一篇文章 讲解了如何快速创建自己的服务镜像,不过为了演示,这篇文章我们以 redis:6-alpine 镜像为例。3.

2020-12-14 09:00:30 62

原创 最简单的Go Dockerfile编写姿势,没有之一!

1. Dockerfile一些额外注意点选择最简单的镜像比如alpine,整个镜像5M左右设置镜像时区RUN apk add --no-cache tzdataENV TZ Asia/Shanghai2. 多阶段构建第一阶段构建否则构建出可执行文件,确保构建过程独立于宿主机第二阶段将第一阶段的输出作为输入,构建出最终的极简镜像3. 完整Dockerfile编写过程首先安装 goctl 工具GO111MODULE=on GOPROXY=https://goproxy.cn/

2020-12-10 14:19:39 104

原创 Go微服务实践之增删改查

从此篇文章开始,我们来陆续介绍 go-zero 开发一个项目所需要的组件和开发实践。首先我们从 model 层开始,来说说go-zero 的API以及封装细节。首先 model 层连接的API集中在core/stores。我们先来看看操作 mysql 这类数据库,API方法我们来到 core/stores/sqlx,所以接下来用几篇的文章总体介绍一下 sqlx 的使用和设计思想。快速使用func main() { // 1 const datasource = "user:pas.

2020-12-08 11:27:17 107 2

原创 基于gRPC的注册发现与负载均衡的原理和实战

gRPC是一个现代的、高性能、开源的和语言无关的通用RPC框架,基于HTTP2协议设计,序列化使用PB(Protocol Buffer),PB是一种语言无关的高性能序列化框架,基于HTTP2+PB保证了的高性能。go-zero是一个开源的微服务框架,支持http和rpc协议,其中rpc底层依赖gRPC,本文会结合gRPC和go-zero源码从实战的角度和大家一起分析下服务注册与发现和负载均衡的实现原理基本原理原理流程图如下:从图中可以看出go-zero实现了gRPC的resolver和balance

2020-12-07 00:05:06 129

实现模式 Implementation Patterns pdf

在这本新书《实现模式》里面, Kent Beck将自己多年形成的编程习惯以及阅读既有代码的体验凝练成了编程中的价值观、原则和77种实现模式。   沟通、简单和灵活的价值观应当被所有开发人员所铭记,无时或忘。局部影响、最小化重复、将逻辑与数据捆绑等原则同样是通用性的指导思想,比价值观更贴近编程场景,在价值观和模式之间搭建了桥梁。在77个实现模式中,每一个模式都覆盖了编写简洁、清晰、易扩展、易维护的代码这一原则的某个方面。它们为日常的编程提供了丰富翔实的参考依据,并告诉大家这些代码如何为降低沟通成本和提高有效产出提供保障。   本书适用于各个阶段的开发者群体,刚刚涉足软件开发领域的新人能够透过大师的眼睛来看待编程,了解编程的价值观与原则;而具有丰富经验的资深工程师则可以通过这些模式进行反思,探究成功实践背后的意义。把价值观、原则和开发实践结合之后,日常开发工作便会以崭新迷人的形式呈现在我们面前。

2011-04-11

测试驱动开发 test driven development by example chm

测试驱动开发是一种可以在开发过程中控制忧虑感的开发方法。我并非指那些毫无意义的没有必要的担忧──(pow widdle prwogwammew needs a pacifiew)──而是指合理的担忧,担忧是否合理是个很困难的问题,不能从一开始就看出来。如果说疼痛自然就会叫 “停!”,那么担忧自然就会说“细心!”。

2011-04-11

C++ header, cpp file, makefile and unit test code generator

发表于 2007-01-11 最后回复 2015-11-21

C++ header, cpp file, makefile and unit test code generator

发表于 2007-01-11 最后回复 2012-11-23

请问如何屏蔽网上发来的广告!

发表于 2003-06-29 最后回复 2012-11-23

c++头文件,cpp文件,makefile,unit test自动生成器

发表于 2006-11-03 最后回复 2007-01-12

关于sgistl的一点疑问!

发表于 2003-08-16 最后回复 2003-08-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除