自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 如何高效地select读取任意数量的channel

什么?!你还在为每个chan创建一个协程?!你out啦!

2024-01-30 17:33:58 911

原创 深入浅出理解go反射

反射与显式编码不同,具有较高的抽象程度,而且需要充分理解堆、指针、接口等这些概念,确实是一个难点。如果你觉得写反射代码无从下手,或者尝试修改反射对象值时各种panic,通常就是没有理解反射的三定律。尤其是其中提到的settable,以及reflect包中隐含的addressable、interface-able等概念,如果这些戳中了你的痛点,那这篇文章正是你的菜。

2023-08-08 22:40:59 129

原创 go中如何在json序列化/反序列化时保持对象的顺序

最近在用go重写一个java应用时,遇到了这个问题:原来的java程序返回的数据包含json规格的业务数据,以及一个基于该json串的md5指纹,客户端收到go返回的json数据后,首先验证签名正确,再解析json。json的解析过程符合典型的下推自动机模型,好在encoding/json中已经实现了scanner,并且decoder开放了json token的读取接口,而我们只要使用系统栈结构,稍加应用就可以实现这个PDA。因为json标准中是不要求对象顺序的,但实践中却不一定。

2023-07-27 13:36:01 2672

原创 2022总结

临近年关,辞旧迎新,开年计划年年做,能否执行到头是个问题,善始者众,善终者寡,这篇就对今年做个了结。

2023-01-16 23:52:08 326

原创 对B站故障的其他思考

7月B站公布了对去年一起故障的全面复盘,。文章记录了故障的详细处理过程和崩溃的原因。正好今年在对envoy的扩展中也进行过实践。虽然引发故障的代码是只有7行的计算最大公约数的函数,但这7行代码并不简单,故障原因B站已经分析清楚,这里聊点文章中没有提到的内容。

2022-09-23 14:00:57 447

原创 理解OAuth2授权模型

在客户端-服务器通信过程中,服务提供者通常都保存着客户的数据资产,比如你的个人信息、外卖订单、聊天记录、消费记录等,显然这些数据是非常私密且敏感的。作为提供服务的一方,服务端对这些数据具有保密性的义务,本质上它们属于用户的个人资产。因此服务提供者需要在客户端访问这些数据时,验证访问者确实是这些数据的拥有者..................

2022-08-02 08:02:49 1775

原创 理解网络流中的反向弧

在刚学习网络流时,反向弧的概念困惑了我很久,因为在有向网中,弧或者边是有方向的,沿着弧的反方向推进流量虽然在计算上行得通,但是不理解这样做的意义。由于手边的参考书籍主要侧重实践,对反向弧的用途并未进行过多解释,本文旨在解释说明反向弧在最大流计算中的意义。..................

2022-07-19 13:55:16 1572 2

原创 AOE网络关键路径求解的通俗理解

AOE网络是一种以边主导的活动网络,简单来说是一种有向加权图,通常有一个起点(源点)和一个终点(汇点),中间顶点表示某个事件,或叫里程碑,而有向边叫做活动,AOE网络通常可以用来表达某些带有前驱后继关系的一系列活动。关键路径是指影响最终活动进程的所有活动构成的路径,求解AOE网络的关键路径,可以使活动时间安排更合理,也更容易找出网络中的瓶颈并加以改进。番茄炒蛋想必很多人都做过,虽然过程可能有点差异,但是主流做法基本一致,下面以一顿饭为例,来说明AOE关键路径的计算。......

2022-07-14 13:57:52 3325

原创 基于压缩字典树RadixTree实现API路径匹配

年初网关这块出于多方面的考虑,希望重构API网关的路由匹配实现,我们的API采用restful风格,在路径中存在参数,称之为API模板。在网关层,后端服务注册开放出去的API,要遵守API模板的约束。网关的一个主要职责,就是将请求path匹配到指定的API(模板)上,并将请求转发给注册了该API(模板)的后端服务。如果没有匹配到,则说明是一个无法识别的请求,并予以拒绝。先来看下api模板长什么样子RFC6570中约定了多种leve...............

2022-07-11 12:34:05 592

原创 100行代码实现加权负载均衡算法(WRR)

轮询算法round-robin是很基础的负载均衡算法,实际应用中wrr更为常见,但一般不需要自己实现,因为一般需要rr的场景,都已经在基础设施层面进行了支持,比如lvs或nginx通过配置即可实现,但业务上偶尔也需要自己实现负载均衡,所以有必要了解一下其技术原理。谈到wrr的应用场景,一般是服务器配置存在差异时,比如集群里有一个2C4G和一个4C8G,那么我们希望4C8G能承担更多的业务请求。或者是,我们希望通过无条件的流量分发,在集群的一台机器上小范围的导入一些流量进行一些实验。我碰到的场景是,在网关层

