自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 记一次产线打印json导致的redis连接超时

服务在中午十一点上线后,服务每分钟发出三到四次redis连接超时告警。

2023-05-04 20:00:32 596

原创 MacOS中安装和配置Podman

在MacOS中,Podman的底层由QEMU虚拟机支持。虚拟机中启动了一个Linux系统,称为podman机器。可用用 podman machine 命令管理。

2023-04-04 17:07:45 2038

原创 Golang XML 序列化忽略父级元素

在golang中XML序列化时,如果字段使用如下的标记 “a>b>c”,给字段添加omitempty,只能忽略 c 字段,并不能忽略父级元素 b,c。看如下例子:func main() { type Room struct { Name string `xml:"name,attr"` } type Hotel struct { XMLName xml.Name `xml:"hotel"` Name string `xml:

2021-12-30 18:53:11 637

原创 ngrok 实现内网穿透,获取临时域名

开发调试当中会遇到这样的问题,服务运行在本地机器上,想让外网访问本地机器的服务,就要提供公网地址。但大多数情况下,本地机器在内网,需要穿透NAT网络和防火墙。ngork 正好解决了这个痛点,可以提供临时的URL,让外网访问到本地机器上的web服务。基本原理:ngrok在本地跑了一个服务,和ngrok官方服务建立了一个tcp连接,ngrok的本地服务将私人域名 http://xxxxxxxxxxx.ngrok.io 下的流量转发到本地的服务。ngrok 使用例子到 官网 下载ngrok的二进制静态文

2021-05-13 15:41:38 897

原创 从 gopath 升级到 gomod 的实践经验

Go 的版本管理是大家都比较头痛的问题,从 Go 1.11 起,官方引入了 GoModules 来解决版本管理问题。在项目中,我们完成了从 gopath 到 gomod 的版本管理升级,本文主要记录升级到 gomod 的一些经验。现状所有的项目都是使用 GOPATH/src公共库example.libs保存在私有仓库项目中同时引用了同一个包的两个不兼容版本要求支持逐步升级到gomod,gopath模式的项目可以继续正常使用公共库example.libs需要同时支持gopath和gomod

2021-04-06 16:52:34 949

原创 为什么array可以作为map key?而slice不可以

在golang中,什么类型才可以作为map key,在golang官方博客中找到以下说明:As mentioned earlier, map keys may be of any type that is comparable. The language spec defines this precisely, but in short, comparable types are boolean, numeric, string, pointer, channel, and interface type

2021-04-02 12:52:11 1654

原创 golang json.Marshal 什么情况下会报错?

func Marshal(v interface{}) ([]byte, error)我们一般会这样使用 b, err := json.Marshal(data) ,也就是应该检查Marshal返回的错误,但很少遇到这个函数报错,那么什么情况下json.Marshal会返回错误。通过官方文档,找到了以下的说明:Channel, complex, and function values cannot be encoded in JSON. Attempting to encode such a va.

2021-04-01 15:08:01 5343

原创 golang避坑之设置http头和状态码

golang中设置http头用 w.Header().Set() ,设置状态码用 ***w.WriteHeader()***, 设置body用 ***w.Write()***。但他们的调用顺序是有要求的。正确的调用顺序如下:func HandleHello(w http.ResponseWriter, r *http.Request) { w.Header().Set("X-name","john") w.WriteHeader(http.StatusOK) w.Write([]byte("hell

2021-03-31 19:57:17 3087

原创 REST的约束、目标和HATEOAS

学习REST时会有一些疑问,为什么要引入无状态?为什么错误响应不能使用200状态码?为什么URI要体现资源? 为什么要统一使用HTTP方法?其实上面这些规定来自REST的约束,也就是设计REST接口应该遵循的一些规则,REST的约束则是为了实现REST的目标而推导出来的,而满足HATEOAS才是成熟的RESTful API。RESTREST全称表述性状态转移(Representational State Transfer), 出自Roy Fielding的《架构风格与基于网络的软件架构设计》。URL,

2021-03-29 21:57:37 618 1

原创 记录一次产线502错误

问题晚上22:00,产线告警,一个产线服务无法访问,每个请求都报502错误。<html><head><title>502 Bad Gateway</title></head><body><center><h1>502 Bad Gateway</h1></center><hr><center>******</center></body&

2021-03-28 02:32:49 655

原创 BPF表达式

BPF(Berkeley Packet Filters)是一个强大的网络分析工具,通过指定过滤条件,BPF过滤器可以极大的减少捕获的数据包,tcpdump和wireshark都支持BPF过滤器。BPF表达式BPF表达式由一个或者多个原语(primitives)组成。[not] primitive [and|or [not] primitive …]原语(primitive)原语由标识符(Identifiers), 以及描述它的多个限定词(qualifiers)组成。qualifier Id

2021-03-17 18:17:08 2416

原创 基于ABNF描述的HTTP协议格式

基于ABNF描述的HTTP协议格式定义一个协议的时候,会遇到这样的问题:协议的数据段之间分隔符是什么,字段之间可以用什么字符分隔,空白符可以连续多少个,所以需要一门元语言来定义这些规则。例如,在一个HTTP请求中, HOST: 后面是否可以连续有多个空格?在计算机科学中,ABNF(巴科斯范式)是我们经常遇到的一种的规则定义语言,广泛存在于各种标准文档中。ABNF规范范式由一系列规则组成:rule = definition ; comment CR LFrule不区分大小写的非最终符号

2021-03-15 00:01:30 390

原创 URL, URN和URI的区别

URL, URN和URI的区别统一资源定位符(URL,Uniform Resource Locator),是因特网上标准资源的地址,相当于门牌号。统一资源名称(URN, Uniform Resource Name),定义资源的身份,即资源的名称,可以唯一表示资源。统一资源标识符(URI,Uniform Resource Identifier), 包含了URL和URN。最先出现的是URL,随着万维网技术的发展,需要区分资源访问和资源标记,这个时候出现了URN,这两者都是基于“资源标识”这一概念,I

2021-03-14 16:57:21 382

原创 浏览器中的JavaScript执行机制

我们来分析下面这个例子,当运行到console.log(test)时,输出的结果是什么?function bar() { var myName = "bar" let test1 = 100 if (1) { let myName = "bar bar" console.log(test) }}function foo() { var myName = "foo" let test = 2 {

2020-12-31 19:04:50 221

原创 对称加密的基本原理 —— 从DESede/CBC/PKCS5Padding说起

DESede/CBC/PKCS5Padding加密算法包含三个部分,对称加密方式为DESede,分组加密模式为CBC,填充算法是PKCS5Padding。本文从对称加密的基本原理来了解这个算法。基本原理混淆与扩散混淆(confusion)与扩散(diffusion)是设计密码学算法的两种主要方法。最早出现在克劳德·香农1945年的论文《密码学的数学理论》当中。混淆(confusion)混淆主要是用来使 密文 和对称式加密方法中 密钥 的关系变得尽可能的复杂;此属性使得很难从密文中找到密钥,并

2020-12-31 16:43:15 3957

原创 Golang中的达夫设备(Duff‘s device)

什么是Duff’s device设备达夫设备是串行复制的一种优化实现,主要是利用汇编语言编程的优化思路,该思路要求“在复制时最小化判断数和分支数”。1983年11月,当时在影视公司工作的Tom Duff,为了提高动画实时程序的速度发明这种实现。我们来看看达夫设备实现的示例代码:send(to, from, count)register short *to, *from;register count;{ register n=(count+7)/8; switch(count%8){

2020-10-26 21:03:32 467

原创 用stdbuf解决tail -f多级管道下没有输出的问题

问题提取json字符串中body字段的内容,并将body字段的内容格式化后以json格式输出。日志内容是一个json字符串,如下:COMMAND:tail -f access-2020-10-19.log{"method": "POST", "uri": "/api/push", "url_path": "/api/push", "status": 200, "remote_ip": "::1", "request_time": 9.083747863769531, "headers":

2020-10-19 13:26:23 711

原创 后端程序员需要知道的一些数据

常数光速光速约3.00×108m/s, 即每秒30w公里,每秒绕地球七圈半算网络延迟深圳到北京距离大约为2000km,RTT延迟最少为2*2000km/300,000km=13ms和光速有关的bug2002年提出的一个bug,电子邮件无法发送到500英里以外2的次方表2的次方真实值近似值字节271282825621010241 thousand1 KB21665,53664 KB2201,048,5761 m

2020-09-28 18:59:21 397

原创 Prometheus数据模型

Prometheus采用多维数据模型,底层存储为时间序列(time series)。时间序列由metric名称、一组key/value标签组成,同一组时间序具有相同的metric名称和标签组合。时间序的样本数据包含一个float64的值,以及毫秒级别的unix时间戳。时间序的格式为:<metric name>{<label name>=<label value>, ...}例如,metric名称为http_requests_total和标签为method=“POS

2020-09-01 16:44:18 1181

原创 实现kong网关路由前rewrite插件遇到的问题

rewrite uri有两种方式,一种是路由前做rewrite操作,在路由判断之前rewrite uri到新的内部地址,然后再执行路由判断。另外一种是路由后rewrite,也就是路由匹配后,改写发送到上游服务器的uri。我们遇到的需求是在路由前做rewrite操作,大多数rewrite插件的例子是在kong:access()阶段做rewrite处理。疑问就来了,为什么不在kong.rewite()阶段rewrite uri,而是要在kong:access()阶段做rewrite uri。Kong的执行流

2020-08-31 18:55:46 1465

原创 正则表达式的一些笔记

基本元件元字符特殊单字符--.除了换行符的任意字符\d任意数字\w任意数字、字母、下划线\s任意空白\D任意非数字\W任意非数字、字母、下划线\S任意非空白符空白符--\r回车符\n换行符\f换页符\t制表符\v垂直制表符\s任意空白符量词--*0到多次+1到多次?0到1次{m}出现m次

2020-07-17 20:45:52 160

原创 SRE是什么?

SRE是什么?SRE(Site Reliability Engineering),站点可靠性工程,起源于2003年。在系统管理员模式下,通常是通过人工操作完成任务,而SRE倾向通过设计、构建自动化工具来取代人工操作。SRE的本质是用软件工程的思维和方法解决复杂的运维问题。DevOps是在2008年年末流行起来,强调自动化替代人工操作,以及利用软件工程手段执行运维任务。DevOps的核心是"全栈交付", SRE的出发点是“保障和提升系统稳定性”,两者要做的事情其实本质上差别不大,但是角度不同。可以认为De

2020-07-17 16:33:59 14748 1

原创 SSH本地转发,远程转发和动态端口转发的区别

本地转发(LocalForward)将ssh-client指定端口上的连接通过ssh-server转发到host:hostport上,host:hostport在建立ssh通道时确定。工作方式是,ssh client监听指定的TCP端口,将访问该端口的连接通过安全通道转发给ssh server,然后ssh server建立一个到host:hostport的连接,完成转发。也就是监听端口在ssh cient上,ssh server为转发路径上的中间机器.-L [bind_address:]port:h

2020-07-06 19:09:21 2543 1

原创 限制CPU使用率:优先级,信号,cgroups,systemd

为了提升系统的整体效率,需要在不同的场景中控制进程的cpu使用率。控制进程cpu的使用率,实质上是控制进程在单位时间内的CPU时间片。常用的手段有利用进程优先级,信号,cgroup。优先级进程优先级、nice和权重之间的关系目前,Linux内核默认实现了4种调度器,分别是deadline, realtime, CFS和idel。进程能够获得多少CPU时间,和调度策略紧密相关。Linux支持...

2020-04-24 12:53:15 3104

原创 SQL注入原理与实战

原理SQL注入(SQL Injection)是互联网上最普遍的漏洞之一,使得未经授权的用户可以访问各种敏感数据。非法的SQL命令可以作为入参隐藏在URL或者Web表单中, 如果后台程序不能识别请求参数是正常的用户信息还是非法的SQL命令,那么服务器就会执行了非法的SQL命令。基础SQL语句尝试语句SQL中and的优先级大于or的优先级,“or 1=1"使得where条件为true,“–...

2020-02-28 12:33:31 367

原创 限流算法的golang实现

限流算法常见的限流算法有漏桶算法(Leaky Bucket),令牌桶算法(Token Bucket)漏桶算法(Leaky Bucket)原理类似于漏桶的进水和出水,流入漏桶的水流大于流出漏桶的水流时,漏桶就会慢慢变满,水满后就会溢出。请求访问服务,当突发请求大于服务承受数量时,服务器拒绝访问,服务器以一定的速度响应请求。令牌桶算法(Token Bucket)和漏桶算法不同的是,令...

2019-10-23 18:51:31 623

原创 访问控制模型(DAC,MAC,RBAC,ABAC)

访问控制模型项目中需要加入访问控制,对访问控制模型做了一些调研, 本文主要是介绍一些常用的访问控制模型。基本要素访问控制模型包括三个要素,即:主体(Subject) 指主动对其它实体施加动作的实体客体(Object) 是被动接受其他实体访问的实体控制策略(Policy)为主体对客体的操作行为和约束条件安全策略主体、客体,控制策略三者需要满足的基本安全策略:最小...

2019-09-12 19:22:29 27244 1

原创 Linux在80x86(IA-32)微处理器下的内存管理

本文主要是总结Linux在80x86(IA-32)微处理器下的内存管理。内存地址空间的划分8086微处理器是X86时代开始的标志。在8086之前,都是4位机和8位机的天下,程序访问内存需要给出内存的实际物理地址,程序的可控性弱,重定位难。 8086微处理器在内存寻址方面引入了分段机制,目标寻址空间达到了1M。 80286微处理器引入了保护模式,在保护模式下程序不能再随意访问任意的物理内...

2018-07-09 16:48:37 889

原创 Linux进程管理总结

进程和线程从操作系统角度来看,进程是资源分配的基本单位,线程是调度的基本单位。进程有独立的地址空间,线程共享进程的内存地址空间。内核通过进程控制块PCB来维护进程相关信息。Linux内核的PCB是task_struct结构体。进程控制块PCBstruct task_struct { pid_t pid; struct mm_struct ...

2018-07-04 00:42:46 877

原创 Golang中panic和defer的字符串打印顺序

环境 Ubuntu 16.04 Goland 2018.1.1 go1.10.1 linux/amd64题目package mainimport ( &amp;amp;amp;amp;quot;fmt&amp;amp;amp;amp;quot;)func main(){ defer_call()}func defer_call() { defer func() { fmt.Println(&amp;amp;amp;amp;quot

2018-04-28 18:20:41 2926

原创 Ubuntu 16.04 bonding

Ubuntu 16.04 bonding简介Bonding又叫链路聚合,将多个网卡绑定为单个逻辑链路,可以提供网络高可用,负载均衡,大流量通信功能。如在存储系统中,可以通过bonding解决服务器网络大流量问题。bonding kernel module查看有没有bonding kernel module,root@ubuntu:~# modinfo bonding | head -n 3fi

2017-11-22 19:16:08 5521

空空如也

空空如也

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

TA关注的人

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