路由和反向代理

Skipper是开放源代码HTTP路由器和用于服务组合的反向代理。 正如其GitHub页面所述,它旨在处理大量动态配置的HTTP路由定义(> 600,000个路由),并提供详细的查找条件并使用过滤器灵活地增加请求流。 它可以直接使用,也可以与自定义查找,过滤器逻辑和配置源一起扩展。

代理人

当有人想到代理时,他们会想到一个网页,该网页充当Intranet的网关或外观可疑的网页,旨在解除封锁学校或工作网络上的社交媒体网站。 前向代理是桌面基础结构的运营商用来节省Internet带宽,执行父母控制或限制社交媒体访问的代理。 另一种代理是个人用户导航到页面,提供凭据,然后转发到受保护的Intranet资源的代理。 这种代理的逆向是反向代理,它接受所有流量并将其转发到特定资源,例如服务器或容器。 这就是Skipper为基础架构所做的工作。

Matt Klein在有关现代网络负载平衡和代理的文章中,我意识到,作为Skipper维护者,我们应该解释有关为什么以及如何利用HTTP代理的更多功能和细节。 在本文中,我将把“ HTTP(反向)代理”和“ HTTP路由器”这两个术语视为相同。

HTTP路由

根据Wikipedia的说法:“路由是为网络中的流量选择路径的过程。” 此定义涉及OSI第3层的路由,最常见的是基于IP的路由协议,例如BGP或OSPF 。 由于本文不是其中之一,因此我将尝试解释HTTP路由器的含义。 但是首先,我想介绍Skipper,这是一个用Go编写的OSI 7层 HTTP路由器库,也是零售商Zalando的电子商务商店和Kubernetes Ingress基础结构的核心组件。

在Zalando,我们将Skipper用作Kubernetes Ingress控制器,以可视性,可靠性,安全性和附加功能为用户提供支持,以减轻常见应用程序的负担。

任何通常在微服务架构中运行HTTP服务的组织都需要将HTTP请求路由到正确的应用程序。 HTTP路由器根据HTTP请求提供的信息进行路由。 例如,以下显示了HTTP / 1.1请求。

