kubernetes网络(三)之bird的路由反射器的使用

news2024/9/26 19:51:01

一、摘要

上一篇文章中我们用 bird 程序实现了三台服务器之间的BGP full mesh。本文我们将实验把full mesh方式改为RR 路由反射器方式 ,让宿主的BIRD相互学习到对方的容器网段,从而达到容器网段能相互通信的目的。

二、bird 实验

bird简介

  • BIRD 实际上是 BIRD Internet Routing Daemon 的缩写,是一款可运行在 Linux 和其他类 Unix 系统上的路由软件,它实现了多种路由协议,比如 BGP、OSPF、RIP 等。

brid路由反射器的学习

我们直接翻译计算机网络最权威的文档RFC的方式来学习。找到rfc4456中关于路由反射器的描述。

The basic idea of route reflection is very simple. Let us consider the simple example depicted in Figure 1 below.

路由反射的基本思想非常简单。让我们考虑下面图11所示的简单示例。


                   +-------+        +-------+
                   |       |  IBGP  |       |
                   | RTR-A |--------| RTR-B |
                   |       |        |       |
                   +-------+        +-------+
                         \            /
                     IBGP \   ASX    / IBGP
                           \        /
                            +-------+
                            |       |
                            | RTR-C |
                            |       |
                            +-------+

                    Figure 1: Full-Mesh IBGP

In ASX, there are three IBGP speakers (routers RTR-A, RTR-B, and RTR-C). With the existing BGP model, if RTR-A receives an external route and it is selected as the best path it must advertise the external route to both RTR-B and RTR-C. RTR-B and RTR-C (as IBGP speakers) will not re-advertise these IBGP learned routes to other IBGP speakers.

在自治域ASX中,有3个IBGP speekers(路由器RTR-A、RTR-B和RTR-C)。在现有的BGP模型下,如果RTR-A收到一条外部路由并被选为最佳路径,则必须同时向RTR-B和RTR-C发布这条外部路由。RTR-B和RTR-C(作为IBGP speaker)不会将学到的路由重新发布给其他IBGP speaker。

来我翻译翻译,这句话说出了BGP协议的2个重要规则:

  • 从EBGP学习到的路由,必须发布给其余的IBGP speaker。如上图,RTR-A必须同时向RTR-B和RTR-C发布这条外部路由。

  • 从IBGP学习到的路由,不能再重新发布给其余IBGP speaker。如上图,RTR-B不会将从RTR-A学到的路由发布给RTR-C。

If this rule is relaxed and RTR-C is allowed to advertise IBGP learned routes to IBGP peers, then it could re-advertise (or reflect) the IBGP routes learned from RTR-A to RTR-B and vice versa. This would eliminate the need for the IBGP session between RTR-A and RTR-B as shown in Figure 2 below.

如果放宽此规则,允许RTR-C向IBGP对等体发布学到的IBGP路由,即RTR-C可以向RTR-B重新发布从RTR-A学到的IBGP路由(这种重新发布方式我们也可称为reflect反射),反之亦然。这将RTR-A和RTR-B之间就无需建立IBGP会话了。

                  +-------+        +-------+
                  |       |        |       |
                  | RTR-A |        | RTR-B |
                  |       |        |       |
                  +-------+        +-------+
                        \            /
                    IBGP \   ASX    / IBGP
                          \        /
                           +-------+
                           |       |
                           | RTR-C |
                           |       |
                           +-------+

                Figure 2: Route Reflection IBGP

The route reflection scheme is based upon this basic principle.

路由反射方案就是基于这个基本原理实现的。

路由反射器中的概念或术语

We use the term route reflection to describe the operation of a BGP speaker advertising an IBGP learned route to another IBGP peer. Such a BGP speaker is said to be a “route reflector” (RR), and such a route is said to be a reflected route.

我们使用“路由反射”一词来描述BGP speaker将IBGP学到的路由通告给另一个IBGP对等体的操作。这样的BGP speaker被称为路由反射器RR (route reflector),这样的路由被称为反射路由

The internal peers of an RR are divided into two groups:

RR的内部对等体分为两类:

1). Client peers

2). Non-Client peers

An RR reflects routes between these groups, and may reflect routes among client peers. An RR along with its client peers form a cluster. The Non-Client peer must be fully meshed but the Client peers need not be fully meshed. Figure 3 depicts a simple example outlining the basic RR components using the terminology noted above.

