Go web中间件记录请求日志及响应
中间件(通常)是一小段代码,它们接受一个请求,对其进行处理,每个中间件只处理一件事情,完成后将其传递给另一个中间件或最终处理程序,这样就做到了程序的解耦。
如果没有中间件那么我们必须在最终的处理程序中来完成这些处理操作,这无疑会造成处理程序的臃肿和代码复用率不高的问题。中间件的一些常见用例是请求日志记录,Header 操纵、HTTP 请求认证和 ResponseWriter 劫持等等。
原理在net/http包中可以看到定义了一个Handler接口
123type Handler interface { ServeHTTP(ResponseWriter, *Request)}
http.Handler 它 是 net/http 中定义的接口用来表示处理 HTTP 请求的对象,其对象必须实现 ServeHTTP 方法。
创建中间件中间件只将 http.HandlerFunc 作为其参数,在中间件里将其包装并返回新的 http.HandlerFunc 供服务器服务复用器调用。
123456789101112131415161718192021type Middlew ...
利用ngrok服务内网穿透-轻松调试本机站点
我们经常会有「把本机开发中的 web 项目给朋友看一下」这种临时需求,为此专门在 服务上部署一遍就有点太浪费了。
之前我通常是在 ADSL 路由器上配个端口映射让本机服务在外网可以访问,但现在大部分运营商不会轻易让你这么干了。一般小运营商也没有公网 IP,自己的路由器出口还是在局域网内,端口映射这种做法就不管用了。
之前我就想过能否借助拥有公网 IP 的主机中转来实现这种需求,后来发现已经有这样的软件了:ngrok。而且 ngrok 官网本身还提供了公共服务,只需要注册一个帐号,运行它的客户端,就可以快速把内网映射出去。
[ngrok官网](https://ngrok.com/)
我们现在是自己搭建ngrok服务端。前提条件是:一台外网可访问的主机,且有域名解析至该主机上。
ngrok是什么鬼?如果你完全不知道它是什么东西,可以在它的github项目上了解下:https://github.com/inconshreveable/ngrok这里只提下它的核心功能:能够将你本机的HTTP服务(站点)或TCP服务,通过部署有ngrok服务的外网伺服器暴露给外网访问!
如上封面图所示,举一个 ...
go调用Https时出错:certificate signed by unknown authority
今天在使用golang请求微信服务时,出现错误。
x509: certificate signed by unknown authority
从日志来看go实现的Client端默认也是要对服务端传过来的数字证书进行校验的,但客户端提示:这个证书是由不知名CA签发 的!
对应这个问题,有2种不同的解决办法。
client端忽略证书的校验示例
123456789101112131415161718package mainimport ( "fmt" "io/ioutil" "net/http")func main() { resp, err := http.Get("https://localhost:8081") if err != nil { fmt.Println("error:", err) return } defer resp.Body.Close() body, err : ...
kibana异常处理
今天在使用kibana时,出现异常。其结合Elasticsearch,用于处理服务日志。Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。百度百科
Timeout提示kibana-Request Timeout after 30000ms故障解决
一、方法一:修改elastisearch的内存 lasticsearch多一点内存,配置文件/etc/elasticsearch/jvm.options,修改完毕重启服务 1234 # Xms represents the initial size of total heap space# Xmx represents the maximum size of total heap space-Xms8g #默认1g-Xmx8g #默认1g官方文档建议修改为机器内存的一半,不超过32GB。
二、方法二:修改kibana的超时时间 修改配置文件/etc/kibana/kibana.yml的第 ...
go存储json数据时,数据模型定义
mysql在5.6版本时,不支持直接Json存储,我们一般存储成varchar等string类型。编码时,我们也是将数据json格式化后,存储。
从5.7版开始,开始支持JSON格式存储,那么在使用Go存储对应的字段时,如何定义struct,就是一个问题。现有orm一般没有支持json类型的定义。如果struct定义为string类型,会导致一些问题。例如JSON数据为空时,存储的是””, 有时候会导致一些差别。
例如使用gorm存储数据时,不支持Json类型的数据结构。为解决这个问题,我们可以自定义一个JSON的struct
Mysql结构如在Mysql中定义了如下的表结构
12345678910CREATE TABLE `report` ( `id` bigint(20) NOT NULL, `query_param` json DEFAULT NULL, `create_by` varchar(50) DEFAULT NULL COMMENT '创建人', `create_date` timestamp NULL DEFAULT NULL COMMEN ...
Docker安装5.7版mysql服务
公司mysql使用的是5.6版本,不支持json,因此需要升级服务,使用传统方式在服务器上安装mysql服务十分复杂。
相比较,使用docker安装就非常简单、便捷。而且可以很容易切换版本。通过文件挂载方式,也可以将数据文件挂载在服务器上,再次迁移,升级也十分方便。
而且docker中,有5.7,5.8等多种版本可供选择。
安装可以在docker官方仓库中查看镜像,寻找适合的mysql版本
启动脚本
创建run.sh内容如下
12345678#!/bin/bashdocker run --name mysql-5.7.25 \ -p 3306:3306 \ -v /data/services/mysql/data:/var/lib/mysql \ -v /data/services/mysql/conf:/etc/mysql/ \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -d mysql:5.7.25
将数据库文件及配置文件挂载在服务器上,这样可以防止docker容器删除后, ...
误删K8s管理SLB导致阿里云web管理页面无法使用
今天使用阿里云k8s管理Web页面,突然出现了错误提示The request has failed due to a temporary failure of the server。
阿里云的管理页面一直显示异常,服务无法查看,节点数无显示。无法查看应用,应用配置等。
一直提示如下错误。
123456集群k8s-pro,无法查看应用,无节点显示。提示信息如下:由于短暂异常,服务暂时不可用,请稍后重试错误详情:ServiceUnavailableThe request has failed due to a temporary failure of the server.
排查提交阿里云工单时,工作人员排查,发送k8s的管理端口6443监听异常,无法连接。
12您好,您那边释放的这个SLB 是集群apiserver 的SLB , apiserver 是集群核心通信使用的。 这个释放了,相关数据通道无法连接上。确实无法恢复。 我们已经和研发反复沟通了这个问题。 确实没办法恢复。很抱歉。
开始时,客服说无法恢复,差点急死。
排查,最终定位到,是应用创建服务,选择负载均衡时,选择了k8s的 ...
go使用Makefile构建
原由在 Golang 的开发过程中,我们习惯于不断重复地手动执行 go build 和 go test 这两个命令。但是在一些复杂的任务中,如果依旧是手动执行 go build 和 go test ,就可能会成为一个让人头疼的事情。
我们可以通过其他方式解决这个问题。比如,可以用一个 bash 脚本来完成这些工作。但更好的选择是,写一个 makefile.。make 这个工具生来就是为了做这些事情,在 makefile 中我们可以将所有常见的任务都放在一起。
这样能够将makefile文件放在git记录中,方便多人协作和共享。毕竟大型项目有很多依赖关系,build或者测试更加复杂。
平常很多时候都是直接在命令行输入go build进行编译的
1go build .
或者测试使用go run运行项目
1go run main.go
大型开源项目都是如下方式
123make buildmake install
我们打包运行这个过程,还有一个更加贴切的词语叫做构建项目。
Makefile介绍Makefile 是和 make 命令一起配合使用的。它是开源的构建工具,很多大型项目的编译都是 ...
系统时间错误导致https请求失败
今天发现一个奇特的问题。设备请求接口失败,但是在本地模拟接口请求时,是正常的。仔细排查设备请求日志,发现设备的时间设置是12月25日,与当前时间12月31日。然后修改本地时间,再模拟,果然失效。
仔细看,接口是使用https请求,换成http请求后,能正常访问。使用https请求时,会返回如下错误。
1234567891011121314curl: (60) SSL certificate problem: certificate is not yet validMore details here: https://curl.haxx.se/docs/sslcerts.htmlcurl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alter ...
go test命令使用
单元测试单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如 C语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。
单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
Go testGo语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码。
自带了测试框架和工具,在testing包中,以便完成单元测试(T类型)和性能测试(B类型)。
使用go test 命令,会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件。输出的信息类似
123ok archive/tar 0.011sFAIL archive/zip 0.022sok compress/gzip 0.033s
同时,性能测试系统可以给出代码的性能数据,帮助测试者分析性能问题。
单元测试,需要准备一个 go 源码文件,在命名文件 ...