当前位置: 首页 > news >正文

代码示范【FabEdge v0.8.0】配置 connector 公开端口

FabEdge项目简介:

FabEdge是博云在2021年8月发起,基于Kubernetes 构建的专注于边缘计算场景的容器网络方案,支持 KubeEdge 、SuperEdge、OpenYurt 等主流边缘计算框架。旨在解决边缘计算场景下容器网络配置管理复杂、网络割裂互不通信、缺少拓扑感知能力、无法提供就近访问等问题,适用于物联网,车联网、智慧城市、智慧园区等多种边缘场景

此后产品不断迭代,在2022年3月8日,博云正式将FabEdge捐献给CNCF社区,并通过相关评定,成为 CNCF 沙箱中首个边缘容器网络项目。目前FabEdge社区已有200多位开发者。

FabEdge最近正式发布了 V0.8.0 版本,该版本增强了边缘侧的服务访问能力,改善了边缘节点的连通性。

边缘侧服务访问能力增强

这次更新主要是改善KubeEdge集群边缘侧的服务访问能力,因为默认情况下KubeEdge集群不会有kube-proxy运行,也不能访问coredns。

FabEdge以前内部实现了一个fab-proxy来实现服务代理,并在边缘侧使用nodelocaldns提供服务域名解析,但是fab-proxy能力有限,且不能及时响应服务信息变更,nodelocaldns的也不适合边缘场景,为了解决以上问题,FabEdge此次更新将kube-proxy和coredns整合至fabedge-agent内,并利用edgecore的metaServer组件向fabedge-agent内的kube-proxy和coredns组件提供数据,从而为边缘节点上运行的容器提供了服务域名解析能力和服务代理。

允许配置connector节点的公开端口

FabEdge v0.8.0添加了connector公开端⼝配置的能⼒。之前FabEdge利用strongswan来创建VPN隧道实现云边通信,strongswan默认的端口为500和4500,connector节点的strongswan占用的端口通常需要做公网端口映射,映射出来的端口很可能不是500和4500,这样限制了FabEdge的使用场景。

这次更新之后,用户可以直接设置connector节点的公开端口,让strongswan可以通过非500和非4500端口建立隧道。但边缘侧暂时不能也没有必要进行端口配置,边缘侧的此类问题可以通过打洞(本次也有更新)功能来解决。

示例

配置connector节点公开端口

环境信息

* kubernetes v1.22.5

* kubeedge v1.12.2

* flannel v0.19.2

* fabedge v0.8.0

kubernetes集群节点信息如下:

其中beijing节点要作为connector节点,它和node1位于同一个局域网,edge1、 edge2位于另一个局域网。

想让边缘侧访问云端,需要为beijing节点做端口映射,这里我们选择将4500 映射为45000。

具体的映射方法需要读者根据环境调整,本文的beijing节点使用vagrant创建的,其实际映射配置为:

```ruby

# stongswan的通信端口,注意这里的协议为UDP

config.vm.network "forwarded_port", guest: 4500, host: 45000, protocol: "udp"

```

笔者开发时也会因为环境限制偶尔使用iptables来实现端口映射,具体规则为:

```shell

$ iptables -t nat -A PREROUTING -p udp --dport 45000 -j REDIRECT --to-ports 4500

```

这里再强调一次,使用strongswan的客户端使用非500端口进行IKE及通信时,服务端的实际目标端口为4500。

安装FabEdge

