日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

原创 | 科普一个 Star 数为 28.5k 的云原生网关

發(fā)布時(shí)間:2024/4/11 编程问答 83 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原创 | 科普一个 Star 数为 28.5k 的云原生网关 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊上方“朱小廝的博客”,選擇“設(shè)為星標(biāo)”

后臺(tái)回復(fù)"加群",加入新技術(shù)群

?

歡迎跳轉(zhuǎn)本文原文鏈接:https://honeypps.com/architect/introduction-of-traefik/

Traefik (發(fā)音和 traffic 相同,采用 Golang 編寫)是一個(gè)云原生的新型的 HTTP 反向代理、負(fù)載均衡軟件。它負(fù)責(zé)接收系統(tǒng)的請(qǐng)求,然后使用合適的組件來(lái)對(duì)這些請(qǐng)求進(jìn)行處理。Traefik 兼容所有主流的集群技術(shù),比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon,等等;并且可以同時(shí)處理多種方式。(甚至可以用于在裸機(jī)上運(yùn)行的比較舊的軟件。)

官網(wǎng)地址:https://docs.traefik.io/。代碼托管地址:https://github.com/containous/traefik,截止目前 Star 數(shù)為 28.5k。

使用 Traefik,不需要維護(hù)或者同步一個(gè)獨(dú)立的配置文件:因?yàn)橐磺卸紩?huì)自動(dòng)配置,實(shí)時(shí)操作的(無(wú)需重新啟動(dòng),不會(huì)中斷連接)。使用 Traefik,你可以花更多的時(shí)間在系統(tǒng)的開發(fā)和新功能上面,而不是在配置和維護(hù)工作狀態(tài)上面花費(fèi)大量時(shí)間。

Traefik 也被稱之為邊緣路由器(Edge Router),是你整個(gè)平臺(tái)的大門,攔截并路由每個(gè)傳入的請(qǐng)求:它知道所有的邏輯和規(guī)則,這些規(guī)則確定哪些服務(wù)處理哪些請(qǐng)求;傳統(tǒng)的反向代理需要一個(gè)配置文件,其中包含路由到你服務(wù)的所有可能路由,而 Traefik 會(huì)實(shí)時(shí)檢測(cè)服務(wù)并自動(dòng)更新路由規(guī)則,可以自動(dòng)服務(wù)發(fā)現(xiàn)。

當(dāng)啟動(dòng) Traefik 時(shí),需要定義 Entrypoints(入口點(diǎn)),然后根據(jù)連接到這些 Entrypoints 的路由(Routes)來(lái)分析傳入的請(qǐng)求,來(lái)查看他們是否與一組規(guī)則(Rules)相匹配,如果匹配,則路由可能會(huì)將請(qǐng)求通過一系列中間件(Middlewares,相當(dāng)于Java中的攔截器Interceptor/過濾器Filter的概念)轉(zhuǎn)換過后再轉(zhuǎn)發(fā)到你的服務(wù)上去。在了解 Traefik 之前有幾個(gè)核心概念我們必須要了解:

  • Providers:用來(lái)自動(dòng)發(fā)現(xiàn)平臺(tái)上的服務(wù),可以是編排工具、容器引擎或者 key-value 存儲(chǔ)等,比如 Docker、Kubernetes、File

  • Entrypoints:監(jiān)聽傳入的流量(端口等…),是網(wǎng)絡(luò)入口點(diǎn),它們定義了接收請(qǐng)求的端口(HTTP 或者 TCP)。

  • Routers:分析請(qǐng)求(host, path, headers, SSL, …),負(fù)責(zé)將傳入請(qǐng)求連接到可以處理這些請(qǐng)求的服務(wù)上去。

  • Services:將請(qǐng)求轉(zhuǎn)發(fā)給你的應(yīng)用(load balancing, …),負(fù)責(zé)配置如何獲取最終將處理傳入請(qǐng)求的實(shí)際服務(wù)。

  • Middlewares:中間件,用來(lái)修改請(qǐng)求或者根據(jù)請(qǐng)求來(lái)做出一些判斷(authentication, rate limiting, headers, …),中間件被附件到路由上,是一種在請(qǐng)求發(fā)送到你的服務(wù)之前(或者在服務(wù)的響應(yīng)發(fā)送到客戶端之前)調(diào)整請(qǐng)求的一種方法。