一个RR是在group组内部的client peer 之间的反射路由。RR与其client peer客户端对等体组成集群clusternon-client非客户端对等体必须full mesh(全互联),但clent peer客户端对等体不必full mesh。图3描述了一个使用上述术语概述基本RR组件的简单示例。

                 / - - - - - - - - - - - - -  -
                 |           Cluster           |
                   +-------+        +-------+
                 | |       |        |       |  |
                   | RTR-A |        | RTR-B |
                 | |Client |        |Client |  |
                   +-------+        +-------+
                 |       \           /         |
                    IBGP  \         / IBGP
                 |         \       /           |
                           +-------+
                 |         |       |           |
                           | RTR-C |
                 |         |  RR   |           |
                           +-------+
                 |           /   \             |
                  - - - - - /- - -\- - - - - - /
                     IBGP  /       \ IBGP
                  +-------+         +-------+
                  | RTR-D |  IBGP   | RTR-E |
                  |  Non- |---------|  Non- |
                  |Client |         |Client |
                  +-------+         +-------+

                     Figure 3: RR Components

总结

  1. BGP协议默认的规则: 从IBGP学习到的路由,不能再重新发布给其余IBGP speaker,而RR路由反射器是打破了这个规则,所以才被称为路由反射器。
  2. 使用RR路由反射器后,bgp speaker 不需要full mesh全互联,只需要client 与 RR 建立BGP peer即可.(这是RR的最最主要的作用)
  3. RR 与 Non-client, non-client 与 non-client 之间还是必须全互联。(如上图所示,RR 不会 把RTR-D从外部学的路由的反射给RTR-E,所以要求RTR-D与RTR-E之前需要相互建立bgp peer关系)。

实验目标

  • 学习使用bird实现 BGP 路由反射器
  • 三台宿主的各个容器网段能相互通信

实验环境

系统版本bird版本宿主IP容器网段宿主简称
ubuntu16.04BIRD 1.5.010.226.11.27192.168.227.0/24宿主A
ubuntu16.04BIRD 1.5.010.226.11.22192.168.222.0/24宿主B
ubuntu16.04BIRD 1.5.010.226.11.21192.168.221.0/24宿主C

实验拓扑

三台宿主在同一网段内,每个宿主各自下挂一个容器网段。下面实现10.226.11.27作为RR,10.226.11.21与10.226.11.21作为RR client,从而完成三台宿主上的bird相互学习路由,最终目的是实现各个容器网段能相互通信。 特别说明:10.226.11.21 与 10.226.11.22 之间不需要建立BGP peer关系。
在这里插入图片描述

创建模拟的容器网段

我们知道容器是通过linux 的 namespace 机制实现的一个隔离空间, 这里我们同样借助 namespace 机制 实现一个隔离空间,并为隔离出的命名空间配置网络,模拟一个宿主"挂了"一个容器网段。

  • 宿主10.226.11.22上创建模拟容器网段
# 创建命名空间 netns1
ip netns add netns1
# 创建 veth peer
ip link add veth1 type veth peer name veth2
# 将 veth1 放入 netns1
ip link set veth1 netns netns1
# 查看 veth
ip link show | grep veth
# 为 netns1 中的
ip netns exec netns1 ifconfig veth1 192.168.222.102/24 up
# 为 netns1 指定默认网关,网关是宿主1的网络协议栈
ip netns exec netns1 route add -net 0.0.0.0/0 gw 192.168.222.101
# 为宿主中的 veth2 配置IP地址,这样就实现了宿主与netns1 通过 veth2 与 veth1 的互联
ifconfig veth2 192.168.222.101/24 up
  • 宿主10.226.11.21上创建模拟容器网段
ip netns add netns1
ip link add veth1 type veth peer name veth2
ip link set veth1 netns netns1
ip link show | grep veth
ip netns exec netns1 ifconfig veth1 192.168.221.102/24 up
ip netns exec netns1 route add -net 0.0.0.0/0 gw 192.168.221.101
ifconfig veth2 192.168.221.101/24 up
  • 宿主10.226.11.27上创建模拟容器网段
ip netns add netns1
ip link add veth1 type veth peer name veth2
ip link set veth1 netns netns1
ip link show | grep veth
ip netns exec netns1 ifconfig veth1 192.168.227.102/24 up
ip netns exec netns1 route add -net 0.0.0.0/0 gw 192.168.227.101
ifconfig veth2 192.168.227.101/24 up

