云原生之API网关Traefik

news2025/1/19 3:35:24

1. 前言

        说到web服务的开源网关,我首先想到的是Nginx,最早使用的就是它,现在都还在使用它。系统上线了Docker Swarm集群之后,不继续使用Nginx直接做Docker服务的网关,是因为Nginx毕竟比Docker Swarm出现的早,其集成度还是不高。

        我们经过技术调研对比后,选择了Traefik作为微服务API网关,也是因为Traefik和Docker集成比较好,通过在各个应用程序的docker-compose.yml里设置labels,把Traefik声明清楚,服务能够被Traefik自动接管,用不着我们在nginx.conf里那样手工进行配置,这大大简化了我们的配置工作。   

        当然nginx ingress controller和k8s的搭配,我并没有亲自搭建过,虽然有几台AI服务器是采用这样的部署方式,都是厂家预安装好的。

2. 简介            

        Traefik是一个高性能、易用的API网关,支持多种后端服务,如Docker、Kubernetes等,它采用Go语言开发。

        Traefik官网文档地址是:Traefik Proxy Documentation - Traefik。

        Traefik基于EntryPoints入口点、Routers路由器、Middlewares 中间件和Services服务的概念。它主要功能包括动态配置、自动服务发现以及对多个后端和协议的支持。

  1. EntryPoints: EntryPoints对Traefit是一个网络入口点,它定义了接收数据包的端口port, 包括TCP和UDP。

  2. Routers: 路由器负责将传入的请求连接到可以处理这些请求的服务。

  3. Middlewares: 中间件附着于路由器上,它能够修改经过路由器的请求包和应答包。

  4. Services: 服务组件负责配置请求怎样达到实际的后端服务。

 

 

3. 安装

        各种安装方法说明参见官网:Traefik Installation Documentation - Traefik, 这里仅仅贴一下Docker Swarm集群里的安装方式,主要是docker-compose.yml编排:

version: "3.2"

services:
  gateway:
    image: traefik:v2.3.2
    command:
      - "--log.level=INFO"
      - "--api=true"
      - "--api.dashboard=true"
      - "--api.insecure=true"
      # 启用swarm模式支持
      - "--providers.docker.swarmMode=true"
      # 默认不公开容器
      - "--providers.docker.exposedbydefault=false"
      # 为traefik-net网络启用代理
      - "--providers.docker.network=gateway"
      # 开发环境:创建名为`web-dev`的入口点,并为其暴露于80端口。该入口点会指示其它容器在哪个端口公开
      - "--entrypoints.web-dev.address=:80"
      # 测试环境:创建名为`web-test`的入口点,并为其暴露于81端口。该入口点会指示其它容器在哪个端口公开      
      - "--entrypoints.web-test.address=:81"
      # 预发布环境:创建名为`web-staging`的入口点,并为其暴露于82端口。该入口点会指示其它容器在哪个端口公开
      - "--entrypoints.web-stagin.address=:82"      
    ports:
      - 2080:80
      - 2081:81
      - 2082:82
      - 1080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - gateway
    deploy:
      placement:
        constraints:
          - node.labels.traefik == true

networks:
  gateway:
    external: true

        安装的操作不外乎在docker-compose.yml所在目录执行:

docker-compose up -d 

docker ps | grep traefik

docker service ls | grep traefik

        如果安装成功,则管理web地址是:http://127.0.0.1:1080/dashboard/#/,肯定不是127.0.0.1,换上实际IP地址即可。