Traefik 主要特征如下:

  • 支持動(dòng)態(tài)加載配置文件和優(yōu)雅重啟

  • 自動(dòng)的服務(wù)發(fā)現(xiàn)與負(fù)載均衡

  • 自動(dòng)配置ACME(Let's Encrypt)證書功能

  • 支持熔斷、重試

  • 內(nèi)置Web UI,管理相對(duì)方便

  • 支持WebSocket、HTTP/2、gRPC

  • metrics 的支持(Rest、Prometheus、Datalog、Statsd、InfluxDB)

  • 支持K8S、docker swarm等,和容器結(jié)合比較緊密

接下來(lái)講一下它的安裝、基本功能以及配置。Traefik 在 v1 與 v2 版本間差異過大,本文采用了 v2。Traefik v2.0 之后的版本在修改了很多bug之后也增加了新的特性,比如增加了TCP的支持,并且更換了新的WEB UI界面。

快速開始

我們使用 traefik:v2.2.0 作為鏡像啟動(dòng) traefik 服務(wù)。新建 traefik-v2.2.0.yaml 配置文件,內(nèi)容如下:

version: '3' services:reverse-proxy:image: traefik:2.2.0# Enables the web UI and tells Traefik to listen to docker# 啟用 webUI 并告訴 Traefik 去監(jiān)聽docker的容器實(shí)例command: --api.insecure=true --providers.dockerports:# Traefik暴露的http端口- "80:80"# webUI暴露的端口(必須指定--api.insecure=true才可以訪問)- "8080:8080"volumes:# 指定docker的sock文件來(lái)讓traefik獲取docker的事件,從而實(shí)現(xiàn)動(dòng)態(tài)負(fù)載均衡- /var/run/docker.sock:/var/run/docker.sock

使用 docker-compose 命令開啟 Traefik 服務(wù):

$ docker-compose -f traefik-v2.2.0.yaml up -d reverse-proxy

查看使用 docker-compose啟動(dòng)的應(yīng)用:

$ docker-compose -f traefik-v2.2.0.yaml psName Command State Ports ------------------------------------------------------------------------------------------------------------- traefik_reverse-proxy_1 /entrypoint.sh --api.insec ... Up 0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp

Traefik 一般需要一個(gè)配置文件來(lái)管理路由、服務(wù)、證書等。上面示例中,我們可以通過 docker 啟動(dòng) Traefik 時(shí)來(lái)掛載配置文件。在 Traefik 中的配置可以使用兩種不同的方式:

  • 動(dòng)態(tài)配置:完全動(dòng)態(tài)的路由配置

  • 靜態(tài)配置:啟動(dòng)配置

靜態(tài)配置中的元素(這些元素不會(huì)經(jīng)常更改)連接到 Providers 并定義 Treafik 將要監(jiān)聽的 Entrypoints。在 Traefik 中有三種方式定義靜態(tài)配置:在配置文件中、在命令行參數(shù)中、通過環(huán)境變量傳遞。動(dòng)態(tài)配置包含定義系統(tǒng)如何處理請(qǐng)求的所有配置內(nèi)容,這些配置是可以改變的,而且是無(wú)縫熱更新的,沒有任何請(qǐng)求中斷或連接損耗。

Traefik 的配置結(jié)構(gòu)圖如下:

使用 docker run traefik[:version] --help可查看 Traefik 的配置參數(shù)。

我們可以使用 http://localhost:8080/ 來(lái)訪問 Traefik 官方Dashboard,效果圖如下:

路由

接下來(lái)我們使用 docker-compose 啟動(dòng)一個(gè)簡(jiǎn)單的 http 服務(wù),配置文件(test-service.yaml)如下:

version: '3' services:whoami:image: containous/whoamilabels:- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"

啟動(dòng)服務(wù):

$ docker-compose -f test-service.yaml up -d whoami $ docker-compose -f test-service.yaml psName Command State Ports ------------------------------------------- traefik_whoami_1 /whoami Up 80/tcp

whoami 這個(gè) http 服務(wù)做了什么事情呢?1. 暴露了一個(gè) http 服務(wù),主要提供一些 header 以及 ip 信息;2. 配置了容器的 labels,設(shè)置該服務(wù)的 Host 為 whoami.docker.localhost,給 traefik 提供標(biāo)記。

此時(shí)我們可以通過 curl -H Host:whoami.docker.localhost http://localhost 來(lái)訪問 whoami 服務(wù),我們使用 curl 做測(cè)試:

$ curl -H Host:whoami.docker.localhost http://localhost Hostname: e9a4bd2e0a7a IP: 127.0.0.1 IP: 172.19.0.3 RemoteAddr: 172.19.0.2:33358 GET / HTTP/1.1 Host: whoami.docker.localhost User-Agent: curl/7.54.0 Accept: */* Accept-Encoding: gzip X-Forwarded-For: 172.19.0.1 X-Forwarded-Host: whoami.docker.localhost X-Forwarded-Port: 80 X-Forwarded-Proto: http X-Forwarded-Server: f660478db1e4 X-Real-Ip: 172.19.0.1

服務(wù)正常訪問。此時(shí)如果把 Host 配置為自己的域名,則已經(jīng)可以使用自己的域名來(lái)提供服務(wù)。在Dashboard中可以看到對(duì)應(yīng)的 HTTP Routers:

如果不設(shè)置 Host,訪問是會(huì)失敗的。

$ curl -i http://localhost HTTP/1.1 404 Not Found Content-Type: text/plain; charset=utf-8 X-Content-Type-Options: nosniff Date: Wed, 29 Apr 2020 09:44:56 GMT Content-Length: 19404 page not found

細(xì)表羅列了 Traefik 可用的路由規(guī)則:

規(guī)則描述
Headers(key, value)檢查 headers 中是否有一個(gè)鍵為 key值為value`的鍵值對(duì)
HeadersRegexp(key, regexp)檢查 headers 中是否有一個(gè)鍵為 key,值匹配正則表達(dá)式 regexp的鍵值對(duì)
Host(example.com, ...)檢查請(qǐng)求的域名是否包含在給定的 domains 域名中
HostRegexp(example.com, {subdomain:[a-z]+}.example.com, ...)檢查請(qǐng)求的域名是否匹配給定的 regexp正則表達(dá)式
Method(GET, ...)檢查請(qǐng)求的方法是否包含在給定的 methods (GET, POST, PUT, DELETE, PATCH) 中
Path(/path, /articles/{cat:[a-z]+}/{id:[0-9]+}, ...)匹配確定的請(qǐng)求路徑,它接受一系列文字和正則表達(dá)式路徑
PathPrefix(/products/, /articles/{cat:[a-z]+}/{id:[0-9]+})匹配請(qǐng)求前綴路徑,它接受一系列文字和正則表達(dá)式前綴路徑
Query(foo=bar, bar=baz)匹配查詢字符串參數(shù),接受key=value的鍵值對(duì)序列

我們可以使用 docker-compose up --scale命令來(lái)對(duì)容器橫向擴(kuò)容,下面將單機(jī)擴(kuò)容成2臺(tái):

$ docker-compose -f test-service.yaml up -d --scale whoami=2 WARNING: Found orphan containers (traefik_reverse-proxy_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. Starting traefik_whoami_1 ... done Creating traefik_whoami_2 ... done

此時(shí)再訪問curl http://localhost -H Host:whoami.docker.localhost時(shí)就會(huì)自動(dòng)負(fù)載均衡到2個(gè)不同的實(shí)例上去了。

在 Dashboard 中也有相關(guān)記錄:

References

  • https://docs.traefik.io/

  • https://www.cnblogs.com/xiao987334176/p/12447783.html

  • https://www.qikqiak.com/post/traefik-2.1-101/

  • https://github.com/shfshanyue/op-note/blob/master/traefik.md

  • 歡迎跳轉(zhuǎn)本文原文鏈接:https://honeypps.com/architect/introduction-of-traefik/

    想知道更多?描下面的二維碼關(guān)注我

    后臺(tái)回復(fù)”加群“獲取公眾號(hào)專屬群聊入口

    【原創(chuàng)系列 | 精彩推薦】

    • Paxos、Raft不是一致性算法嘛?

    • 越說(shuō)越迷糊的CAP

    • 分布式事務(wù)科普——初識(shí)篇

    • 分布式事務(wù)科普——終結(jié)篇

    • 面試官居然問我Raft為什么會(huì)叫做Raft!

    • 面試官給我挖坑:URI中的//有什么用

    • 面試官給我挖坑:a[i][j]和a[j][i]有什么區(qū)別?

    • 面試官給我挖坑:單機(jī)并發(fā)TCP連接數(shù)到底有多少?

    • 網(wǎng)關(guān)Zuul科普

    • 網(wǎng)關(guān)Spring Cloud?Gateway科普

    • Nginx架構(gòu)原理科普

    • OpenResty概要及原理科普

    • 微服務(wù)網(wǎng)關(guān) Kong 科普

    朕已閱?

    總結(jié)

    以上是生活随笔為你收集整理的原创 | 科普一个 Star 数为 28.5k 的云原生网关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。