使用kratos自带http transport实现文件下载上传功能,并且可以使用中间件。文件的下载接口可以使用proto定义,上传目前还未找到完美方法,为了统一,采用不定义在proto中定义,自行在server中实现。为什么上传接口不能使用proto定义?上传接口实际上可以使用proto定义,但是在解析入参时是不能解析上传的字节类型,入参的Content-Type类型只支持: x-www-form-urlencoded、json、xml、proto、yaml,而上传文件我希望以只读字节流readCloser的方式,这样可以方便使用io.Copy()的方式实现上传,而不是将文件数据转换成[]byte进行传输看一段官方的实现方式原代码 · GitHub,已简化。func downloadFile(ctx http.Context) error { f := excelize.NewFile() return f.Write(ctx.Response()) } func main() { var opts = []http.ServerOption{
限流限制某服务在一段时间可以被调用的频率。一般用于防止客户端请求过多,导致服务端拥堵的手段,也是防止ddos的一种手段。常用限流算法有三种:滑动限流漏斗限流令牌桶限流time/rate是官方实现的令牌桶算法限流器Go官方限流time/rate安装go get golang.org/x/time/rate构造限流器相关函数type Limit float64 func Every(interval time.Duration) Limit { if interval <= 0 { return Inf } return 1 / Limit(interval.Seconds()) } func NewLimiter(r Limit, b int) *Limiter { return &Limiter{ limit: r, burst: b, } }NewLimiter有两个参数:第一个是填充令牌的速度,默认已秒为单位。如r=10,则说明这个限流器会每秒填充10个令牌。第二个是为桶的容
准备工作一台拥有公网 IP 的服务器一个域名服务器准备工作安装 Golang ,版本最好为1.20以上安装Caddy2进入网站了解安装方式:caddy2中文网Caddyfile配置caddy的作用仅用于申请tls证书证书目录:/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/example.comexample.com { tls 邮箱 respond "Hello, world!" } }安装 tailscalecurl -fsSL https://tailscale.com/install.sh | sh启动并登录tailscale up安装 derper 服务go install tailscale.com/cmd/derper@main配置derper service[Unit] Description=derper service After=network.target StartLimitIntervalSec=0 [
redis有两种持久化机制,分别为RDB和AOF。RDBRDB是以快照的形式持久化数据,只关注当前结果,优点是占用少,效率高,缺点是恢复时有可能造成数据的不完整。AOFAOF是以日志的形式持久化数据,关注整个过程,优点是数据完整性高,缺点是开销大。可以设置周期性保存,如一秒保存一次。因为AOF是以日志的形式记录,所以文件会越来越大,AOF会对文件进行重写优化。redis会开启一个子进程重写,为了保证在重写期间,主进程的数据和子进程的数据保持一致,则采用了AOF重写缓存,当主进程写入一条数据,子进程也会随之写入数据。
默认环境:debian11、go1.20。创建文件Dockerfile,写入一下内容FROM golang:1.20.4 MAINTAINER cdx cdxccx@outlook.com ENV password="root" RUN echo 'root:$password' |chpasswd RUN apt update && \ apt-get install -y openssh-server && \ apt clean && \ rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp* && \ echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && \ echo "export PATH=/usr/local/go/bin:$PATH" >> /root/.bash