4. EntryPoints 

        

        上图说明了EntryPoints可以支持多个端口,它向外部网络提供服务访问的入口点,架构上和功能细节上不用去细分析,那么配置上体现在哪里,我们怎么配置多个EntryPoint。

      - "--entrypoints.web-dev.address=:80"
      # 测试环境:创建名为`web-test`的入口点,并为其暴露于81端口。该入口点会指示其它容器在哪个端口公开      
      - "--entrypoints.web-test.address=:81"
      # 预发布环境:创建名为`web-staging`的入口点,并为其暴露于82端口。该入口点会指示其它容器在哪个端口公开
      - "--entrypoints.web-stagin.address=:82"      
    ports:
      - 2080:80
      - 2081:81
      - 2082:82

        就是上面这几行,我们有3个环境,那可以配置3个EntryPoint,Traefik也是一个docker服务,也是以容器运行,所以它的内部端口是80,81,82,暴露给外部的是2080,2081,2082, 我们想怎么做端口规划就怎么配置。 

 

         我们的3个EntryPoint配置应该在traefik dashboard界面上看得见,上图我的实际配置稍有不同而涂抹掉了,方法是一样的。

5. Routers

      

        路由器在EntryPoint和Service之间,自然是路由分发的作用, 同理,我们不要去纠结它的架构和功能细节,主要在使用上怎么配置让路由正确生效。

        这里不需要在Traefik的docker-compose.yml里配置,而是在各个Docker Swarm上部署的应用程序docker-compose.yml里配置,Traefik会自动扫描发现并让路由配置生效,这个方式非常好,也是一种自动注册与发现。例如我在用户中心管理系统的docker-compose.yml里这样配置:

      labels:
        - "traefik.enable=true"
        # 路由规则
        - "traefik.http.routers.usercenter-${SCOPE}.rule=PathPrefix(`/uc`)"
        # 中间件引用
        - "traefik.http.routers.usercenter-${SCOPE}.middlewares=auth-${SCOPE}"
        # 入口点
        - "traefik.http.routers.usercenter-${SCOPE}.entrypoints=web-${SCOPE}"
        # 服务负载均衡
        - "traefik.http.services.usercenter-${SCOPE}.loadbalancer.server.port=80"
        # 中间件定义:委派认证中间件(此处定义,其他服务直接引用,不能重复定义)
        - "traefik.http.middlewares.auth-${SCOPE}.forwardauth.address=http://usercenter-${SCOPE}_authservice/auth/"
        - "traefik.http.middlewares.auth-${SCOPE}.forwardauth.authResponseHeaders=user_id,user_name"
        - "traefik.http.middlewares.auth-${SCOPE}.forwardauth.trustForwardHeader=true"

        Routers和其它三个模块都有交互,处在中心位置,所以它的配置涉及了入口点EntryPoint、路由规则rule、中间件Middlewares和服务services负载均衡的配置,每个应用程序服务配置只需前面5行,下面的中间件定义,下面再讲。 

        我们在traefik dashboard上可以看到路由器的生效配置:

 

6. Middlewares 

        

        Middleware中间件附着于路由器上,它能够修改经过路由器的请求包和应答包,而且可以配置很多个。有两类中间件:HTTP和TCP,官网文档:Traefik Proxy Middleware Overview - Traefik

         

 

 

        例如,我利用ForwardAuth中间件来做认证鉴权,上面docker-compose.yml的中间件定义就是如此:

        # 中间件定义:委派认证中间件(此处定义,其他服务直接引用,不能重复定义)
        - "traefik.http.middlewares.auth-${SCOPE}.forwardauth.address=http://usercenter-${SCOPE}_authservice/auth/"
        - "traefik.http.middlewares.auth-${SCOPE}.forwardauth.authResponseHeaders=user_id,user_name"
        - "traefik.http.middlewares.auth-${SCOPE}.forwardauth.trustForwardHeader=true"

        中间件定义只要在用户认证中心的系统里定义一次就可以了,具体你在哪个服务里定义随你的便,但是要符合架构定义。

        在其它业务系统里如果需要进行用户认证鉴权,就在docker-compose.yml加入一行引用即可。例如:

