2019独角兽企业重金招聘Python工程师标准>>>

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 gateway, Caddy 。
我上篇文章也写了一个它的简介。

接下来的所有代码,都在这个demo中,
你可以clone下来玩,也能在此基础上做自己的实验。

应用

我们先用golang写一个最简单的HTTP API,你可以用你会的任何语言写出来,
它为GET请求返回 Hello World 加自己的 hostname .

package mainimport ("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:appdeploy:replicas: 3gateway:image: muninn/caddy-microservice:gatewayports:- 2015:2015depends_on:- appdeploy:replicas: 1placement: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的职责,不过这些就要你进行一些开发了。

转载于:https://my.oschina.net/xiaominmin/blog/1598448

caddy 作为微服务的 API gateway相关推荐

  1. 微服务之API Gateway

    # 介绍 API Gateway 是一个服务器,也可以说是系统进入的唯一入口.API Gateway封装了内部的架构,提供API给各个客户端,它还有其他的功能,比如:授权.监控.负载均衡.缓存.请求分 ...

  2. 【go-zero】go-zero开发环境 如何聚合所有api? caddy反向代理服务分发 微服务设计api聚合方法 best practice

    帮助go-zero开发者聚合api 相关视频 一.go-zero 微服务整体架构 1.微服务的基本架构 2.go-zero 微服务的 api authrpc.api 文件 routes.go 文件 二 ...

  3. 微服务之API网关接口设计

    微服务之API网关接口设计 API网关,顾名思义,就是外部到内部的一道门,其主要功能: 服务路由:将前段应用的调用请求路由定位并负载均衡到具体的后端微服务实例,对于前端应用看起来就是1个应用提供的服务 ...

  4. 微服务之API网关:Kong:概要与安装

    Kong是一个基于Apache License 2.0的开源项目,是一个云原生的快速可扩的分布式微服务抽象层,应用场景为微服务的API网关,类似于spring cloud的zuul. 概要信息 项目 ...

  5. 《企业IT架构转型之道》随笔之SOA、ESB、微服务、API网关(2019-08-07)

    <企业IT架构转型之道>随笔之SOA.ESB.微服务.API网关(2019-08-07) 名词注释 为什么会进化 展望 作者在本章中提到的"烟筒式"系统建设模式,在目前 ...

  6. 微服务网关API Geteway

    什么是API网关(API Geteway) 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计.开发.测试.部署和管理.这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不 ...

  7. 使用Kong和Konga管理微服务和API

    Kong是Mashape开源的高性能高可用API网关和API服务管理层.自2015年在github开源后,广泛受到关注.它基于OpenResty,进行API管理,并提供了插件实现API的AOP.Kon ...

  8. 深度好文 — 微服务和API网关限流熔断实现关键逻辑思路

    来源:https://www.toutiao.com/i6853970319745483275/?group_id=6853970319745483275 今天准备谈下微服务架构和API网关中的限流熔 ...

  9. Re:从 0 开始的微服务架构--(三)微服务架构 API 的开发与治理--转

    原文来自:聊聊架构公众号 前面的文章中有说到微服务的通信方式,Martin Folwer 先生在他对微服务的定义中也提到"每个服务运行在其独立的进程中,服务与服务间采用 轻量级的通信机制 互 ...

  10. .net core 微服务之API网关 开源中间件 Ocelot 笔记

     一夫当关万夫莫开 一:源起: 当我们的应用不再是单体架构时,微服务将原先单体下的功能组件分割后,产生了许多个微服务,实际上我们还是以前那样的操作,访问服务接口,达到我们的目的,而这次不过是换成了ht ...

最新文章

  1. 和12岁小同志搞创客开发:拿到一款控制器,要怎么分析?
  2. C#实现rabbitmq 延迟队列功能
  3. 在Servlet中获取Spring注解的bean
  4. 计算机网络入门指南之计算机网络体系结构
  5. python中字典和集合对象是无序的_Python基础(四):元组、字典和集合
  6. java 映射数组_Java中的数组,列表,集合,映射,元组,记录文字
  7. Linux嵌入式入门
  8. LeetCode 143. 重排链表(链表反转+快慢指针)
  9. CV Papers|计算机视觉论文推荐周报20200601期
  10. 关于Redis Cluster的几个问题
  11. 新型冠状病毒数据抓取及整理详细流程
  12. 什么叫AI优先?不如你看谷歌CEO的办公位在哪儿
  13. 关于开放源代码的定义
  14. 国际c语言混乱编码大赛,国际C语言混乱代码大赛(IOCCC)
  15. Web前端JSP面试题
  16. UltraCompare无限30天试用的方法
  17. wx ipad协议
  18. alg 停用sip_如何关闭常用品牌的防火墙或路由器的SIP ALG功能
  19. 蓝桥网算法提高 学霸的迷宫
  20. 存储卡 android文件夹,安卓系统下SD卡文件夹功能介绍

热门文章

  1. Flex4.0判断摄像头是否被占用
  2. 【观点讨论与支撑】真的是而立之年没有立,以后就没有希望了吗?
  3. 【window操作系统下Github版本的回滚问题】
  4. 【Tensorflow2.0】关于制作标签遇到的问题小结
  5. SaveRasterFile failed: IDLnaMetadata Error:naGetMetadata-GetMetadataJob failed
  6. Matplotlib 入门(详看注释)
  7. 报错’TypeError: only integer scalar arrays can be converted to a scalar index‘
  8. php页面怎么改造mip,WordPress MIP 改造之 a 标签替换为 mip-link 跳转链接
  9. 项目:文本相似度分析(C++)
  10. StringUtils测试