2021-12-23 20:11:09 2688

原创 curl获取请求时间统计

在测试http服务时,通常会使用curl想服务器发起http请求,curl会模拟浏览器的请求,也会帮助你与服务器建立tls/ssl连接。有时我们希望得到请求过程中的耗时,来优化客户端的体验,这时一般会用到curl的-w参数。curl的统计指标根据curl手册中的说明,curl允许我们在-w参数后指定一个文本,文本中可以包含%{MACRO}形式的参数,curl会将实际的请求耗时,替换到这些宏当中。虽然也有一些文章描述该功能,但是对于耗时这块往往描述的不明确,甚至是错误的,为了验证耗时的真正含义,我使用-

2021-11-17 14:11:04 3674

原创 Latex基础语法简介与快查

latex是基于tex的排版系统,主要用来表达数学符号,自从自己的笔记从纯文本改为markdown格式后,发现可以更加优雅的记数学书的笔记了。此前一直觉得这东西好难啊,了解了之后才发现,难的是数学,不是latex????。整理了一下最近用到的latex语法,即使没有任何基础,10分钟就能写出漂亮的复杂公式,这投入产出比还是相当可观的。环境工欲善其事,必先利其器,我使用vscode作为记录笔记的工具,安装如下两个插件,可以实现代码提示和预览Markdown All in OneMarkdown P

2021-11-02 17:35:43 2381

原创 如何从docker容器内访问宿主机

最近搞envoy代理,拉了envoyproxy/envoy:latest的镜像,本地进行了一次测试,但是碰到了代理失败的情况,记录一下整个过程。配置代理参考envoyproxy官方前端代理示例配置作为蓝本,改成了自己的配置。内容如下:static_resources: listeners: - address: socket_address: address: 0.0.0.0 port_value: 9901 filter_chains:

2021-11-02 13:55:48 8409

原创 记编译/部署k8s官方离线文档

在线查看文档实在是太慢了,文档之间往往有相互链接引用,有时候看到一个术语链接,跳过去等半天,以至于内容加载完后都忘了想看什么了。正好看到k8s提供离线文档,也给出了本地运行网站的说明,索性就部署一个本地网站部署按照官方文档,使用容器方式运行,确保本地安装了docker desktop,并启动git clone https://github.com/kubernetes/website.gitcd websitegit submodule update --init --recursive --de

2021-10-28 11:44:37 639 1

原创 go泛型初探

前言前不久Go的主线版本合并了泛型Feature,此前对泛型的呼声很高,泛型会带来强大的扩展能力,看C++的STL库就可见一斑,动态类型语言通常没有这方面的需求,因为对于像python来说,他的函数的入参类型可以是任意的,像Go、C++这种静态类型语言,则需要编译器的支持来实现泛型。这篇文档准备来尝试一下主线版本的泛型功能。但是在此之前,先来考虑一个问题泛型和interface什么关系与区别?很遗憾在我写C++代码时没有考虑过这个问题,因为与go的interface对应的,往往被认为是void*。但v

2021-10-15 16:18:54 2417

原创 AES加解密基本原理

1. 概述在网络通信中,经常会用到加解密技术,其中AES加解密算法是比较广泛的应用于大块数据的对称加解密算法,本文主要介绍AES算法的一些基本原理,目标是为了建立对AES算法的概念认知,这里不打算对算法的数学原理进行阐述。2. 术语名词释义AESAdvanced Encryption Standard,高级加密标准,一种对称加密算法。最早由美国NIST发起,广泛征集替代DES的加密算法,最终Rijndael算法族胜出,而AES则是源于该算法的变体标准。目前被广泛应用于互联网。

2021-10-09 18:06:05 8061

原创 Go基于反射实现任意结构json值的替换

最近面临一个应用场景,需要对一个倒手转发的json进行数据替换,查阅了众多的库,大部分都不支持这个功能,从历史项目里捞出了jsonpath这个库,但只能根据jsonpath的schema进行Get操作,无法inplace回写,后来又找到sjson,这是个根据jsonpath回写的库,没有用反射,自己实现的parser,但是在数组、对象混合嵌套的结构中,没办法正确写入,因为在使用gjson提取值之后,已经丢失了原始路径信息。在经过一番折腾之后,还是决定自己写一个替换器,虽然反射效率会比较低,但是好歹能实现,也