bird的安装

  • bird程序的安装
apt-get update
apt-get install bird
/etc/init.d/bird start

  • 检查是否安装成功
/etc/init.d/bird status
birdc show status

输出如下显示表示安装正常

root@10_226_11_21:/etc/bird# birdc show status
BIRD 1.5.0 ready.
BIRD 1.5.0
Router ID is 10.226.11.21
Current server time is 2024-09-23 15:03:28
Last reboot on 2024-09-22 20:22:36
Last reconfiguration on 2024-09-23 13:01:00
Daemon is up and running

BGP RR模式的实现

宿主A作为RR角色

RR 需要与所有client 建立BGP peer关系,它的/etc/bird/bird.conf配置如下

# This is a minimal configuration file, which allows the bird daemon to start
# but will not cause anything else to happen.
#
# Please refer to the documentation in the bird-doc package or BIRD User's
# Guide on http://bird.network.cz/ for more information on configuring BIRD and
# adding routing protocols.

#log syslog all;
log "/var/log/bird.log" all;
# Change this into your BIRD router ID. It's a world-wide unique identification
# of your router, usually one of router's IPv4 addresses.
router id 10.226.11.27;

# The Kernel protocol is not a real routing protocol. Instead of communicating
# with other routers in the network, it performs synchronization of BIRD's
# routing tables with the OS kernel.
protocol kernel {
	debug { states };
	scan time 10;
	learn;
	persist;
	import none;  # kernel to bird map
	export all;   # Actually insert routes into the kernel routing table
}

# The Device protocol is not a real routing protocol. It doesn't generate any
# routes and it only serves as a module for getting information about network
# interfaces from the kernel.
protocol direct {
	interface "veth2";
}
protocol device {
}

# 与10.226.11.21建立bgp peer的配置
protocol bgp peer_10_226_11_21 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.21 as 64512;
	source address 10.226.11.27;
	#multihop;
	password "passwd";
	direct;
	export all; # 控制哪些路由可以发布给bgp peer
	import all; # 从 direct, device, static, kernel 等所有protocol的路由都导入bird 的 bgp 路由
	## 让 10.226.11.21 作为 rr client
	rr client;
	# cluster id 标识属于哪个集群
	rr cluster id 224.0.0.1;
}

# 与10.226.11.22建立bgp peer的配置
protocol bgp peer_10_226_11_22 {
	debug { states };
	# 配置 BGP 的 graceful restart
    	# 如果对端因为网络抖动或暂时崩溃而暂时下线,会导致所有传入路由瞬间消失
    	# 为了避免这种情况下数据转发中断,才有 graceful restart
    	# 建议打开
	graceful restart on;
	# 指定自己的 ASN 为 65550
	local as 64512;
	# 指定对端的 ASN 为 64512,IP 为 10.226.11.22
    	# 如果 ASN 和 local as 相同,那么 BIRD 会自动认为这是一个 iBGP,否则是 eBGP
    	# i 表示 internal(内部),e 表示 external(外部)
	neighbor 10.226.11.22 as 64512;
	# source: 定义本地地址作为BGP会话的源地址。Default:邻居所连接接口的本端地址。
	source address 10.226.11.27;
	#multihop;
	# password: 如果和对端约定了密码,在这里配置约定好的密码,否则不用写
	password "passwd";
	# direct: eBGP 默认启用可以不写
        # direct: iBGP 如果是直接连接的可以写这个来避免 multihop 被指定
	# 指定邻居为直连。邻居的IP地址必须在直接可达的IP范围内(即与路由器的接口有关联),
	# 否则BGP会话不会启动,而是等待这样的接口出现。另一种选择是多跳选项。默认值:使能eBGP。
	direct;
	#export: 控制哪些路由可以发布给bgp peer
	export all;
	import all;
	## 让 10.226.11.22 作为 rr client
	rr client;
	rr cluster id 224.0.0.1;
}

配置文件中重要的就如下2行代码,其余代码与上一文中几乎相同:

这2行代码说明了:本节点作为RR,并且指定了哪些bgp节点作为rr client,同时设置集群标识。

	rr client;
	rr cluster id 224.0.0.1;
宿主B作为RR client角色

