浅读 Go 优秀开源项目源码—Gin框架
Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。
Gin 是目前 Go 里面使用最广泛的框架之一了,弄清楚 Gin 框架的原理,有助于我们更好的使用 Gin。通过浅读 Gin 框架源码,大致总结一下它的一些核心实现。
从一个 Demo 入手下面这段代码便是使用 Gin 编写一个简单的只有一个接口的 Go server 端程序,详细使用方式参考官方文档:Gin Web Frameword
123456789101112131415161718192021222324252627package mainimport ( "fmt" "log" "time" "github.com/gin-gonic/gin")func main() { r := gin.Default() // 注册路由 r.GET(" ...
基于 Consul 实现 gRPC 服务注册与发现
什么是服务注册与发现,为什么需要服务注册发现
服务注册
服务进程在注册中心注册自己的元数据,一般包括 Host 和 Port,有时候还有身份验证信息,协议,版本号以及运行环境等信息。
服务发现
客户端进程向服务注册中心发起查询,来获取依赖的服务的信息,然后向其发送请求。服务发现一个重要的作用是提供给客户端进程一个可用的服务列表。
简单的说,当服务A需要依赖服务B时,服务发现中间件需要告诉服务A哪些地址是服务B的可用地址,这就是服务注册发现需要解决的问题。
服务注册
客户端注册
服务自身负责注册与注销工作,当服务启动后注册线程向注册中心注册,当服务停止时注销自己。
代理注册
当服务启动后以某种方式通知代理服务,代理服务向注册中心发起注册工作。
健康检测
被动检测
服务主动向注册中心发送心跳消息,时间间隔可以自定义。注册中心如果在指定周期内未收到服务节点的心跳消息,则将其从该服务可用节点列表中移除
主动检测
服务注册中心指定时间间隔内向所有列表中的服务节点发送心跳检测,如果指定周期内未成功则主动移除该节点。
服务发现
客户端发现
客户端向注册中心发起请求查询 ...
使用 Opentracing 实现 Golang 链路追踪
为什么需要链路追踪在微服务架构系统中,请求在各服务之间流转,调用链路错综复杂,一旦出现了问题和异常,定位问题相当困难。链路追踪系统可以追踪并记录请求在系统中的调用顺序、调用时长等一系列关键信息,从而帮我们更简单的定位服务异常。
OpentracingOpentracing 是分布式链路追踪的一种规范标准,是 CNCF(云原生计算基金)孵化的项目之一。和一般规范标准不同,Opentracing 不是传输协议、也不是消息格式上的规范标准,而是一种语言层面上的 API 标准。只要在某链路追踪系统实现了 Opentracing 规定的接口,符合 Opentracing 定义的表现行为,那么就可以说该应用符合 Opentracing 标准。这意味着,开发者只需要修改少量的配置代码,就可以在符合 Opentracing 标准的链路追踪系统之间自由切换。
数据模型SpanSpan 是一条链路追踪的基本组成要素,一个 Span 表示一个独立的工作单元,比如一次函数调用,一次 RPC 请求,Span 会记录一些基本要素:
操作/行为名称
开始时间
结束时间
Tags(一组零个或多个 key: ...
「在一个内卷的时代,我们该如何谈论幸福」课堂笔记
整堂课的“题”,老师整体上是基于罗曼罗兰的这句话展开的:
世界上只有一种真正的英雄主义,就是当你认清了生活的真相后,你仍然还热爱它。
为什么会内卷
内卷是一种在资源有限,且没有增量资源的情况下,整个社会对存量资源争夺加剧的一种社会现象。
资源有限,对资源的需求无限。
所以内卷出来之后出来一个词,就是躺平。我卷不动了肯定就躺了,我不想跟你争夺了,我就要躺平啊。
高校里的编制为什么那么困难,编制就是那么点有限的,争夺这些编制的人多着呢,他不提高要求的话怎么筛选啊。
只不过是因为时间的变化、社会的发展,对我们每个人的要求越来越高了。
鸡娃现象
是我们的内心不够坚定,被这种教育的洪流给带跑了。
幸福为什么那么难生物学家在解析幸福的时候是把这个问题指向动物和人类的身体机制的。生物学家举了一个例子:
大马哈鱼,溯江而上,产卵而死。我们身上的这种身体机制为了繁衍连母体的生命都可以牺牲,幸福怎么可以被称为重要的追求呢。
自然选择出的生理机制只是服务于人类生存的繁衍,根本就没有增加这种幸福快乐的考虑。然而,我们产生了一种错觉,就是我们小的时候很幸福呀。人类在幼儿阶段是最明显的一个动物性的阶段。 ...
Kubernetes 集群部署最新版 Ingress-Nginx
简介
ingress-nginx 是 Kubernetes 的入口控制器,使用 Nginx 作为反向代理和负责均衡器。
如引用所写的那样,ingress-nginx 其实就是使用 Nginx 作为 Kubernetes 集群入口的反向代理和均衡器。对于 Nginx 我们应该都很熟悉,或者说至少不陌生。那么什么是ingress呢。
什么是 Ingress
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。Ingress 公开了从集群外部到集群内部服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源定义的规则控制。
下图是一个将所有流量发送到同一个 Service 的简单 Ingress 示例:
Ingress 资源和所有其他 Kubernetes 资源一样,Ingress 需要使用apiVersion、kind、metadata字段,Ingress 通常使用注解(annotations)来配置一些选项,具体取决于 Ingress 控制器,不同的 Ingress 控制器支持不同的注解。
Ingress 规约 提供了配置负 ...
使用 Helm 在 Kubernetes 集群安装最新版 Traefik
简单介绍
Traefik 是一个开源的边缘路由器,他负责接收系统的请求,然后使用合适的组件对这些请求进行处理。
下图为 traefik 的架构图,traefik 的官方文档地址是:https://doc.traefik.io/traefik/
核心概念providersTraefik 中的配置发现是通过 Providers 实现的,Provider 可以是编排工具、容器引擎、或者 KV 存储等。
支持的 Providers 文档:https://doc.traefik.io/traefik/providers/overview/#supported-providers
entrypointsentrypoints 是 Traefik 的网络入口点,他们定义了将接收数据包的端口,以及侦听 TCP 还是 UDP。
配置文档参考:https://doc.traefik.io/traefik/routing/entrypoints/
routers路由器负责将传入请求连接到可以处理他们的服务,在这个过程中可能会使用中间件来更新请求,或者在将请求转发给服务之前做一些处理。
配置文档参考 ...
Kubeadm 安装 Kubernetes V1.22.2 踩坑手记
记录一下最近在云服务器上折腾最新版 Kubernetes 遇到的一些坑。
使用 Docker 作为 Container Runtimecgroup 驱动
kubeadm 支持在执行kubeadm init时,传递一个KubeletConfiguration结构体,KubeletConfiguration结构体包含cgroupDriver字段,用于控制 kubelet 的 cgroup 驱动。
注意:如果没有在KubeletConfiguration中设置cgroupDriver字段,kubeadm init会将它设为默认值systemd。
Kubernetes 官方推荐使用systemd设为默认 cgroup 驱动。
特别注意:如果使用Docker作为容器运行时,Docker 默认的驱动类型为cgroupfs,需要修改成native.cgroupdriver=systemd。
编辑/etc/docker/daemon.json文件,修改 docker 的 cgroup 驱动类型
12345{ "exec-opts": ["native ...
上海居住证积分流程梳理
因为一些不重要的原因最近在办上海居住证积分,顺便整理下流程,方便后面其他人可以参考。
居住证就是自己想办法办居住证(因为上海的房东嫌麻烦很少有愿意给办的,但总归有办法。)
积分办理1. 联系你司的相关人事专员,他会帮你通过公司名义在上海人力资源和社会保障公共服务平台上注册你的个人账号并告知你。2. 你通过该账号和对应密码登录上海人力资源和社会保障公共服务平台,然后填写几页个人信息(备注:这上面有两项住址信息,一个是户籍所在地也就是身份证上地址,一个是你办理的上海市居住证上的地址,务必一字不差填对)。
备注: 此处填写的个人经历,如果之前公司社保有代缴或者自己找的代缴,一定要填写实际代缴的公司信息,不然会被打回的(我就是遇到了这个问题!)。具体社保缴费记录可以参考这个链接查看明细:https://www.sohu.com/a/409435421_120209938
3. 填写完成后告知人事专员,让他帮看下有没有问题,有的话做修改。没问题他会告知你按照这个网址上的内容准备材料: http://jzzjf.rsj.sh.gov.cn/jzzjf/pingfen/bszn4.jsp 。因 ...
Redis 知识梳理
数据结构常用的五种类型
String
常用命令
get、set、incr、decr、mget
使用场景
key-value缓存
计数
Hash
redis hash 是一个String类型的field和value映射表。
常用命令
hget、hset、hgetall
使用场景
用户对象信息
List
list 是简单的字符串列表,我们可以在列表的头部或尾部插入元素。
实现方式
双向链表,redis的list的每个元素都是String类型的双向链表
常用命令
lpush(左进)、rpop(右出)、rpush(右进)、lpop(左出)、lrange(获取列表片段lrange key start end)
使用场景
粉丝列表
消息队列
Set
set 是String类型的无序集合,集合是通过hashtable实现的。与数学中的集合类似,redis 中的集合可以取交集、并集、差集等。因为set中的元素是没有顺序的,所以对 set 的添加、删除、查找的复杂度都是O(1)
实现方式
Set内部实现是一个 value 永远为 null 的HashMap。
...
Kafka 知识梳理
kafka 是一种高吞吐量,分布式,基于发布/订阅的消息系统。
特点
吞吐量高、延迟低
每个topic可以支持consumer group(多个consumer)对partition进行操作
扩展性好
集群支持热扩展
持久性、可靠性好
消息数据是被持久化到本地磁盘的,并且支持数据备份
高并发
支持千级别客户端同时读写
核心概念
Broker
kafka 服务器,负责消息存储和转发
Topic
消息主题,用于分类消息
Partition
topic的分区(sharding),每个topic可以有多个partition,对应topic的消息保存在这些partition上,单partition的消息是有序的。同一个topic的多个partition不保证有序。
Offset
消息在partition上的位置,也表示消息的唯一序号。
Producer
消息生产者
Consumer Group
消息消费者consumer的组
Controller BrokerKafka使用Zookeeper保存了集群的broker、topic、partiti ...