GET /details HTTP/1.1
Host: www.zalando.de
User-Agent: curl/7.49.0
Accept: */*
Authorization: Bearer <token>
...

我们可以基于GET方法,路径/ detailsHost头文件www.zalando.de或请求的任意部分进行路由

应用程序所有者面临的一个常见问题是将一个API拆分为多个应用程序,因此您需要将一个组件的职责划分为多个子组件。 另一个常见的任务是支持重构。 也许您已经重写了应用程序的一部分,并且现在想单独部署它。

例如,假设您有一个商店,其中列出了产品及其详细信息,并且需要将其拆分为商店产品后端应用程序。 在/ ,您的商店显示产品列表,在/ details ,显示产品详细信息,例如颜色,尺寸,可持续性和价格。

图1:商店

您需要将产品详细信息的责任划分到其自己的应用程序中,以便将/保留在商店应用程序中,并将/ details重构为产品应用程序。

图2:两个后端应用程序, 产品商店

为了确保HTTP代理找到传入请求的正确后端,它使用路由表检查目标以确保其正确。

路由表

在船长,路由表通过拉动通过生成的信息创建dataclients从不同的来源。 一个来源可以是路由文件 ,类似于您在更流行的HTTP服务器(例如Apache或Nginx)中看到的文件 。

取决于组织的规模,或者更好的是,后端应用程序的数量,路由表可能会变得非常大。 Skipper将路由表实现为一棵树,该树可以扩展到超过600,000条路由(远远超出您要在Nginx或Apache配置中管理的路由)。

在上面的示例应用程序之后,表1显示了图2的路由表。 商店/应该路由到商店, /详细信息应该路由到产品应用程序。

路径 应用程式
/
/detail 产品

表1:路由表

Skipper中可用的数据客户端从不同来源获取路由以及路由的组成。

数据客户端

Skipper的路由文件dataclient中的路由配置类似于Nginx或Apache中HTTP代理所提供的配置。 在Skipper中,路由文件以eskip语法指定所有路由,如图3所示。

r1: P1() && P2() && .. && PN()
-> f1()
-> f2()
...
-> fN()
-> <backend>;
r2: ...
...

图3:eskip中的Routes文件

在上面:

  • r1,r2,...是唯一的routeID。
  • P1,P2,..,PN是定义匹配的谓词。
  • f1,f2,..,。fN是在选择路线之后应用的过滤器。 过滤器可以更改请求和响应。
  • 最后,定义了Skipper后端。 这可以是单个URL,负载均衡的URL列表,以及其他一些特殊情况(例如直接响应)的 URL。

路由字符串是另一个方便测试的数据客户端。 例如,如果您的演示需要一个伪后端,该伪后端使用HTML回复绿色背景,则可以使用:

$ skipper -routes-string = '*
-> inlineContent(
"<html><body style=\"background-color: green;\"></body></html>"
)'

到目前为止,Skipper最受欢迎的数据客户端是Kubernetes数据客户端,它用于从Kubernetes API服务器获取信息并从Skipper Ingress资源和RouteGroup自定义资源定义(CRD)创建路由表。

综上所述,数据客户端从不同的提供程序获取信息以构建Skipper的路由表。 表1显示了商店/说明示例的路由表,Skipper使用谓词选择处理请求的路由。

谓词

在Skipper中,将传入请求与所有路由的谓词进行匹配,以找到传入请求的最佳匹配路由。 谓词是根据传入请求进行匹配的函数。 在图2和表1的示例中,Skipper的路由表类似于图4:

shop: Path("/")
-> "https://shop.zalando";
product: Path("/detail")
-> "https://product.zalando";

图4:船长路由表

这意味着带有路径/的 HTTP请求将由Path(“ /”)谓词进行匹配,以便Skipper将执行车间路线。 具有路径/ detail的请求将由Path(“ / detail”)匹配,并路由到产品应用程序。

通常,可以通过谓词更改路由行为。 您可以选择很多谓词。 例如,仅当传递POST请求时, Method(“ POST”)才为true。 具有更多谓词的路由被认为是更具体的。 同样,具有更多谓词的路由比具有更少谓词的路由具有更大的权重。

特殊情况是Path()PathSubtree() ,它们在树中首先匹配,并减少了作为列表扫描的路由数。 例如,图5中所示的树结构有助于在Zalando的一种生产设置中将路线数量扩展到超过600,000条。

图5:树结构

筛选器

选择路由后,将应用请求过滤器 。 过滤器根据请求或响应进行工作; 他们可以将传入的请求更改为后端,也可以更改对客户端的响应。

例如, setRequestHeader(“ Foo”,“ bar”)将HTTP标头“ Foo”设置为值“ bar” ,以便后端在请求中看到此标头。

响应过滤器responseCookie(“ keks”,“ val”,3600)在对调用者的响应中设置一个名为“ keks”的Cookie,在这种情况下可能是浏览器。 Cookie的值为“ val” ,有效期为一小时。

在请求和响应上起作用的一种过滤器是enableAccessLog(40,5) 。 这将访问状态码为40x或5xx的后端所有响应的访问日志。

从示例中可以看到,过滤器可以更改请求或响应,或者仅基于请求或响应进行一些工作。 另一个过滤器示例是auth过滤器ratelimits 。 如果不允许请求通过,这些将阻止请求传递到后端。 例如,要从名为/ var / www的目录中提供静态内容,可以使用过滤器static(“ / var / www”)

学到更多

本文提供了Skipper及其功能的基本概述。 有关更多信息,请查阅Skipper的文档 ,并在评论中分享您的问题或反馈。

翻译自: https://opensource.com/article/20/4/http-kubernetes-skipper

路由和反向代理

路由和反向代理_试试这个Kubernetes HTTP路由器和反向代理相关推荐

  1. python反向代理服务器_主机、服务器,代理服务器,反向代理服务器理解(自用)...

    一.服务器和主机 当用作网络服务的机子时叫服务器.必须具有承担服务并且保障服务的能力,为其他网络设备提供网络服务. 最简单的一句话:主机和服务器是相对而言的. 专业的服务器的配置是很高的,不过本身从硬 ...

  2. python socks代理_如何让任意python程序使用socks代理

    问题描述 在尝试学习Flutter项目中的engine部分的源码的时候,需要先进行gclient sync操作来同步代码,而由于某些不可说的原因,会存在网络无法访问的问题,通常来讲我们可以通过设置系统 ...

  3. windows ssh代理_如何在Windows上通过SSH设置代理?

    windows ssh代理 This tutorial teaches how to set up SSH proxy on Linux. 本教程讲解如何在Linux上设置SSH代理 . How to ...

  4. mysql反向递归查询_递归查询所有下级部门树形结构反向递归获取所有ID集合

    mysql递归搜索再之前得原创文档里已经写明了,这个网上比较多. 直接进入正题:原创手写反递归 package com.kb.nxccims.common.util; import java.util ...

  5. 反向链接 反向代理_妇女与反向渠道

    反向链接 反向代理 Yesterday Drew and I were fortunate enough to be invited down to take part in the 12 hour ...

  6. 图解跨域请求、反向代理原理,对前端更友好的反向代理服务器 - Caddy

    关注 程序员成长指北,回复"1" 加入我们一起学习,天天进步 转载自:https://github.com/a1029563229/blogs/ 作者:晒兜斯 caddy 写在开头 ...

  7. vue路由匹配实现包容性_开发更具包容性的肤色范围

    vue路由匹配实现包容性 Nadia Fawaz | Research Scientist & Tech Lead, Applied Science, Bhawna Juneja | Soft ...

  8. 全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。

    文章目录 1. 文章引言 2. 何谓反向代理 3. 解析nginx的配置文件 3.1 全局块(global block) 3.2 events块(events block) 3.3 http块(htt ...

  9. 云服务器代理_虚拟主机代理_服务器代理-谈谈IDC加盟合作那些事!

    云服务器代理_虚拟主机代理_服务器代理-谈谈IDC加盟合作那些事! 在互联网和大数据时代,云服务器简单高效.安全可靠,弹性扩展,节省IT运维成本等优势受到客户青睐:无论是企业还是个人应用,越来越多的I ...

最新文章

  1. linux文件类型为ext4怎么扩展,如何扩展ext4分区和文件系统?
  2. 天涯社区服务器位置,天涯到底怎么了,哪份帖子都打不开,是服务器的问题吗...
  3. NumPy - np.linspace()
  4. java 交换两个数的值(临时变量,加减,异或)
  5. 【opencv】【第一玩】坤坤的篮球
  6. VBS的开发利器---WMI信息绑定参考地址
  7. 通过R访问世界银行数据(World Bank Data)分析经济
  8. 中科大自主招生计算机,中科大自主招生(中科大自主招生试题)
  9. 博通的网卡linux驱动,CentosRedhat下bcm43142博通无线网卡linux驱动
  10. MAC 网速问题 变慢 的来看看 经验
  11. Mac 中英文输入法切换快捷键caps lock失效解决办法
  12. MDS(multidimensional scaling)多维尺度分析
  13. webpack 模块打包器
  14. 中兴美国事件回顾:崛起的骄傲与威胁
  15. pp棉滤芯保安过滤器
  16. 招聘 | 上海交通大学医学院附属精神卫生中心诚招科研助理
  17. 2013年至今百余家P2P网站跑路
  18. Super Resolve Dynamic Scene from Continuous Spike Streams
  19. JS中单击多次执行一次的问题
  20. Scratch编程与数学之绘制六角形雪花!

热门文章

  1. springboot拦截器依赖注入失败
  2. Redis设计与实现阅读总结(一)数据结构和对象
  3. LeetCode: Maximum Subarray 解题报告
  4. WebSocket与http长连接的区别
  5. 从90年代的SRNN开始,纵览循环神经网络27年的研究进展
  6. Chapter 3 Phenomenon——13
  7. 统计mysql里每条SQL语句执行的时间
  8. Maximum Subarray leetcode java
  9. 软链接文件和硬链接文件
  10. UVa-10382 Watering Grass **