Buf 初入门 1

Buf 的目标是将 API 开发转向模式驱动的范式,从而为未来铺平道路,使 API 以服务所有者和客户可以依赖的方式定义。 与简单地暴露 REST/JSON 服务相比,使用 IDL 来定义 API 有很多好处,今天,Protobuf 是业界最稳定、最广泛采用的 IDL。但就目前的情况来看,使用 Protobuf 比使用 JSON 作为数据传输格式要困难得多。 Buf 正在建立工具,使 Protobuf 对服务所有者和客户来说是可靠和友好的,同时保持它在技术上的明显优势。您的组织不需要重新发明轮子来高效地创建、维护和使用 Protobuf API。我们将为您处理您的 Protobuf 管理策略,因此您可以专注于重要的事情。 本篇文章是讲述 buf 使用的第一篇文章,主要讲解使用 buf 定义 proto 文件的 lint 规则。统一的 lint 规则,可以让个人或团队定义的 API 保持一致。 lint 1 创建 buf.yaml 文件 使用 buf mod init 命令创建 buf.yaml 文件。 version: v1 breaking: use: - FILE lint: use: - DEFAULT 使用默认 lint 规则。 2 运行 lint 命令 使用 buf lint 命令运行 lint。 ...

四月 23, 2022 · overstarry

Go 统计代码测试覆盖率

今天来讲一讲如何统计 go 代码的测试覆盖率,主要是 cover 命令。 cover 基本用法 1 先简单写个函数和相应的测试,代码如下: func Max(a, b int) int { if a > b { return a } return b } 这个函数就是简单的比较大小,如果 a > b,返回 a,否则返回 b。 测试代码如下 package main import "testing" func TestMax(t *testing.T) { type args struct { a int b int } tests := []struct { name string args args want int }{ { name: "a is larger than b", args: args{ a: 2, b: 1, }, want: 2, }, { name: "b is larger than a", args: args{ a: 1, b: 2, }, want: 2, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := Max(tt.args.a, tt.args.b); got != tt.want { t.Errorf("Max() = %v, want %v", got, tt.want) } }) } } 2 go test -cover 能够统计出代码测试的覆盖率,这是一种比统计函数是否被调用更强悍的手法。我们执行这个命令。输出如下: ...

四月 16, 2022 · overstarry

Kswapd0 is consuming a lot of CPU.

Issue Recently, a Linux server has been experiencing high CPU usage, causing the server to become unresponsive and other processes to fail to execute smoothly. By using the top command to check resource usage, it can be seen that the kswapd0 process is consuming a large amount of CPU resources. Cause and solution Based on my research, the kswapd0 process is responsible for managing virtual memory. Typically, a Linux system comprises RAM, swap, and EXT4 components. The EXT4 partition is used to store regular files and can be created on either an HDD or an SSD, though it is relatively slower compared to RAM. RAM, commonly referred to as memory, is used for high-speed program execution. The swap partition, on the other hand, is used as additional virtual memory and is normally allocated on physical disks, especially on machines with limited physical RAM. ...

四月 9, 2022 · overstarry

Kswapd0 消耗大量 cpu

问题 最近一台 Linux 服务器经常出现 cpu 过高,导致服务器卡顿,其他进程不能顺利进行。通过 top 命令查看资源的占用情况,可以看到 Kswapd0 进程 消耗了大量的 cpu 资源。 原因及解决 通过搜索得知,Kswapd0 进程是用来管理虚拟内存的。 一般的 Linux 都会有 RAM,swap, 和 EXT4 这几个部分,EXT4 分区就是用来存放一般的文件,可以在机械硬盘或者 SSD 上划分出 ext4 分区来保存文件,相对 RAM(内存)来说要稍微慢一些,RAM 就是日常所说的内存,用来做程序运行时的高速缓存,而 SWAP 是交换分区,一般在物理内存比较小的机器上会划分一块物理磁盘来作为 swap 分区。 swap 分区是一款虚拟的 RAM,一般在 HDD/SSD 上,当物理内存比较小的时侯,可能经常缺内存,那么系统就会使用 swap 分区,将物理内存中的内容搬迁到 swap 分区中暂存。当可用物理内存比较小的时候,kswapd0 进程就会将相对比较不常用的程序移动到 swap 分区中,这个时候就可能造成这些程序比较卡顿。例如一台机器的内存是 4G,而要运行一个需要 5G 内存的程序,那么至少有 1G 的内存会放到 swap 分区中。kswapd0 移动内存的过程就会造成 CPU 的大量使用。要解决这个问题有这样几个方式。 1 修改 /etc/sysctl.conf 文件 echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf ...