/etc/bird.bird.conf的配置文件如下:

# This is a minimal configuration file, which allows the bird daemon to start
# but will not cause anything else to happen.
#
# Please refer to the documentation in the bird-doc package or BIRD User's
# Guide on http://bird.network.cz/ for more information on configuring BIRD and
# adding routing protocols.

#log syslog all;
log "/var/log/bird.log" all;
# Change this into your BIRD router ID. It's a world-wide unique identification
# of your router, usually one of router's IPv4 addresses.
router id 10.226.11.22;

# The Kernel protocol is not a real routing protocol. Instead of communicating
# with other routers in the network, it performs synchronization of BIRD's
# routing tables with the OS kernel.
protocol kernel {
	debug { states };
	scan time 10;
	learn;
	persist;
	import none;  # kernel to bird map
	export all;   # Actually insert routes into the kernel routing table
}

# The Device protocol is not a real routing protocol. It doesn't generate any
# routes and it only serves as a module for getting information about network
# interfaces from the kernel.
protocol direct {
	interface "veth2";
}
protocol device {
}

# 与 RR 建立 bgp peer 关系
protocol bgp peer_10_226_11_27 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.27 as 64512;
	source address 10.226.11.22;
	direct;
	password "passwd";
	export all;
	import all;
}

10.226.11.22 作为 rr client ,只需要与 RR 建立 bgp peer关系;从配置文件可以看出,自己不知道peer_10_226_11_27是一个RR,也就是说RR不需要让其cilent 知道自己是一个RR。

宿主C作为RR client角色

/etc/bird.bird.conf的配置文件如下:

# This is a minimal configuration file, which allows the bird daemon to start
# but will not cause anything else to happen.
#
# Please refer to the documentation in the bird-doc package or BIRD User's
# Guide on http://bird.network.cz/ for more information on configuring BIRD and
# adding routing protocols.
log "/var/log/bird.log" all;
# Change this into your BIRD router ID. It's a world-wide unique identification
# of your router, usually one of router's IPv4 addresses.
router id 10.226.11.21;

# The Kernel protocol is not a real routing protocol. Instead of communicating
# with other routers in the network, it performs synchronization of BIRD's
# routing tables with the OS kernel.
protocol kernel {
	learn;
	persist;
	scan time 10;
	import none;
	export all;   # Actually insert routes into the kernel routing table
}

# The Device protocol is not a real routing protocol. It doesn't generate any
# routes and it only serves as a module for getting information about network
# interfaces from the kernel.
protocol device {
}

protocol direct {
	interface "veth2";
}

# 与 RR 建立 bgp peer 关系
protocol bgp peer_10_226_11_27 {
	debug { states };
	local as 64512;
	neighbor 10.226.11.27 as 64512;
  source address 10.226.11.21;
	direct;
	password "passwd";
	export all;
	import all;
}

10.226.11.21 作为 rr client ,只需要与 RR 建立 bgp peer关系;从配置文件可以看出,自己不知道peer_10_226_11_27是一个RR,也就是说RR不需要让其cilent 知道自己是一个RR。

查看状态

登录宿主A 10.226.11.27查看其相关网络的状态

  • 查看 bgp peer 邻居状态

Established表示与bgp peer邻接关系已经建立,而且已经相互完成了路由学习

root@10_226_11_27:/work/code# birdc  show  protocol
BIRD 1.5.0 ready.
name     proto    table    state  since       info
kernel1  Kernel   master   up     16:06:17
direct1  Direct   master   up     16:06:17
device1  Device   master   up     16:06:17
peer_10_226_11_21 BGP      master   up     16:06:21    Established
peer_10_226_11_22 BGP      master   up     16:06:22    Established
  • bird 路由表
root@10_226_11_27:/work/code# birdc show route
BIRD 1.5.0 ready.
# 从 protocol direct 导入的路由
192.168.227.0/24   dev veth2 [direct1 16:06:17] * (240)
# 从 bgp peer_10_226_11_21 学习的路由 
192.168.221.0/24   via 10.226.11.21 on eth0 [peer_10_226_11_21 16:06:21] * (100) [i]
# 从 bgp peer_10_226_11_22 学习的路由 
192.168.222.0/24   via 10.226.11.22 on eth0 [peer_10_226_11_22 16:18:14] * (100) [i]