2021-09-14 07:26:27 1370

原创 高可用系统的基本概念

高可用系统的一些基本概念高可用系统的定义定义故障原则1. 消除单点故障2. 可靠的交叉点服务3. 提前检测故障并快速恢复挑战状态一致性故障的快速恢复高可用性的量化今天被问及高可用系统的一些概念,虽然能说出一些名词,和自己遇到的场景。但是对名词的概念性描述、量化的描述并不清楚,诸如SLA,怎么定义几个9,什么是高可用系统等概念,所以整理一篇CheatSheet短文,弄明白一些基本的概念,也算是系统性了解高可用设计的一个入门。高可用系统的定义定义Wiki对高可用系统的描述是这样的High avail

2021-07-06 11:02:01 1508

原创 Go Slice与append原理

一. 引言最早在go设计的初期,设计者们花了一年的时间对array类型的定义进行讨论,因为像其他语言一样,数组一般被设计为定长的、长度属于类型的一部分的用来描述线性地址空间的数据结构,但是这种定长类型对于使用者比较受局限,所以类似像C++这样的语言会出现vector这样的数据结构,来弥补数组在动态特征方面的不足。go语言的设计者不希望对array进行差别定义,这样会增加其他语言迁移过来的学习者的理解成本,同时也不希望放弃线性数据结构的动态化特性,所以引入了slice这一概念,这就是slice的诞生背景。

2021-06-03 17:02:28 1933

原创 interface能否用作map的key

很久之前面试时,有面试官表示,interface、指针不能用于map的key,当时不解,interface确实不太清楚,不过指针不就是uint64变量吗,难道uint64不能作为key吗?今天忽然回想起来,决定搞搞清楚。先说结论:根据Andrew Gerrand在2013年的Go maps in action【1】一文中,对于Key type进行了明确说明:As mentioned earlier, map keys may be of any type that is comparable. The

2021-05-18 09:47:48 2074

原创 Golang标准库:errors包应用

一. 概述errors包是一个比较简单的包,包括常见的errors.New创建一个error对象,或通过error.Error方法获取error中的文本内容,本质上在builtin类型中,error被定义为一个interface,这个类型只包含一个Error方法,返回以字符串形式返回错误的内容。所以,可以很容易的定义自定义的错误类型,并在返回error接口的方法中返回。// 示例代码func Oops() error { return errors.New("iam an

2021-03-17 13:43:41 1152

原创 Go的反射定律

源自官方博客一篇文章《The Laws of Reflection》,主要是对于interface类型和反射的一些概念性定义,以下内容仅用于个人记录,如果没有读过原文可能阅读体验不好,请谅解。类型与接口go是静态类型语言go是强类型语言别名类型也必须强转才能赋值类原类型interface类型可以持有任意实现其方法的类型实例的值interface{}其实是含有0个方法的接口类型,可以这样理解,任意类型都实现了0个方法,所以它可以表示任意类型,这是个极端例子尽管如此,interface{}并不是

2021-03-15 22:32:55 151

原创 redis分布式锁与redsync库源码分析

redis官网推荐的go版本分布式锁实现,标准的官方redlock算法实现,引用了goredis和redigo库作为redis client。先简单介绍下redlock算法。redlock算法单点场景首先来看单redis实例的场景,这是集群模式的基础。这种场景下实现分布式锁比较简单:加锁:各节点通过set key value nx ex即可,如果set执行成功,则表明加锁成功,否则失败,其中value为随机串,用来判断是否是当前应用实例加的锁;nx用来判断该key是否存在,ex用来指定锁的过期时间,

2021-03-04 14:10:35 2118 4

原创 计算时间重叠次数的优化

有这样一种场景,在一个直播间内,在一个较长的时间内,有人加入群聊,也有人离开,在直播间的整个生命周期内,会产生很多的访问记录,这些记录都有进入时间和离开时间,业务场景是需要计算在直播间存续期间,在线人数最多的时间段,以及人数。由于项目中直播间实际会控制最大人数在6人,而直播间存续时长一般也不会超过24小时,所以开始时偷了点懒,采用暴力方式处理,思路如下:遍历所有的时间段,将时间段按照起始/结束时间分割,比如(9:15-9:20)(9:18-9:30),分割后变成了(9:15-9:18),(9:18-9:

2021-02-23 18:49:27 810

空空如也

空空如也

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

TA关注的人

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