caddy 作为微服务的 API gateway
背景
大家都知道,Docker这些年让IT界产生了深刻的变革,
从开发到测试到运维,处处都有它的身影。
它同时也和微服务架构相互促进,并肩前行。
在最新版的 Docker(CE 17.03) 里,随着 swarm mode
的成熟,
在较简单的场景里已经可以不再需要专门的基础设施管理
,服务编排
,服务发现
,健康检查
,负载均衡
等等。
但是API gateway
还是需要一个的。或许再加上一个日志收集
,
你的微服务架构就五脏俱全了。
我们知道Nginx Plus
是可以很好的胜任 API gateway 的工作的,
但它是商业软件。Nginx
我们不说认证啊限流啊统计啊之类的功能,
单就请求转发这一点最基本的就出了问题。
我们知道Docker是用DNS的方式,均衡同一名称的服务请求到不同的node,
但是Nginx为了速度,在反向代理的时候会有一个不可取消的 DNS Cache,
这样我们Docker在根据容器的扩展或收缩动态的更新DNS,可Nginx却不为所动,
坚持把请求往固定的IP上发,不说均衡,这个IP甚至可能已经失效了呢。
有一个配置文件上的小Hack可以实现Nginx每次去查询DNS,我本来准备写一篇文章来着,
现在看来不用了,我们找到了更优雅的API gateway
, Caddy 。
我上篇文章也写了一个它的简介。
接下来的所有代码,都在这个demo中,
你可以clone下来玩,也能在此基础上做自己的实验。
应用
我们先用golang写一个最简单的HTTP API,你可以用你会的任何语言写出来,
它为GET
请求返回 Hello World 加自己的 hostname .
package main
import (
"io"
"log"
"net/http"
"os"
)
// HelloServer the web server
func HelloServer(w http.ResponseWriter, req *http.Request) {
hostname, _ := os.Hostname()
log.Println(hostname)
io.WriteString(w, "Hello, world! I am "+hostname+" :)\n")
}
func main() {
http.HandleFunc("/", HelloServer)
log.Fatal(http.ListenAndServe(":12345", nil))
}
Docker 化
我们需要把上面的应用做成一个docker镜像,暴露端口12345
。
接着才有可能使用Docker Swarm
启动成集群。
本来做镜像特别简单,但我为了让大家直接拉镜像测试时快一点,用了两步构建,
先编译出应用,然后添加到比较小的alpine
镜像中。大家可以不必在意这些细节。
我们还是先来看看最终的docker-compose.yml
编排文件吧。
version: '3'
services:
app:
image: muninn/caddy-microservice:app
deploy:
replicas: 3
gateway:
image: muninn/caddy-microservice:gateway
ports:
- 2015:2015
depends_on:
- app
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
这是最新版本的docker-compose
文件,不再由docker-compose
命令启动,而是要用docker stack deploy
命令。
总之现在这个版本在编排方面还没有完全整合好,有点晕,不过能用。现在我们看到编排中有两个镜像:
-
muninn/caddy-microservice:app 这是我们上一节说的app镜像,我们将启动3个实例,测试上层的负载均衡。
-
muninn/caddy-microservice:gateway 这是我们接下来要讲的gateway了,它监听2015端口并将请求转发给app。
用 caddy 当作 gateway
为了让caddy当作gateway,我们主要来看一下Caddyfile
:
:2015 {
proxy / app:12345
}
好吧,它太简单了。它监听本机的2015端口,将所有的请求都转发到 app:12345 。
这个app,其实是一个域名,在docker swarm的网络中,它会被解析到这个名字服务随机的一个实例。
将来如果有很多app,将不同的请求前缀转发到不同的app就好啦。
所以记得写规范的时候让一个app的endpoint前缀尽量用一样的。
然后caddy也需要被容器化,感兴趣的可以看看Dockerfile.gateway .
运行服务端
理解了上面的内容,就可以开始运行服务端了。直接用我上传到云端的镜像就可以。本文用到的三个镜像下载时总计26M左右,不大。
clone我背景章节提到的库进入项目目录,或者仅仅复制上文提到的compose文件存成docker-compose.yml
,然后执行如下命令。
docker-compose pull
docker stack deploy -c docker-compose.yml caddy
啊,对了,第二个stack命令需要你已经将docker切到了swarm模式,如果没有会自动出来提示,根据提示切换即可。
如果成功了,我们检查下状态:
docker stack ps caddy
如果没问题,我们能看到已经启动了3个app和一个gateway。然后我们来测试这个gateway是否能将请求分配到三个后端。
测试
我们是可以通过访问http://{your-host-ip}:2015
来测试服务是不是通的,用浏览器或者curl。
然后你会发现,怎么刷新内容都不变啊,并没有像想象中的那样会访问到随机的后端。
不要着急,这个现象并非因为caddy像nginx那样缓存了dns导致均衡失败,而是另一个原因。
caddy为了反向代理的速度,会和后端保持一个连接池。当只有一个客户端的时候,用到总是那第一个连接呢。
为了证明这一点,我们需要并发的访问我们的服务,再看看是否符合我们的预期。
同样的,测试我也为大家准备了镜像,可以直接通过docker使用。
docker run --rm -it muninn/caddy-microservice:client
感兴趣的人可以看client文件夹里的代码,它同时发起了30个请求,并且打印出了3个后端被命中的次数。
另外我还做了一个shell版本,只需要sh test.sh
就可以,不过只能看输出拉,没有自动检查结果。
好了,现在我们可以知道,caddy可以很好的胜任微服务架构中的 API Gateway 了。
API Gateway
什么?你说没看出来这是个 API Gateway 啊。我们前边只是解决了容器项目中 API Gateway 和DNS式服务发现配合的一个难题,
接下来就简单了啊,我们写n个app,每个app是一个微服务,在gateway中把不同的url路由到不同的app就好了啊。
进阶
caddy
还可以轻松的顺便把认证中心做了,微服务建议用jwt做认证,将权限携带在token中,caddy稍微配置下就可以。
我后续也会给出教程和demo 。auth2.0我认为并不适合微服务架构,但依然是有个复杂的架构方案的,这个主题改天再说。
caddy
还可以做API状态监控
,缓存
,限流
等API gateway的职责,不过这些就要你进行一些开发了。
相关推荐
5. **反向代理**:Caddy可以作为反向代理,将请求转发到其他服务器,便于微服务架构和负载均衡。 6. **动态文件服务器**:Caddy内置了静态文件服务器功能,可以直接服务于网站的静态资源。 7. **API支持**:Caddy...
Caddy的反向代理功能强大,可以将请求转发到其他服务器,例如API服务或内部网络中的应用: ``` yourdomain.com { reverse_proxy backend.example.com } ``` ### 7. 身份验证与访问控制 Caddy支持多种身份验证...
Caddy还具有模块化的设计,允许开发者根据需求添加额外的功能,例如对FTP服务器的支持、实时日志查看、API接口等。通过Caddy的插件系统,社区已经创建了许多扩展,进一步增强了Caddy的功能。 在性能方面,Caddy利用...
Caddy是一款轻量级、高性能且功能丰富的Web服务器,它以简单易用和自动化配置而闻名。这个压缩包“caddy_v1.0.0-beta1_windows_amd64_custom.zip”是Caddy的v1.0.0 beta 1版本,专为Windows 64位操作系统设计。在...
7. API集成:Caddy还提供了API接口,可以与其他系统集成,如动态DNS服务、监控工具等。 8. 插件扩展:Caddy社区开发了许多插件,增强了其核心功能,如电子邮件服务、实时日志查看、WebDAV支持等。 9. 多平台支持:...
- `|`(管道):将前一个命令的输出作为后一个命令的输入。 - `bash`:执行shell脚本的命令。 - `-s`:表示从标准输入读取命令,这里指执行`personal`选项。 - `personal`:指定安装模式,适用于个人用途。 3. ...
**Laravel 开发与 PHP-Caddy 环境搭建指南** ...然而,搭建一个高效的开发环境是每个开发者都需要面对的...PHP-Caddy的易用性和灵活性使得它可以作为日常开发的理想选择。记得定期更新Caddy和PHP以保持最佳性能和安全性。
:warning_selector: 该插件不再维护,也不与Caddy 2+兼容。 该插件使用在Caddy上创建服务。 为了工作,它在Caddy可执行文件上实现了两个标志: -name ,与服务名称相对应(默认值: Caddy )。 -service ,可以...
CADDY-DOCKER-PROXY CADDY V2! 此插件已更新到Caddy V2。 Master分支和Docker CI映像现在专用于V2。 介绍 该插件使caddy可用作Docker的反向代理。 它是如何工作的? 它扫描Docker元数据以查找指示该服务或容器应...
**Caddy Web 服务器与Filebrowser插件** Caddy是一款现代化的HTTP/2 web服务器,以其易用性和灵活性而受到开发者们的欢迎。它提供了一种简单的方法来配置HTTPS,自动获取和续订TLS证书,使得搭建安全的网站变得非常...
Caddy可以用于静态和动态网站,当然不少人看到了Caddy易于安装部署的特点,将Caddy与网盘、下载等各类应用整合,这样既发挥了Caddy部署配置简单的优势,同时又可以最大限度地节省服务器资源,专注于第三方应用的开发...
此外,标签中的`caddy_linux-amd`和`caddy_linux-upstart`表明了这个软件包可能不仅适用于一般的Linux环境,还考虑到了使用Upstart作为初始化系统的Linux发行版。Upstart是Ubuntu早期版本中的一个事件驱动的初始化...
不知道为什么 caddy web 服务器官网把 filemanager 插件干掉了,这是我之前下载的Linux 64位环境下只带 filemanager 插件的版本,自己一直在用这个,感觉很方便,希望对大家有帮助; 版本号:caddy_v0.11.1_linux_...
Caddy提供了丰富的API和远程控制接口,可以方便地集成到自动化运维工具和监控系统中,如Prometheus和Grafana,帮助管理员实时了解服务器状态。 综上所述,Caddy作为一款用Go语言构建的web服务器,其在Linux环境下...
linux环境 免安装 caddy2 脚本文件 ARM:飞腾、鲲鹏 MIPS:龙芯 X86:兆芯、海光、Intel、AMD 查看 arch / uname -a
在本文中,我们将深入探讨如何使用Caddy Web服务器作为反向代理来安装和配置Ghost博客。Ghost是一款基于Node.js的开源博客平台,以其简洁、优雅的界面和强大的内容创作工具而受到众多博主的喜爱。Caddy则是一个现代...
为什么使用Caddy作为您的主要Web服务器非常简单。 但是,当您需要扩展应用程序时,Caddy限于其静态配置。 为了克服这个问题,我们使用docker-gen每次容器产生或死亡时生成配置。 现在扩展很容易!配置/选项caddy-gen...