使用 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 ...
类微博/微信朋友圈 feed 流系统设计
写扩散(push)
为每个用户维护一个订阅列表,记录该用订阅/关注的用户的消息的索引(一般为消息ID、类型、发布时间等基础数据)。
读扩散 (pull)
为每个用户维护一个发送列表,记录这个用户所有发布的消息索引。
混合模式 (push + pull)
使用场景写扩展更适用于粉丝/好友低于某个阈值的场景,比如刘亦菲子微博有将近7000万粉丝,如果采用写扩散的方式来做,那么每当她发布一条微博就会产生将近7000万条队列消息,试想一下如果有100个相同体量的微博博主,每天每个人发布一条微博就会产生7亿条队列消息,对消息系统的压力是巨大的。
同样的,读扩散则更适用于粉丝/好友高于某个阈值的场景。
在一个庞大的类微博 feed 流系统中更合适的场景应该是基于某个阈值,同时使用读扩散和写扩散来实现内容的发布和拉取。
缓存feed list 缓存可以使用 redis 的 zset 结构存储
1zadd user_id 1618035919 creator_id:feed_id
使用 Kubeadm 部署 Kubernetes 集群
环境大于等于两台2C4G的CentOS7.8 Linux 服务器
PS:如果本地资源不够,可以去阿里云开几台ECS,选按量付费。2c4g,5M带宽最低配大概每小时不到1块钱。
部署前准备关闭 firewalld 和 selinux123456setenforce 0sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/configsystemctl stop firewalldsystemctl disable firewalld
安装 ipvs 内核
todo ipvs 和 iptables 区别
1yum -y install ipvsadm ipset sysstat conntrack libseccomp
设置开机默认加载配置文件
1234567891011121314151617cat >>/etc/modules-load.d/ipvs.conf<<EOFip_vs_dhip_vs_ftpip_vsip_vs_lblcip_vs_lblcrip_vs_lcip_vs_nq ...