从可以看到RR 上学习到了2个宿主的2个容器网段。

  • bird路由表的详细信息
root@10_226_11_27:/work/code# birdc show route all
BIRD 1.5.0 ready.
192.168.227.0/24   dev veth2 [direct1 16:06:17] * (240)
	Type: device unicast univ
192.168.221.0/24   via 10.226.11.21 on eth0 [peer_10_226_11_21 16:06:21] * (100) [i]
	Type: BGP unicast univ
	BGP.origin: IGP
	BGP.as_path:
	BGP.next_hop: 10.226.11.21
	BGP.local_pref: 100
192.168.222.0/24   via 10.226.11.22 on eth0 [peer_10_226_11_22 16:18:14] * (100) [i]
	Type: BGP unicast univ
	BGP.origin: IGP
	BGP.as_path:
	BGP.next_hop: 10.226.11.22
	BGP.local_pref: 100
  • kernel 路由表
root@10_226_11_27:/work/code# ip route show
default via 10.226.8.1 dev eth0
# 宿主 eth0接口 的直连路由
10.226.8.0/22 dev eth0  proto kernel  scope link  src 10.226.11.27
# 从bird 学习来的路由
192.168.221.0/24 via 10.226.11.21 dev eth0  proto bird
192.168.222.0/24 via 10.226.11.22 dev eth0  proto bird
# 宿主 veth2接口 直接的路由(模拟的容器网段)
192.168.227.0/24 dev veth2  proto kernel  scope link  src 192.168.227.101
  • 查看宿主10.226.11.22的bird路由表

在这里插入图片描述

从可以看到本宿主上学习到了其余2个宿主的2个容器网段:192.168.221.0/24和192.168.227.0/24

  • 查看宿主10.226.11.22的bird路由表

从可以看到本宿主上学习到了其余2个宿主的2个容器网段:192.168.222.0/24和192.168.227.0/24

网络测试验证

  • 从容器192.168.227.102 ping 容器192.168.221.102
    在这里插入图片描述

  • 容器192.168.221.102 ping 192.168.222.102
    在这里插入图片描述

可见三个容器网络可以互通,达到了实验目的。

实验结论

  • 实现了三台宿主的bird的BGP RR 模式
  • 三台宿主通过bgp相互完成了路由学习
  • 通过实验我们对calico中的bird程序有了更深入的认知

三、参考文档

bird官网

BIRD BGP route-reflector

https://wiki.skywolf.cloud/quickstart/player.html

https://gitlab.nic.cz/labs/bird/-/wikis/BGP_example_1

https://lyyao09.github.io/2020/06/30/linux/Intro-to-BGP-with-BIRD/

https://soha.moe/post/bird-bgp-kickstart.html

四、补充

生产环境中路由反射器的最佳实践

在这里插入图片描述

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

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

相关文章

awvs漏洞扫描工具使用教程

一、工具简介 AWVS(Acunetix Web Vulnerability Scanner)是一款常用的Web应用程序漏洞扫描工具,业界排名Top3,它可以自动扫描Web应用程序并发现其中可能存在的漏洞,包括SQL注入、跨站脚本、文件包含等安全漏洞。AWVS具…

Java语言程序设计基础篇_编程练习题**18.39(拖动树)

目录 题目:**18.39(拖动树) 代码示例 代码逻辑解析 类定义和变量初始化 main 方法 start 方法 drawRecursiveTree 方法 动画演示 题目:**18.39(拖动树) 修改编程练习题18.38, 将树移动到鼠标所拖动到的位置 Java语言程序设计基础篇_编程练习题…

elementUi / elementPlus自定义上传方法 Upload自定义文件上传

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

二进制文件与文本文件的区别【字符集Charset】

计算机上存储的文件在比特位上都是以二进制数字0或1表示,因此在物理层面上,文本文件和二进制文件没有本质差异,都是由数字0或1组成的比特位集合。 文本文件和二进制文件,两者的差异体现在编码逻辑,需要根据文件头中标…

SpringSecurity-用户认证

1、用户认证 1.1 用户认证核心组件 我们系统中会有许多用户,确认当前是哪个用户正在使用我们系统就是登录认证的最终目的。这里我们就提取出了一个核心概念:当前登录用户/当前认证用户。整个系统安全都是围绕当前登录用户展开的,这个不难理…

百度在线翻译神器?这3款工具让你秒变语言达人!