四月 9, 2022 · overstarry

Postgresql 修改序列产生器

问题 在我日常使用 PostgreSQL 数据库过程中,会遇到一个问题:我在重新创建一个数据库表时,往往会导入已有的数据,这样会导致新增表数据时,由于 id 采用了自增,会从 1 开始生成,然后由于已有数据的缘故,所以会导致 id 重复报错。 解决 查看了 stackoverflow 的一些回答,发现了一个解决方案:采用 ALTER SEQUENCE 语句进行修改。 ALTER SEQUENCE ALTER SEQUENCE — 更改序列生成器的定义 语法: ALTER SEQUENCE [ IF EXISTS ] name [ AS data_type ] [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ RESTART [ [ WITH ] restart ] ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { table_name.column_name | NONE } ] ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema 参数: ...

四月 6, 2022 · overstarry

Kratos 业务状态码和 HTTP 状态码分离

起因 在我们使用 kratos 开发 web 应用时,由于 kratos 默认设计导致我们在自定义错误时,访问 api 时,相应的状态码是以自定义的 error code 作为 http status code 表现的。 如果我们想将 业务状态码和 HTTP 状态码分离,即所有的 http status code 都为 200,实际的业务状态码以在 response 中响应的 code 为主。 我们该如何实现呢?有 2 种方法,一种是自定义中间件将错误进行特别处理,另一种是自定义 Encoder。本篇文章主要就是介绍 Encoder 方法。 自定义 Encoder 根据我们的需要,我们需要自定义 2 个 Encoder, ErrorEncoder 和 ResponseEncoder 函数。需要的参数类型分别如下: // ResponseEncoder with response encoder. func ResponseEncoder(en EncodeResponseFunc) ServerOption { return func(o *Server) { o.enc = en } } // ErrorEncoder with error encoder. func ErrorEncoder(en EncodeErrorFunc) ServerOption { return func(o *Server) { o.ene = en } } // EncodeResponseFunc is encode response func. type EncodeResponseFunc func(http.ResponseWriter, *http.Request, interface{}) error // EncodeErrorFunc is encode error func. type EncodeErrorFunc func(http.ResponseWriter, *http.Request, error) 1 自定义 Response 结构 定义一个 Response 的结构体 ...

三月 27, 2022 · overstarry

Apisix 使用 authing 进行认证登陆

本文介绍 apisix 和 authing 对接进行 api 登陆验证的方式。 apisix 介绍 Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX 不仅支持插件动态变更和热插拔,而且拥有众多实用的插件。Apache APISIX 的 OpenID Connect 插件支持 OpenID Connect 协议,用户可以使用该插件让 Apache APISIX 对接 Authing 服务,作为集中式认证网关部署于企业中。 authing 介绍 Authing 是国内首款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务。其主要功能包括:单点登录、用户分析、扫码登录、多因素认证、行为审计、风险控制、跨平台设备管理、IoT 身份认证等;兼容国际各类标准协议:OAuth2.0、OIDC、SAML、AD/LDAP、WS-Fed、JWT 等;此外还有基于函数计算可以无限制拓展 Authing 能力的 Pipeline。支持云交付和私有化部署方式,帮助企业和开发者提升生产效率。 apisix 和 authing 对接 1 登录 Authing 账号,选择自建用户应用,输入应用名称和认证地址 2 设置登陆回调 URL 和登出回调 URL 为你的 apisix 访问地址 http://127.0.0.1:9080/ 3 在用户管理界面创建一个新用户,账号密码都是 user1/user1 4 在应用的配置里记录下应用的 App ID、App Secret、服务发现地址 这些信息会在 apisix 配置插件时使用。 5 安装 apisix, 具体的安装步骤就不用我们讲了,可以参考官方文档。 ...

三月 19, 2022 · overstarry

Google_OAuth2 实践

