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 配置插件时使用。 ...

三月 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 3 应用类型为 web 应用,已获授权的 JavaScript 来源为 http://localhost:3000, 已获授权的重定向 URI 为 http://localhost:3000/GoogleCallback 4 记录下你的客户端 id 和客户端密钥,这些信息可以在 Google Cloud Platform 中找到 5 完整代码如下: ...

三月 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, 你可以通过配置文件更改监听端口以及其它一些配置项。 Pyroscope 客户端实践 Pyroscope 提供了多种客户端,比如Go、Java、Python、Ruby、PHP、.NET等多种语言的支持,并且支持PUSH、PULL两种采集方式。这里介绍 GO 语言的客户端实例,采用 PUSH 的方式. GO 客户端的 PUSH 方式通过使用标准runtime/pprof包来收集分析数据。 1 安装 go 客户端 ...

二月 26, 2022 · overstarry

Fsck

起因 在一次使用虚拟机的时候,发现 Linux 系统进入了 Initramfs,无法正常进入系统, 推测可能是系统异常关机导致磁盘文件损坏导致的。 解决 网上搜寻了一些解决方法,普遍的推荐方法是使用 Linux 命令 fsck 命令来修复磁盘文件。 费了好大劲进入另一个系统使用 fsck.ext4 -f /dev/sda1 来检查修复磁盘文件(我所使用的linux 系统磁盘是ext4格式的)。 接下来我来介绍下 fsck 的使用。 fsck fsck(file system consistency check)是Unix和类Unix系统上用于检查文件系统完整性的工具. 语法: fsck [选项] [文件系统] 常见参数: -f 强制检查文件系统,不管是否有损坏 -p 自动修复文件系统错误 -q 做一个快速检查,以确定文件系统是否被干净地卸载。 -y 关闭互动模式,询问全部选择 y 参考 https://web.archive.org/web/20150529001726/http://www.manpagez.com/man/8/fsck/ https://zh.wikipedia.org/zh-hans/Fsck https://zh.wikipedia.org/wiki/Unix%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%88%97%E8%A1%A8

二月 19, 2022 · overstarry

GRPC单向安全连接

从本篇开始,我将介绍加强 gRPC 的安全性的一系列措施。本篇介绍使用 TLS 加密 gRPC 通信的第一篇文章: gRPC 单向安全连接。 TLS 协议介绍 传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与RFC 6176(2011年3月)。在浏览器、邮箱、即时通信、VoIP、网络传真等应用程序中,广泛支持这个协议。主要的网站,如Google、Facebook等也以这个协议来创建安全连线,发送数据。目前已成为互联网上保密通信的工业标准。 SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。 单向安全连接 通过安全的连接进行传输数据非常重要,那么如何在 gRPC 中使用 TLS 保护 gRPC 通信呢? TLS 认证机制集成在了 gRPC 库中,这使得 gRPC 可以很方便使用 TLS 进行安全连接。 客户端和服务端之间的安全传输可以采用单向或双向的方式来实现。本文主要介绍 单向安全连接。 在单向安全连接中,只有客户端会校验服务端,以确保它所接收的数据来自预期的服务器,在建立连接时,服务端会与客户端共享其公开证书,客户端会校验收到的证书。这是通过证书授权中心完成的。 证书校验完成后,客户端会使用密钥加密数据。 要启用 TLS ,需要证书和密钥(xx.key,xx.pem/xx.crt),前者是用于签名和扔着公钥,后者用于分发自签名 X.509 公钥。证书和密钥的生成这里就不过多介绍了,需要的可以自行了解。 在 gRPC 服务端启用单向安全连接 在 gRPC 服务端启用单向安全连接的主要流程如下: 1 读取和解析公钥-私钥,创建启用 TLS 的证书 2 添加证书作为 TLS 服务凭证,为所有连接启用 TLS. 3 通过 TLS 凭证创建新的 gRPC 连接 接下来的流程跟普通的流程差不多,就不多介绍了,直接上代码: package main import ( "context" "crypto/tls" "errors" wrapper "github.com/golang/protobuf/ptypes/wrappers" "github.com/google/uuid" "google.golang.org/grpc" "google.golang.org/grpc/credentials" pb "grpc-demo/proto" "log" "net" ) const ( port = ":50051" crtFile = "./server.crt" keyFile = "./server.key" ) type server struct { pb.UnimplementedProductInfoServer productMap map[string]*pb.Product } func (s *server) AddProduct(ctx context.Context, in *pb.Product) (*wrapper.StringValue, error) { out, err := uuid.NewUUID() if err != nil { log.Fatal(err) } in.Id = out.String() if s.productMap == nil { s.productMap = make(map[string]*pb.Product) } s.productMap[in.Id] = in return &wrapper.StringValue{Value: in.Id}, nil } func (s *server) GetProduct(ctx context.Context, in *wrapper.StringValue) (*pb.Product, error) { value, exists := s.productMap[in.Value] if exists { return value, nil } return nil, errors.New("Product does not exist for the ID" + in.Value) } func main() { cert, err := tls.LoadX509KeyPair(crtFile, keyFile) if err != nil { log.Fatalf("failed to load key pair: %s", err) } opts := []grpc.ServerOption{ grpc.Creds(credentials.NewServerTLSFromCert(&cert)), } s := grpc.NewServer(opts...) pb.RegisterProductInfoServer(s, &server{}) lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } 在客户端启用单向安全连接 为了与服务器连接,客户都需要服务端的自认证公钥。具体流程如下: ...