在数字化的今天,我们早已离不开在线翻译工具了!从日常的简单翻译到专业级的文献翻译,这些翻译工具就像是我们的“翻译官”,为我们的生活带来了便利;在这里,我给大家分享一下我的百度在线翻译使用感受&#…

Elasticsearch 分片迁移与移除集群节点操作

Elasticsearch 分片迁移与移除集群节点操作 问题背景 在单台服务器上部署了 7 个 Elasticsearch 节点,分别为 es-node1 到 es-node7,端口从 9201 到 9207。每个节点都承载大量数据,但没有设置副本分片。由于多个节点共享同一台服务器的硬件…

自动化测试常用函数:弹窗、等待、导航、上传与参数设置

目录 一、弹窗 1. 警告弹窗确认弹窗 2. 提示弹窗 二、等待 1. 强制等待 2. 隐式等待 3. 显示等待 三、浏览器导航 1. 打开网站 2. 浏览器的前进、后退、刷新 四、文件上传 五、浏览器参数设置 1. 设置无头模式 2. 页面加载策略 一、弹窗 弹窗是在页面是找不到任何…

震撼!最强开源模型通义千问2.5 72B竟在4GB老显卡上成功运行!

炸裂!最强开源模型一夜之间易主。阿里发布千问2.5模型,72B版本在MMLU、MATH、MBPP等大部分评测指标上都超过了Llama3 405B,甚至一些指标也超过了GPT4o。正式加冕最强开源模型新王! 今天要挑战用我的4GB老显卡不做量化、不做压缩&…

光伏仿真:排布设计如何优化用户体验?

1、屋顶绘制精准 光伏系统的性能直接受到屋顶结构的影响,因此,屋顶绘制的精准性是光伏仿真设计的首要任务。现代光伏仿真软件通过直观的界面和强大的图形编辑功能,使得用户能够轻松导入或绘制出待安装光伏系统的屋顶形状。无论是平面屋顶、斜…

LLM - 使用 XTuner 指令微调 多模态大语言模型(InternVL2) 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142528967 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 XTuner…

国庆节到了,扣子智能体coze画板功能实现贺卡编辑智能体自动添加logo和二维码,让海报品牌化

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300+款以上的AI应用工具。关注科技及大模型领域对社会的影响10年+。关注我一起驾驭AI工具,拥抱AI时代的到来。 自媒体时代,不管是一个人、一个团队还是一家公司,都是一个IP。那么添加品牌的标志…

JavaWeb校园二手交易平台

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展,越来越多的应用层出不穷,伴随着数据应用的需求变多,为快速响应业务需求,很多企业在初期没有很好的规划的情况下,存在不同程度的烟囱式的开发模式,这样会导致企业不同业务线的数据…

Java Map类

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Java 目录 👉🏻map1. 常见的实现2. 主要方法2.1. put(K key, V value)2.2. get(Object key)2.3. remove(Object key)2.4. containsKe…

西部移动硬盘怎么恢复数据?4种详细且实用的方法

面对西部移动硬盘数据丢失的问题,用户往往感到焦虑和无助。本文将为您提供一系列详细且实用的数据恢复方法,帮助您轻松应对数据丢失的挑战,重拾宝贵信息。 图片来源于网络,如有侵权请告知 一、西部移动硬盘数据丢失原因 西部移动…

生成式AI在电商场景的应用、前景与挑战,零基础入门到精通,收藏这一篇就够了

编者按 百舸争流的AI时代,“AI”行动在千行百业迅速开展。电商是一个重要场景,**据阿里调研,在电商平台,约30%受访商家已经使用生成式AI,成为生成式AI技术普惠的最佳试验场之一。**目前,已使用生成式AI的商…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署经典扫雷小游戏

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署经典扫雷小游戏 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、本次实践介绍2.1 本次实践简介2.2 扫雷小游戏简介2.3…

KPaaS平台用户权限管理系统方案之表单设计统一单据制作与授权

不同的业务系统各自独立运行,需要分别进行授权操作,这不仅繁琐耗时,还容易出现错误和不一致的情况,导致企业在多系统用户权限角色管理中常常陷入困境,那么,有没有一种高效、便捷的解决方案呢? …

关于预处理详解,#define,宏的使用以及命名 函数与宏的区别详细对比

预定义符号 C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff…