初识Golang汇编
0. 为什么写本文在分析go的某些特性底层功能实现时发现:很多跟runtime运行时有关,而要掌握这一部分的话,有一道坎是绕不过去的,那就是Go汇编。索性就查阅了一些资料,在阅读之余整理总结了一下,并分享给大家。
(本文使用Go版本为 go1.14.1)
1. 为什么需要汇编众所周知,在计算机的世界里,只有2种类型。那就是:0和1。
计算机工作是由一系列的机器指令进行驱动的,这些指令又是一组二进制数字,其对应计算机的高低电平。而这些机器指令的集合就是机器语言,这些机器语言在最底层是与硬件一一对应的。
显而易见,这样的机器指令有一个致命的缺点:可阅读性太差(恐怕也只有天才和疯子才有能力把控得了)。
为了解决可读性的问题以及代码编辑的需求,于是就诞生了最接近机器的语言:汇编语言(在我看来,汇编语言更像一种助记符,这些人们容易记住的每一条助记符都映射着一条不容易记住的由0、1组成的机器指令。你觉得像不像域名与IP地址的关系呢?)。
1.1 程序的编译过程以C语言为例来说,从hello.c的源码文件到hello可执行文件,经过编译器处理,大致分为几个阶段:
编译器在不同的阶段会做不同的事情,但 ...
我眼中的C语言及其起源
0. 为什么写这篇文章一直想写一篇关于C语言的文章,里面包含C语言的发展史、创始人等相关事迹。但是却迟迟未写,主要原因是因为:在我看来,这个语言太过于伟大、耀眼。作为一个仅仅使用过C语言的普通开发来说,完全没资格去写。但是,最近在看过一篇丹尼斯.里奇写的《C语言发展史》之后,坚定了我写这篇文章的决心。不是歌功颂德,仅仅是以一种客观的视角去欣赏。
1. C语言发展史任何一种新事物的出现都不是来自于偶然,而是时代所驱使的必然结果。
1.1 C语言有多伟大如果你问我:C语言有多伟大。那么,我可能会想一下,说:多伟大我不知道,但是我知道很伟大。
这里,我想说一句可能有点片面的话,就是:如今这世界上,凡是带电的地方,可能都会有她(C语言)或者她的子孙的影子。
任何比C语言更低级的语言,都不足以完整地抽象一个计算机系统;任何比C高级的语言,都可以用C来实现。
1.2 C语言之父
Dennis Ritchie
Ritchie贝尔实验室的个人主页地址 https://www.bell-labs.com/usr/dmr/www/index.html丹尼斯·麦卡利斯泰尔·里奇(英语:Denni ...
通过礼品卡购买美区AppleID付费App
前提说明首先,能够打开这篇文章,笔者默认你知道文章标题的含义。其次,要有一个美区AppleID。
那么,接下来一起看看怎么通过礼品卡购买Apple付费APP吧。
礼品卡购买步骤
注意: 演示操作中使用的邮箱 ivansli100#hotmail.com 为笔者的邮箱,一定要改成你们自己的。
[1] 登录苹果官网礼品卡页面,选择礼品卡发货方式https://www.apple.com/shop/buy-giftcard/giftcard
国内用户,选择邮箱即可
[2] 选择礼品卡卡面样式以及礼品卡金额(最低是10美元)
[3] 填写礼品卡收件人和发件人信息,包括名字和邮箱
发件人信息就可以随便,关键是收件人的邮箱,一定要能接收到苹果给你发送的邮件(最好是AppleID邮箱)。点击 Add to Bag 进入到 Check Out 页面。
[4] 检查信息没问题就 Check Out
[5] 选择登录账号购买 or 游客身份购买,都行
笔者这里选择方式2,游客身份购买。
[6] 付款方式需要一张外币(Vias、MasterCard)信用卡,国内很多银行都可以申请。
[7 ...
分布式ID的5种生成方式以及Go源码中的一种应用
关于分布式ID从目前互联网的系统架构来看,大部分公司为了避免服务节点出现单点故障、保持高可用、高性能等特性,在部署服务时都会部署多个节点,每个节点承担整个服务的一部分请求。对于同一服务多个节点中的每个节点来说,提供的功能相同。节点在处理数据的过程中会根据不同的业务场景,操作相同或不同的数据源。
对于操作相同的数据源,则会形成数据竞争(大部分情况下需要加锁、串行执行)。对于操作不同的数据源,则可以并行/并发处理(无需加锁)。
对于某些场景下的数据资源,需要有全局唯一的数据资源标识。例如:电商系统中的订单ID号、聊天群组中的消息ID号、上传文件到存储系统中之后生成的文件ID号、用户注册系统中的用户ID号、商户系统中的商户ID号、开放平台中的开发者账号ID等等场景。
这些ID号在分布式系统架构中,可以统称为分布式ID。
常见的5种分布式ID生成方式按照是否需要协调(co-ordination)节点,生成分布式ID的方法可以分为2大类:
不需要联网,单服务节点可以在本地生成
需要联网,依赖协调节点生成
这2大类中又可以细分出来多种具体的实现方式,汇总如下图所示:
图片来自:bl ...
Protobuf Name Conflict 分析与解决
问题背景最近,在对老项目进行重构工作。在重构过程中发现需要通过 grpc 调用若干远端微服务,远端微服务都有提前定义好的 proto,在运行时(编译通过,运行则panic)出现了 name conflict 冲突问题。也就是说,在运行时报错提示存在相同名称的 message 消息体。
具体报错信息,如下所示:
1234567891011121314151617181920212223242526➜ app > go mod tidy ➜ app > go build main.go ➜ app > ./main api startpanic: proto: file "usermgt.proto" has a name conflict over pb.Response previously from: "eslServer/pkg/microgrpc/merchant/pb" currently from: "eslServer/pkg/microgrpc/usermgt ...
初识MQTT与mosquitto
最近,接手一个新的项目 —— 电子价签。对于电子价签的常见架构,阿里云有一篇文章描述的非常详细(网址见文章末尾),里面包含一个核心的概念 MQTT。由于第一次接触MQTT,特此整理相关知识点,以备后用。
MQTT是什么MQTT (Message Queuing Telemetry Transport 消息队列遥测传输),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。
mqtt官网 https://mqtt.org
MQTT 是 IBM 推出的一种针对移动端设备的基于 TCP/IP 的发布、订阅协议
可以连接大量的远程传感器和控制设备(MQTT特点是可以保持长连接,具有一定的实时性)
云端向设备发送消息,设备端可以在最短时间内接收到并作出响应
MQTT 适合需要实时控制的场合
MQTT协议特性
使用发布、订阅消息模式。提供一对多的消息发布,解除应用程序耦合
有三种消息发布服务质量(QoS0、QoS1、QoS2)
最多一次 消息发布完全依赖底层 TCP/IP 网 ...
认识CDC工具go-mysql-transfer
1.认识CDCChange Data Capture(简称CDC):其主要作用是用来捕获数据的变更,在数据发生变化之后,把变更后的数据同步到其他异构数据服务中。例如:通过订阅MySQL中binlog日志,将MySQL中发生变化的数据同步到Redis、kafka、Es等存储服务中。
在现实开发中有一些场景会用到CDC工具,例如:
数据库数据发生变化,异步更新缓存
业务中同时更新DB、cache,需要考虑边缘问题(面试问题:数据库、缓存不一致时如何解决?)
数据存储到MySQL之后,需要同步到ES以便可以使用全文检索
MySQL对全文搜索支持的不是很好,通常全站搜索都会使用ES来做搜索引擎
大数据分析 Warehouse, 实时同步数据,离线分析等等
> 图片来自 DDIA
如果不使用CDC工具处理数据,需要在业务中耦合数据同步的逻辑。数据存储与数据同步到其他服务这两个操作,往往需要包含在同一个事务中,否则可能会造成一个成功、一个失败,从而导致数据的不一致性。而为了处理这些问题需要写很多的兼容代码,也就导致了非业务操作耦合到业务中,会对项目造成一定的负担。
所以,最好 ...
docker desktop 安装 K8s 时遇到的一些问题
使用 docker desktop 在 Mac OS 上搭建 Kubernetes 环境比较简单,但是搭建过程中可能会遇到一些问题,问题解决起来就没有那么简单,特此整理相关内容以备后续之需。
笔者第一次在Mac上搭建花了一天时间
1.下载/安装 docker desktop① 下载 docker desktop
12345# 地址1https://hub.docker.com/search?type=edition&offering=community&q=# 地址2https://www.docker.com/get-started/
② 安装成功之后,查看版本信息
2022/06/29
Engine: 20.10.16Kubernetes: v1.24.0
2.配置docker源 & 下载Kubernetes镜像①下载 k8s-for-docker-desktop
1git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop
在 ...
gitlab+reviewdog+golangci-lint实现提交MR时进行代码检测
本文使用 shell 作为 gitlab-runner 执行器 (executor) 演示提交 MR 时执行代码检查。
gitlab搭建参考文章:<基于docker搭建的gitlab实现CI/CD>,本文只是把文章中 runner 执行器由 docker 变成了 shell。
1.准备工作
安装gitlab-runner、reviewdog、golangci-lint
123456#安装 gitlab-runnercurl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash#安装 reviewdogcurl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s#安装 golangci-lintcurl -sSfL https://raw.githubusercontent.com/golangci/go ...
golangci-lint配置与使用
1.golangci-lint是什么golangci-lint按照官方的说法是用于go语言的代码静态检查工具集(因为包含它多种 Go 代码检查工具)。
官网 https://golangci-lint.run/
特性:1.快速:并行非执行 linters,可以复用 Go构建cache和caches分析结果2.配置文件基于yaml语法进行配置3.可以与常见开发工具集成,例如:VS Code、Sublime、Goland、Emacs、Vim、Atom、Github Actions4.包含了很多 linters,不需要安装5.执行结果输出带有美观,不仅带有颜色,还有源码行号和标识6.尽可能的减少误报,可以通过设置忽略某些模式
2.Goland 中集成 golangci-lint针对不同的开发工具,官方给出了不同的集成方式,本文暂时只讲解一下 golangci-lint 在 Goland 中的两种集成方式。
https://golangci-lint.run/usage/integrations/
golangci-lint 的安装安装 golangci-lint 常用的方式主要有2种 ...