`
m635674608
  • 浏览: 5026957 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

caddy 作为微服务的 API gateway

 
阅读更多

 caddy 作为微服务的 API gateway

转自:http://studygolang.com/articles/9616

背景

大家都知道,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 gatewayCaddy 。
我上篇文章也写了一个它的简介。

接下来的所有代码,都在这个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的职责,不过这些就要你进行一些开发了。

 

分享到:
评论

相关推荐

    caddy_linux_amd64

    5. **反向代理**:Caddy可以作为反向代理,将请求转发到其他服务器,便于微服务架构和负载均衡。 6. **动态文件服务器**:Caddy内置了静态文件服务器功能,可以直接服务于网站的静态资源。 7. **API支持**:Caddy...

    Caddy_caddy_

    Caddy的反向代理功能强大,可以将请求转发到其他服务器,例如API服务或内部网络中的应用: ``` yourdomain.com { reverse_proxy backend.example.com } ``` ### 7. 身份验证与访问控制 Caddy支持多种身份验证...

    Caddy

    Caddy还具有模块化的设计,允许开发者根据需求添加额外的功能,例如对FTP服务器的支持、实时日志查看、API接口等。通过Caddy的插件系统,社区已经创建了许多扩展,进一步增强了Caddy的功能。 在性能方面,Caddy利用...

    caddy_v1.0.0-beta1_windows_amd64_custom.zip

    Caddy是一款轻量级、高性能且功能丰富的Web服务器,它以简单易用和自动化配置而闻名。这个压缩包“caddy_v1.0.0-beta1_windows_amd64_custom.zip”是Caddy的v1.0.0 beta 1版本,专为Windows 64位操作系统设计。在...

    开源项目-mholt-caddy.zip

    7. API集成:Caddy还提供了API接口,可以与其他系统集成,如动态DNS服务、监控工具等。 8. 插件扩展:Caddy社区开发了许多插件,增强了其核心功能,如电子邮件服务、实时日志查看、WebDAV支持等。 9. 多平台支持:...

    caddy服务器安装与调试

    - `|`(管道):将前一个命令的输出作为后一个命令的输入。 - `bash`:执行shell脚本的命令。 - `-s`:表示从标准输入读取命令,这里指执行`personal`选项。 - `personal`:指定安装模式,适用于个人用途。 3. ...

    Laravel开发-php-caddy

    **Laravel 开发与 PHP-Caddy 环境搭建指南** ...然而,搭建一个高效的开发环境是每个开发者都需要面对的...PHP-Caddy的易用性和灵活性使得它可以作为日常开发的理想选择。记得定期更新Caddy和PHP以保持最佳性能和安全性。

    caddy-v1-service:将Caddy作为服务运行

    :warning_selector: 该插件不再维护,也不与Caddy 2+兼容。 该插件使用在Caddy上创建服务。 为了工作,它在Caddy可执行文件上实现了两个标志: -name ,与服务名称相对应(默认值: Caddy )。 -service ,可以...

    caddy-docker-proxy:Caddy作为Docker的反向代理

    CADDY-DOCKER-PROXY CADDY V2! 此插件已更新到Caddy V2。 Master分支和Docker CI映像现在专用于V2。 介绍 该插件使caddy可用作Docker的反向代理。 它是如何工作的? 它扫描Docker元数据以查找指示该服务或容器应...

    caddy_web服务器(添加filebrowser版本)

    **Caddy Web 服务器与Filebrowser插件** Caddy是一款现代化的HTTP/2 web服务器,以其易用性和灵活性而受到开发者们的欢迎。它提供了一种简单的方法来配置HTTPS,自动获取和续订TLS证书,使得搭建安全的网站变得非常...

    caddy_v0.11.0_linux_amd64_custom_personal.tar.gz

    Caddy可以用于静态和动态网站,当然不少人看到了Caddy易于安装部署的特点,将Caddy与网盘、下载等各类应用整合,这样既发挥了Caddy部署配置简单的优势,同时又可以最大限度地节省服务器资源,专注于第三方应用的开发...

    caddy_linux_amd64_custom.zip_caddy linux amd_caddy linux-upstart

    此外,标签中的`caddy_linux-amd`和`caddy_linux-upstart`表明了这个软件包可能不仅适用于一般的Linux环境,还考虑到了使用Upstart作为初始化系统的Linux发行版。Upstart是Ubuntu早期版本中的一个事件驱动的初始化...

    caddy_web服务器(添加filemanager版本)

    不知道为什么 caddy web 服务器官网把 filemanager 插件干掉了,这是我之前下载的Linux 64位环境下只带 filemanager 插件的版本,自己一直在用这个,感觉很方便,希望对大家有帮助; 版本号:caddy_v0.11.1_linux_...

    caddy-master.zip_Linux https server_golang

    Caddy提供了丰富的API和远程控制接口,可以方便地集成到自动化运维工具和监控系统中,如Prometheus和Grafana,帮助管理员实时了解服务器状态。 综上所述,Caddy作为一款用Go语言构建的web服务器,其在Linux环境下...

    linux环境 免安装 caddy2 脚本文件

    linux环境 免安装 caddy2 脚本文件 ARM:飞腾、鲲鹏 MIPS:龙芯 X86:兆芯、海光、Intel、AMD 查看 arch / uname -a

    Ghost-over-Caddy:此摘要将通过Caddy Web服务器安装Ghost博客作为反向代理

    在本文中,我们将深入探讨如何使用Caddy Web服务器作为反向代理来安装和配置Ghost博客。Ghost是一款基于Node.js的开源博客平台,以其简洁、优雅的界面和强大的内容创作工具而受到众多博主的喜爱。Caddy则是一个现代...

    caddy-gen:Docker容器的自动Caddy反向代理

    为什么使用Caddy作为您的主要Web服务器非常简单。 但是,当您需要扩展应用程序时,Caddy限于其静态配置。 为了克服这个问题,我们使用docker-gen每次容器产生或死亡时生成配置。 现在扩展很容易!配置/选项caddy-gen...

Global site tag (gtag.js) - Google Analytics