二月 12, 2022 · overstarry

Log_and_trace

本篇文章讲述了如何将 loki 和 tempo 结合进行分布式追踪。 日志和trace结合使用的方案有很多,由于 loki 官方自带了 trace 结合的配置,不用进行过多的二次开发,所以这里采用 loki 和 tempo 结合的方案。 loki 和 tempo 是什么就不过多介绍,安装流程也省略。 这里主要讲如何配置。 配置 这里我们采用普遍的方案, 使用 grafana 来展示日志和 trace。 配置 loki 在 grafana , 打开数据源配置界面,新建 loki 数据源,并且配置好地址, 如下图所示点击 Save & Test, 如果配置正确,则会出现 Data source connected and labels found. 标志。 配置 tempo 同配置 loki 一致,新建 grafana 数据源,选择 tempo ,配置好相应的url 数据,点击测试,出现 Data source connected and labels found. 标志,就表示配置成功。 在 tempo 配置页面的底部可以看到一个配置栏目 Trace to logs , 可以选择相应的日志数据源,这里我们选择 loki. ...

一月 27, 2022 · overstarry

K8s_Finalizers

起因 在我们日常使用 k8s 中,可能会遇到这样的情况:在删除 namespace 时,往往会遇到资源没有被删除的情况,资源处于 terminating 的状态,这时我们该如何解决了,寻找到的解决方法往往是如下: 1 运行以下命令查看处于 terminating 状态的资源(这里以namespace 为例): kubectl get namespaces 2 选择一个Terminating namespace,并查看namespace 中的finalizer。运行以下命令: kubectl get namespace <terminating-namespace> -o yaml 得到类似这样的信息: apiVersion: v1 kind: Namespace metadata: creationTimestamp: "2021-01-20T15:18:06Z" deletionTimestamp: "2021-01-21T02:50:02Z" name: <terminating-namespace> resourceVersion: "3249493" selfLink: /api/v1/namespaces/knative-eventing uid: f300ea38-c8c2-4653-b432-b66103e412db spec: finalizers: - kubernetes status: phase: Terminating 3 导出json格式到tmp.json: kubectl get namespace <terminating-namespace> -o json > tmp.json ...

一月 23, 2022 · overstarry