# 中间件引用
        - "traefik.http.routers.usercenter-${SCOPE}.middlewares=auth-${SCOPE}"

        也就是我的usercentor服务引用了auth中间件,外部进来的HTTP请求会被Router先发往http://usercenter-${SCOPE}_authservice/auth/,

        auth组件返回200才前传给后面的service组件,不然就会返回认证失败,如401、403错误码。  

        我们在traefik dashboard上可以看到中间件的生效配置:

        

 7. Services

         

         这里的服务是Traefik的服务组件,负责把请求分发到后端实际的服务组件去,同时做好负载均衡,具体参见官方文档:Traefik Services Documentation - Traefik。

        # 容器内的入口点,treafik无法获知你的服务的访问入口点,所以你必须以此告诉Traefik
        # Traefik同时会在此对横向拓展的容器建立负载均衡
        # 更多见https://docs.traefik.io/routing/services/
        - "traefik.http.services.demo-service-${SCOPE}.loadbalancer.server.port=80"

        同样,在traefik dashboard界面上可以看到服务的配置:

8. 云原生部署架构

        Traefik的功能细节有很多,具体不再累述,那么云原生知识点讲的网关这里,基本的环境部署技术点也算出来了,对一个小型云原生应用系统基本可以运作了。例如我们可能有这样一个部署架构:

        我们的系统已经容器化、集群化、支持服务编排、具有服务注册和发现机制、具有负载均衡能力、对外提供API网关能力,使用的技术也比较简单,小团队都可以hold得住。

9. 总结

        Traefik是一个采用Go语言开发的高性能、易用的微服务API网关,支持多种后端服务,如Docker、Kubernetes等,它有4个主要组件EntryPoints、Routers、Middlewares和Services, 提供路由、服务发现、负载均衡和大量好用的中间件功能。

        

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1470044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#】用于基于 UV DLP 的 3D 打印机的切片软件源码解析(一)DLP原理 GUI

0. 原理 基于 UV DLP 的 3D 打印机的工作原理是这样的: UV DLP 是一种使用数字光处理(Digital Light Processing)技术的 3D 打印方法,它利用紫外光(UV)来固化液态树脂,从而形成实体物体。UV DLP…

yolov8添加注意力机制模块-CBAM

修改 在tasks.py(路径:ultralytics-main/ultralytics-main - attention/ultralytics/nn/tasks.py)文件中,引入CBAM模块。因为yolov8源码中已经包含CBAM模块,在conv.py文件中(路径:ultralytics-…

从专业到大众:Sora如何颠覆传统视频制作模式

随着科技的飞速进步,人工智能(AI)技术正逐渐渗透到我们生活的方方面面。在视频制作领域,OpenAI推出的Sora模型为这一传统行业带来了前所未有的变革。Sora不仅改变了视频制作的技术门槛,更将视频制作从专业人士的手中解放出来,推向…

LeetCode 1637.两点之间不包含任何点的最宽垂直区域

给你 n 个二维平面上的点 points ,其中 points[i] [xi, yi] ,请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 垂直区域 的定义是固定宽度,而 y 轴上无限延伸的一块区域(也就是高度为无穷大)。 最宽垂直区…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…

opencv基础 python与c++

question: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib Opencv 一、读取图片 (1).imshow Mat imread(const string& filename, intflags1 );flags: enum { /* 8bit, color or not */CV_LOAD_IMAGE_UNCHANGED -1, /* 8bit, gray */CV_LOAD_I…

小白水平理解面试经典题目LeetCode 404 Sum of Left Leaves【Tree】

404 左叶之和 小白翻译 给定二叉树的root,返回所有左叶的总和。 叶子是没有子节点的节点。左叶是另一个节点的左子节点的叶。 例子 小白教室做题 在大学某个自习的下午,小白坐在教室看到这道题。想想自己曾经和白月光做题,现在大过年的&a…

使用Templ进行Go模板化

使用Templ在Go项目中高效生成动态内容的指南 动态内容生成是Web开发的一个基本方面。无论您是在构建网站、Web应用程序还是API,根据数据和模板生成动态内容的能力都至关重要。在Go编程世界中,一个名为“Templ”的强大工具简化了这一过程。在这份全面的指…

【Crypto | CTF】BugKu 简单的RSA

天命:这题也不算简单了,要反编译,要灵活一点 首先收到pyc文件,拿去反编译出来,可以用在线反编译,也可以用工具反编译 在线:python反编译 - 在线工具 工具:https://download.csdn.n…

Vue packages version mismatch 报错解决

问题 npm run dev 运行项目的过程中,报错 Vue packages version mismatch 解决方法 根据报错不难看出是 vue 与 vue-template-compiler 版本产生了冲突,vue 与 vue-template-compiler 的版本是需要匹配的。所以解决的办法就是先修改其中一个的版本将 v…

Linux环境下C语言实现ping命令

Linux环境下C语言实现ping命令 涉及的知识点 Linux信号量的使用 SIGALRM信号是操作系统中的其中一个信号。他的作用是设置进程隔多久后会收到一个SIGALRM信号 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> …

AI赋能Oracle DBA:以自然语言与Oracle数据库互动

DBA AI助手&#xff1a;以自然语言与Oracle数据库互动 0. 引言1. AI赋能Oracle DBA的优势2. AI如何与Oracle数据库交互3. 自然语言查询的一些示例4. 未来展望 0. 引言 传统的Oracle数据库管理 (DBA) 依赖于人工操作&#xff0c;包括编写复杂的SQL语句、分析性能指标和解决各种…

PHP语言检测用户输入密码及调用Python脚本

现在有一份计算流体力学N-S方程的Python脚本&#xff0c;想要在用户登录网站后可以可以运行该脚本&#xff0c;然后将脚本运行后绘制的图片显示在用户网页上。 建一个名为N_S.py的python脚本文件&#xff0c;这个脚本在生成图像后会自行关闭&#xff0c;随后将图片保存在指定的…

【读文献】DynamicBind生成式模型预测蛋白配体复合物

published at nature communication (2024.01.24) code link paper link 摘要 尽管在预测静态蛋白质结构方面取得了重大进展&#xff0c;但蛋白质的内在动态性&#xff0c;受到配体调节&#xff0c;对于理解蛋白质功能和促进药物发现至关重要。 传统的对接方法&#xff0c;常…

JDK9新特性:Java9的编程革新之旅

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

人工智能 — 点云模型

目录 一、点云模型1、三维图像2、点云1、概念2、内容 3、点云处理的三个层次1、低层次处理方法2、中层次处理方法3、高层次处理方法 二、Spin image 一、点云模型 1、三维图像 三维图像是一种特殊的信息表达形式&#xff0c;其特征是表达的空间中三个维度的数据。 和二维图像…

【Java程序员面试专栏 算法思维】三 高频面试算法题:搜索算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊搜索算法,以岛屿问题为切入点练习,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间岛屿数量网格搜索分别向上下左右四个方向探索,遇到海…

【Oracle】玩转Oracle数据库(五):PL/SQL编程

前言 嗨&#xff0c;各位数据库达人&#xff01;准备好迎接数据库编程的新挑战了吗&#xff1f;今天我们要探索的是Oracle数据库中的神秘魔法——PL/SQL编程&#xff01;&#x1f52e;&#x1f4bb; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;五&#xff09;&#xff1…

【数据结构和算法初阶(c语言)】数据结构前言,初识数据结构(给你一个选择学习数据结构和算法的理由)

1.何为数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。本质来讲就是在内存中去管理数据方式比如我们的增删查改。在内存中管理数据的方式有很多种&#xff08;比如数组结构、链式结构、树型结…

导图解文 从梦想到财富(43)只要会请客吃饭,你就能设计出好产品

系列文章说明&#xff1a; 本系列文章 主要是 使用 ​​​​​​​思维导图 对知乎 上一个知乎上的专题系列文章《从梦想到财富》的 一个解读。 1 文章链接 本章节 对应 《从梦想到财富》专栏的 文章链接为&#xff1a;只要会请客吃饭&#xff0c;你就能设计出好产品 2 导图…