本文采用quickstart.sh脚本来安装,重点介绍一些参数配置,具体的安装文档参考[快速安装](https://github.com/FabEdge/fabedge/blob/main/docs/get-started_zh.md)。

1. 用helm添加fabedge repo: 

   ```shell

   $ helm repo add fabedge https://fabedge.github.io/helm-chart

   ```

2. 执行安装命令:

   ```shell

   $ curl https://fabedge.github.io/helm-chart/scripts/quickstart.sh | bash -s -- \

   --cluster-name beijing  \

   --cluster-role host \

   --cluster-zone beijing  \

   --cluster-region beijing \

   --connectors beijing \

   --edges edge1,edge2 \

   --connector-public-addresses 10.40.20.181 \

   --connector-public-port 45000 \

   --chart fabedge/fabedge

   ```

注意,上面的**connector-public-addresses**参数没有配置为beijing节点的内网地址192.168.56.11 ,而是beijing节点对外的地址**10.40.20.181**,端口也是我们之前映射的**45000**端口。

如果您选择手动安装FabEdge, 相应的配置可以参考以下内容:

      ```yaml

   cluster:

     name: beijing

     role: host

     region: beijing

     zone: beijing

     cniType: "flannel" 

     connectorPublicPort: 45000

     connectorPublicAddresses:

     - 10.22.45.16

     clusterCIDR:

     - 10.233.64.0/18

     serviceClusterIPRange:

     - 10.233.0.0/18

   agent:

     args:

以下两个参数仅需要在kubeedge环境打开

       ENABLE_PROXY: "true" 

       ENABLE_DNS: "true"

   ```

验证

来检查一下edge1, edge2跟connector创建的隧道信息:

```shell

$ fabctl swanctl list-sa edge1

========================== fabedge-agent-xfntz =================================

beijing.connector: #2, ESTABLISHED, IKEv2, aedd33719dd60b73_i* 1290e9570d67a570_r

  local  'C=CN, O=fabedge.io, CN=beijing.edge1' @ 10.22.46.30[4500]

  remote 'C=CN, O=fabedge.io, CN=beijing.connector' @ 10.40.20.181[45000]

  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519

  established 2682s ago, rekeying in 10461s

  beijing.connector-p2p: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128

    installed 2682s ago, rekeying in 599s, expires in 1279s

    in  c056eddc,      0 bytes,     0 packets

    out cba5947a,      0 bytes,     0 packets

    local  10.233.66.0/24

    remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24

  beijing.connector-p2n: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128

    installed 2681s ago, rekeying in 583s, expires in 1279s

    in  c60aff0c,      0 bytes,     0 packets

    out cc298e3f,      0 bytes,     0 packets

    local  10.233.66.0/24

    remote 192.168.56.11/32 192.168.56.12/32

  beijing.connector-n2p: #3, reqid 3, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128

    installed 2681s ago, rekeying in 663s, expires in 1279s

    in  cc583570,      0 bytes,     0 packets

    out c6a00d2f,      0 bytes,     0 packets

    local  10.22.46.30/32

    remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24

$ fabctl swanctl list-sa edge2

========================== fabedge-agent-gb5qd =================================

beijing.connector: #1, ESTABLISHED, IKEv2, 68cc6b323a3d9fe1_i* a572ff308882d651_r

  local  'C=CN, O=fabedge.io, CN=beijing.edge2' @ 10.22.46.28[4500]

  remote 'C=CN, O=fabedge.io, CN=beijing.connector' @ 10.40.20.181[45000]

  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519

  established 2683s ago, rekeying in 10862s

  beijing.connector-p2p: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128

    installed 2683s ago, rekeying in 625s, expires in 1277s

    in  c801df3f,      0 bytes,     0 packets

    out cea754ac,      0 bytes,     0 packets

    local  10.233.67.0/24

    remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24

  beijing.connector-p2n: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128

    installed 2683s ago, rekeying in 655s, expires in 1277s

    in  cf9528de,      0 bytes,     0 packets

    out c0785f9e,      0 bytes,     0 packets

    local  10.233.67.0/24

    remote 192.168.56.11/32 192.168.56.12/32

  beijing.connector-n2p: #3, reqid 3, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128

    installed 2683s ago, rekeying in 703s, expires in 1277s

    in  c6284776,      0 bytes,     0 packets

    out c0eefea6,      0 bytes,     0 packets

    local  10.22.46.28/32

    remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24

```

上面的输出结果包含这么一行:

```

remote 'C=CN, O=fabedge.io, CN=beijing.connector' @ 10.40.20.181[45000]

```

这就意味着edge1, edge2上的strongswan连接云端的strongswan时使用了10.40.20.181:45000这个地址,证明我们的配置成功了。下面让我们看看这个配置会影响edge1, edge2之间的通信吗?

先为edge1, edge2创建一个community:

```shell

cat > all-edges.yaml << EOF

apiVersion: fabedge.io/v1alpha1

kind: Community

metadata:

  name: all-edges

spec:

  members:

    - beijing.edge1

    - beijing.edge2

EOF

kubectl apply -f all-edges.yaml

```

然后检查edge1, edge2彼此之间的隧道信息:

```shell

$ fabctl swanctl list-sa edge1

========================== fabedge-agent-xfntz =================================

beijing.edge2: #4, ESTABLISHED, IKEv2, da14230995406a58_i* df83821754f9c263_r

  local  'C=CN, O=fabedge.io, CN=beijing.edge1' @ 10.22.46.30[4500]

  remote 'C=CN, O=fabedge.io, CN=beijing.edge2' @ 10.22.46.28[4500]

  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519

  established 62s ago, rekeying in 12926s

  beijing.edge2-p2p: #4, reqid 4, INSTALLED, TUNNEL, ESP:AES_GCM_16-128

    installed 62s ago, rekeying in 3245s, expires in 3898s

    in  cfeeafca,      0 bytes,     0 packets

    out c8c1f7aa,      0 bytes,     0 packets

    local  10.233.66.0/24

    remote 10.233.67.0/24

  beijing.edge2-p2n: #5, reqid 5, INSTALLED, TUNNEL, ESP:AES_GCM_16-128

    installed 62s ago, rekeying in 3233s, expires in 3898s

    in  cfefe387,      0 bytes,     0 packets

    out ccc83258,      0 bytes,     0 packets

    local  10.233.66.0/24

    remote 10.22.46.28/32

  beijing.edge2-n2p: #6, reqid 6, INSTALLED, TUNNEL, ESP:AES_GCM_16-128

    installed 62s ago, rekeying in 3420s, expires in 3898s

    in  c7f1a30b,      0 bytes,     0 packets

    out cabd83c9,      0 bytes,     0 packets

    local  10.22.46.30/32

    remote 10.233.67.0/24

$ fabctl swanctl list-sa edge2

========================== fabedge-agent-gb5qd =================================

beijing.edge1: #3, ESTABLISHED, IKEv2, da14230995406a58_i df83821754f9c263_r*

  local  'C=CN, O=fabedge.io, CN=beijing.edge2' @ 10.22.46.28[4500]

  remote 'C=CN, O=fabedge.io, CN=beijing.edge1' @ 10.22.46.30[4500]

  AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519

  established 213s ago, rekeying in 13060s

  beijing.edge1-p2p: #4, reqid 4, INSTALLED, TUNNEL, ESP:AES_GCM_16-128

    installed 213s ago, rekeying in 3137s, expires in 3747s

    in  c8c1f7aa,      0 bytes,     0 packets

    out cfeeafca,      0 bytes,     0 packets

    local  10.233.67.0/24

    remote 10.233.66.0/24

  beijing.edge1-n2p: #5, reqid 5, INSTALLED, TUNNEL, ESP:AES_GCM_16-128

    installed 213s ago, rekeying in 3040s, expires in 3747s

    in  ccc83258,      0 bytes,     0 packets

    out cfefe387,      0 bytes,     0 packets

    local  10.22.46.28/32

    remote 10.233.66.0/24

  beijing.edge1-p2n: #6, reqid 6, INSTALLED, TUNNEL, ESP:AES_GCM_16-128

    installed 213s ago, rekeying in 3209s, expires in 3747s

    in  cabd83c9,      0 bytes,     0 packets

    out c7f1a30b,      0 bytes,     0 packets

    local  10.233.67.0/24

    remote 10.22.46.30/32

```

从上面的输出结果可以看出:edge1与edge2之间的隧道依然利用4500通信,不受connector配置的影响。如果希望边缘节点之间通过500, 4500端口外的值通信要怎么办?

答案是不能且没必要,因为边缘网络比较复杂,为每个边缘节点的strongswan都进行端口映射是个很麻烦的事,而且有些节点本身就在一个局域网,它们之间用500, 4500通信,却为外部通信配置不同的端口也会引入复杂的配置工作。但有些时候,边缘节点就是需要跨网通信,不能配置端口又该怎么做,那就需要使用FabEdge v0.8.0引入的新特性:打洞,见下文。

以上介绍了配置connector公开端口的方法和效果,需要一提的是,一旦使用500, 4500外的端口进行通信,strongswan就会利用non-esp格式,这种格式会一定程度上影响性能,所以能使用500, 4500的情况下最好还是使用。

相关文章:

代码示范【FabEdge v0.8.0】配置 connector 公开端口

FabEdge项目简介&#xff1a; FabEdge是博云在2021年8月发起&#xff0c;基于Kubernetes 构建的专注于边缘计算场景的容器网络方案&#xff0c;支持 KubeEdge 、SuperEdge、OpenYurt 等主流边缘计算框架。旨在解决边缘计算场景下容器网络配置管理复杂、网络割裂互不通信、缺少…...

通过Python的PyPDF2库合并多个pdf文件

文章目录 前言一、PyPDF2库是什么&#xff1f;二、安装PyPDF2库三、查看PyPDF2库版本四、合并多个pdf文件1.引入库2.定义pdf路径3.获取所有要合并的PDF文件名4.创建一个新的PDF文件5.遍历所有PDF文件名6.打开PDF文件7.创建PDF阅读器对象8.遍历PDF中的每一页&#xff0c;并将它们…...

python基础 - python命名空间与作用域

命名空间是名称与对象之间的关系&#xff0c;可以将命名空间看做是字典&#xff0c;其中的键是名称&#xff0c;值是对象。 命名空间不共享名称。 在命名空间中的名称能将任何python对象作为值&#xff0c;在不同的命名空间中相同的名称可以与不同的对象相关联。但是&#xf…...

MapReduce实战案例(3)

案例三: MR实战之TOPN(自定义GroupingComparator) 项目准备 需求测试数据 有如下订单数据 订单id商品id成交金额Order_0000001Pdt_01222.8Order_0000001Pdt_0525.8Order_0000002Pdt_03522.8Order_0000002Pdt_04122.4Order_0000002Pdt_05722.4Order_0000003Pdt_01222.8 现在…...

Socket(三)

文章目录 1. 设置Socket选项2. TCP_NODELAY3. SO_LINGER4. SO_TIMEOUT5. SO_RCVBUF和SO_SNDBUF6. SO_KEEPALIVE7. OOBINLINE8. SO_REUSEADDR9. IP_TOS服务类型10. Socket异常 1. 设置Socket选项 Socket选项指定了Java Socket类所依赖的原生socket如何发送和接受数据&#xff0…...

【JVM】12. 垃圾回收相关概念

文章目录 12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出&#xff08;OOM&#xff09;内存泄漏&#xff08;Memory Leak&#xff09; 12.3. Stop The World12.4. 垃圾回收的并行与并发并发&#xff08;Concurrent&#xff09;并行&#xff08;Parallel&#xff09;并…...

Java 版 spring cloud 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

【Linux系统基础快速入门详解】Linux系统命令行介绍、命令提示符知识详解: ~/#/@等符号

Linux系统的命令行界面是Linux系统的核心部分,也是最常用的部分。在命令行界面中,用户可以使用各种Linux系统命令进行文件操作、系统管理、网络管理等操作。下面介绍一些常见的Linux系统命令行知识,以及命令提示符中的一些符号的含义。 1. 命令行界面 在Linux系统中,命令…...

Python 面向对象编程笔记:中级面向对象

__super__() 在 Python 中&#xff0c;super 是一个内置函数&#xff0c;用于调用父类方法。该函数可以在子类中调用父类中被重写的方法&#xff0c;从而实现对父类方法的继承并且进行扩展。它能够动态地查找当前子类继承链中的下一个类&#xff0c;从而允许设计者更加灵活地…...

JVM学习笔记(上)

1、总体路线 2、程序计数器 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记录下一条 jvm 指令的执行地址行号。 特点&#xff1a; 是线程私有的不会存在内存溢出 解释器会解释指令为机器码交给 cpu 执行&#xff0c;程序计数器会…...

反爬虫技术

预计更新 一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 …...

JAVA中.equals()与 ==的区别

1. “”是运算符&#xff0c;如果是基本数据类型&#xff0c;则比较存储的值&#xff1b;如果是引用数据类型&#xff0c;则比较所指向对象的地址值。 2..equals() equals是Object的方法&#xff0c;比较的是所指向的对象的地址值&#xff0c;一般情况下&#xff0c;重写之后比…...

华为OD机试之羊、狼、农夫过河(Java源码)

羊、狼、农夫过河 题目描述 羊、狼、农夫都在岸边&#xff0c;当羊的数量小于狼的数量时&#xff0c;狼会攻击羊&#xff0c;农夫则会损失羊。农夫有一艘容量固定的船&#xff0c;能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。只计算…...

C++ string的简单应用

C语言的字符串 C的字符串 头文件&#xff1a; #include<string.h> //c #include<string> //C #include<cstring> //C 比较string的大小 两个string对象相加 使用字符串对象来存放字符串 两个string对象相加 string str "Hello,"; st…...

Java中的阻塞队列

阻塞队列的基本概念 1、生产者、消费者的概念 他俩是设计模式的一种&#xff0c;提出这两种概念&#xff0c;通过一个容器的方式能解决强耦合问题 生产者、消费者之间不会直接通讯。通过一个第三方容器、队列的方式进行通讯 生产者生产完数据放入容器之后&#xff0c;不用等待消…...

PriorityBlockingQueue无界阻塞优先级队列

PriorityBlockingQueue无界阻塞优先级队列 PriorityBlockingQueue 是带优先级的无界阻塞队列&#xff0c;每次出队都返回优先级最高的元素&#xff0c;是二叉树最小堆的实 现&#xff0c;研究过数组方式存放最小堆节点的都知道&#xff0c;直接遍历队列元素是无序的。 如图 P…...

「HTML和CSS入门指南」p 标签详解

<p> 标签是什么? HTML5 中的 <p> 标签是用于定义段落的标签。它可以用来标记文章、新闻等长篇内容中的段落,并且可以与其他 HTML 元素配合使用。 <p> 标签的语法和属性 <p> 标签的语法非常简单,只需要在 HTML 文件中插入 <p> 和 </p>…...

【单目标优化算法】孔雀优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

chatgpt赋能python:Python同一行多个语句:如何提高你的编程效率?

Python同一行多个语句&#xff1a;如何提高你的编程效率&#xff1f; Python是一种优雅的编程语言&#xff0c;拥有简洁易懂的语法&#xff0c;可以帮助你快速编写可以在各种领域使用的高级代码。其中&#xff0c;Python同一行多个语句&#xff0c;是一种可以大大提高编程效率…...

Java反射概述

2 反射 2.1 反射概述 Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展2.2 反射获取Class类的对象 我们要想通过反…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...