本篇文章主要介绍了 OAuth2.0 和 使用 Google 的 OAuth2.0 登录方式。 OAuth2.0 介绍 OAuth 2.0 是 OAuth 协议的下一版本,但不向下兼容 OAuth 1.0。OAuth 2.0 关注客户端开发者的简易性,同时为 Web 应用、桌面应用、手机和智能设备提供专门的认证流程。 Facebook 的新的 Graph API 只支持 OAuth 2.0,Google 在 2011 年 3 月也宣布 Google API 对 OAuth 2.0 的支持,Windows Live 也支持 OAuth 2.0。 在认证和授权的过程中涉及的三方包括: 1、服务提供方,用户使用服务提供方来存储受保护的资源,如照片,视频,联系人列表。 2、用户,存放在服务提供方的受保护的资源的拥有者。 3、客户端,要访问服务提供方资源的第三方应用,通常是网站,如提供照片打印服务的网站。在认证过程之前,客户端要向服务提供者申请客户端标识。 使用 OAuth 进行认证和授权的过程如下所示: (A)用户打开客户端以后,客户端要求用户给予授权。 (B)用户同意给予客户端授权。 (C)客户端使用上一步获得的授权,向认证服务器申请令牌。 (D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。 (E)客户端使用令牌,向资源服务器申请获取资源。 (F)资源服务器确认令牌无误,同意向客户端开放资源 Google 的 OAuth2.0 登录方式 1 进入 Google Cloud Platform 创建一个项目 2 进入 API 与服务界面,选择凭据管理,点击创建凭据,选择 OAuth 2.0 客户端 ID ...

三月 13, 2022 · overstarry

Go 模糊测试

本篇文章主要讲解在 go 语言中进行模糊测试的基础知识。通过模糊测试,随机数据会针对您的测试运行,以尝试找出漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、buffer overflow、拒绝服务和 cross-site scripting 攻击。 想要在 go 中使用模糊测试,需要安装 go1.18beta1 以上版本,具体的安装就不过多叙述了。 1 创建项目文件夹 我们创建一个名叫 fuzz-demo 的文件夹,并在其中创建一个名叫 main.go 的文件。 2 输入代码 在 main.go 中输入如下代码: package main import "fmt" func Reverse(s string) string { b := []byte(s) for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 { b[i], b[j] = b[j], b[i] } return string(b) } func main() { input := "quick quick brown fox jumped over the lazy dog" rev := Reverse(input) doubleRev := Reverse(rev) fmt.Printf("原来: %q\n", input) fmt.Printf("反转: %q\n", rev) fmt.Printf("再反转: %q\n", doubleRev) } Reverse 函数的作用就是对字符串进行反转。 ...

三月 6, 2022 · overstarry

Pyroscope 持续分析平台

什么是 Pyroscope? Pyroscope 是一个开源的持续分析系统,使用 Go 语言实现。服务端使用 web 页面查看,提供丰富的分析的功能,客户端提供 Go、Java、Python、Ruby、PHP、.NET 等多种语言的支持,并且支持 PUSH、PULL 两种采集方式。 Pyroscope 是一个开源的持续性能剖析平台。它能够帮你: 找出源代码中的性能问题和瓶颈 解决 CPU 利用率高的问题 理解应用程序的调用树(call tree) 追踪随一段时间内变化的情况 特性: 可以存储来自多个应用程序的多年剖析数据 你可以一次查看多年的数据或单独查看特定的事件 较低的 CPU 开销 数据压缩效率高,磁盘空间要求低 快捷的 UI 界面 部署架构图: Pyroscope server 安装 Pyroscope server 端可以通过 docker 安装: docker run -it -p 4040:4040 pyroscope/pyroscope:latest server 也可以在各中操作系统中直接安装。 比如 Mac: brew install pyroscope-io/brew/pyroscope brew services start pyroscope-server 各 Liunx 发行版也方便安装 比如 ubuntu: wget https://dl.pyroscope.io/release/pyroscope_0.10.2_amd64.deb sudo apt-get install ./pyroscope_0.10.2_amd64.deb 安装完成后,就可以通过 web 界面访问了:http://localhost:4040, 你可以通过配置文件更改监听端口以及其它一些配置项。 ...

二月 26, 2022 · overstarry