前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文搞懂 Kubernetes Limits 和 Requests

一文搞懂 Kubernetes Limits 和 Requests

作者头像
Luga Lee
发布于 2022-03-25 06:22:00
发布于 2022-03-25 06:22:00
2.7K03
代码可运行
举报
文章被收录于专栏:架构驿站架构驿站
运行总次数:3
代码可运行
管理 Kubernetes 集群就像坐镇在大型战场前,指挥千军万马进行火拼。在我们面前有几乎压倒性的旋律和氛围来将斗士气势营造至完美境地,甚至知道从哪里开始似乎都具有挑战性,作为经验丰富的架构师,往往可能很清楚这种感觉。

然而,一个没有资源限制的 Kubernetes 集群可能会导致诸多的不可见问题。因此,设置资源限制便是一个合乎逻辑的起点。

话虽如此,然而,真正的挑战才刚刚开始。要正确设置 Kubernetes 资源限制,我们必须有条不紊并注意找到正确的值。将它们设置得太高,可能会对集群的节点产生负面影响。将该值设置得太低,会对应用程序性能产生负面影响。

因此,有效地设置 Kubernetes 请求和限制对应用程序的性能、稳定性和成本有重大影响。

Resource Requests && Limits 即“资源请求和限制”是在容器级别指定的可选参数。Kubernetes 将 Pod 的请求和限制计算为其所有容器的请求和限制的总和。然后 Kubernetes 使用这些参数进行调度和资源分配决策。

那么,什么是资源限制,它们为什么对我们来说如此重要?

首先,在 Kubernetes 生态体系中,资源限制与资源请求往往以成对形式展现在大众面前:

1、资源请求:分配给容器的 CPU 或内存量。Pod 资源请求等于其容器资源请求的总和。在调度 Pod 时,Kubernetes 将保证此数量的资源可供所支撑的 Pod 运行。

2、资源限制:Kubernetes 将开始对超出限制的容器采取行动的级别。Kubernetes 会杀死一个消耗过多内存的容器或限制一个使用过多 CPU 的容器。

如果设置了资源限制但没有资源请求,Kubernetes 会隐式设置内存和 CPU 请求等于限制。这种行为非常适合作为控制 Kubernetes 集群的第一步。这通常被称为保守方法,其中分配给容器的资源最多。

Resource Limits && Requests 解析

Requests-请求

Pod 将获得它们请求的内存量。如果他们超出了他们的内存请求,如果另一个 Pod 碰巧需要这个内存,他们可能会被杀死。只有当关键系统或高优先级工作负载需要内存时,Pod 才会在使用的内存少于请求的内存时被杀死。

同样,Pod 中的每个容器都分配了它请求的 CPU 量(如果可用)。如果其他正在运行的 Pod/Jobs 不需要可用资源,它可能会被分配额外的 CPU 周期。因此,请求定义了容器需要的最小资源量。

注意:如果 Pod 的总请求在单个节点上不可用,则 Pod 将保持在 Pending 状态(即未运行),直到这些资源可用。

Limits-限制

资源限制有助于 Kubernetes 调度程序更好地处理资源争用。当 Pod 使用的内存超过其限制时,其进程将被内核杀死以保护集群中的其他应用程序。当 Pod 超过其 CPU 限制时,它们将受到 CPU 限制。如果未设置限制,则 Pod 可以在可用时使用多余的内存和 CPU。限制决定了容器可以使用的最大资源量,防止资源短缺或由于资源消耗过多而导致机器崩溃。如果设置为 0,则表示容器没有资源限制。特别是如果你设置了 limits 而不指定 requests,Kubernetes 默认认为 requests 的值和 limits的值是一样的。

Kubernetes 请求和限制适用于两种类型的资源 - 可压缩(例如 CPU)和不可压缩(例如内存)。对于不可压缩资源,适当的限制非常重要。

为了充分利用 Kubernetes 集群中的资源,提高调度效率,Kubernetes 使用请求和限制来控制容器的资源分配。每个容器都可以有自己的请求和限制。这两个参数由 resources.requests 和 resources.limits 指定。一般来说,Requests-请求在调度中更重要,而 Limits-限制在运行中更重要。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[administrator@JavaLangOutOfMemory ~ ]% less demo-service-ap.yaml
apiVersion: extensions/v1beta1
metadata:
 name: redis
 labels:
   name: redis-deployment
   app: demo-service-ap
spec:
 replicas: 3
 selector:
   matchLabels:
    name: redis
    role: cachedb
    app: demo-service-ap
 template:
   spec:
     containers:
       - name: redis
         image: redis:6.2.6-alpine
         resources:
           limits:
             memory: 600Mi
             cpu: 1
           requests:
             memory: 300Mi
             cpu: 500m
       - name: busybox
         image: busybox:1.31.1
         resources:
           limits:
             memory: 200Mi
             cpu: 300m
           requests:
             memory: 100Mi
             cpu: 100m

基于上述 Yaml 文件,在 Kubernetes 中,CPU 不是以百分比分配的,而是以千计(也称为 millicores 或 millicpu)。一个 CPU 等于 1000 毫核。如果希望分配三分之一的 CPU,我们应该为容器分配 333 Mi(毫核)。

相对于 CPU ,内存往往更简单一些,其主要以字节为单位。

Kubernetes 接受 SI 表示法 (K,M,G,T,P,E) 和二进制表示法 (Ki,Mi,Gi,Ti,Pi,Ei) 来定义内存。例如,要将内存限制在 256 MB,我们可以分配 268.4 M(SI 表示法)或 256 Mi(二进制表示法)。

基于上述示例,我们可以看到针对 Resources 的定义涉及四个部分。其实,在实际的业务场景中,这些配置项中的每一个都是可选的。然而,在生产环境中,还是建议大家进行合理设置,以满足应用运行性能要求。

requests.cpu 是命名空间中所有容器的最大组合 CPU 请求(以毫秒为单位)。在上面的例子中,你可以有 50 个 10m 请求的容器,5 个 100m 请求的容器,甚至一个 500m 请求的容器。只要在 Namespace 中请求的 CPU 总量小于 500m!

requests.memory 是命名空间中所有容器的最大组合内存请求。在上面的示例参数中,可以拥有 50 个具有 2MiB 请求的容器、5 个具有 20MiB CPU 请求的容器,甚至是一个具有 100MiB 请求的容器。只要命名空间中请求的总内存小于 100MiB!

limits.cpu 是命名空间中所有容器的最大组合 CPU 限制。它就像 requests.cpu 一样,但有限制。

limits.memory 是命名空间中所有容器的最大组合内存限制。它就像 requests.memory 但有限制。

请求和限制在实际的业务场景至关重要,因为它们在 Kubernetes 如何决定在需要释放资源时杀死哪些 Pod 中发挥着重要作用:

1、没有限制或请求集的 Pod

2、没有设置限制的 Pod

3、超过内存请求但低于限制的 Pod

4、Pod 使用的内存少于请求的内存

常见资源异常

在实际的业务场景中,是否对所有容器设置了请求和限制?如果没有,Kubernetes 调度程序将随机分配任何没有请求和限制的 Pod。设置限制后,将避免以下大多数问题:

1、内存不足 (OOM) 问题:节点可能死于内存不足,影响集群稳定性。例如,具有内存泄漏的应用程序可能会导致 OOM 问题。通常,在 Kubernetes 中看到两种主要的 OOMKilled 错误:OOMKilled:限制过度使用和 OOMKilled:已达到容器限制。

OOMKilled: Limit Overcommit - 限制过度使用

当 Pod 限制的总和大于节点上的可用内存时,可能会发生 OOMKilled: Limit Overcommit 错误。例如,如果我们有一个具有 8 GB 可用内存节点,可能在前期的糟糕规划设计中会分配 8 个 Pod,每个 Pod 都需要 1 gig 内存。但是,即使其中一个 Pod 配置了 1.5 gigs 的限制,我们也会面临内存不足的风险。只需要一个 Pod 出现流量峰值或未知的内存泄漏,Kubernetes 将被迫开始杀死 Pod。

此时,我们需要检查主机本身,看看是否有任何在 Kubernetes 之外运行的进程可能会占用内存,从而为 Pod 留下更少的内存。

OOMKilled: Container Limit Reached - 达到容器限制

虽然 Limit Overcommit 错误与节点上的内存总量有关,但 Container Limit Reached 通常归结为单个 Pod。当 Kubernetes 检测到一个 Pod 使用的内存超过了设置的限制时,它会杀死该 Pod,并显示错误 OOMKilled—Container Limit Reached。

发生这种情况时,请检查应用程序日志以尝试了解 Pod 使用的内存超过设置限制的原因。可能有多种原因,例如流量激增或长时间运行的 Kubernetes 作业导致它使用比平时更多的内存。

如果在调查期间发现应用程序按预期运行并且它只需要更多内存来运行,则可能会考虑增加 request 和 limit 的值。

2、CPU 饥饿:应用程序会变慢,因为它们必须共享有限数量的 CPU。消耗过多 CPU 的应用程序可能会影响同一节点上的所有应用程序。

3、Pod 驱逐:当一个节点缺乏资源时,它会启动驱逐过程并终止 Pod,从没有资源请求的 Pod 开始。

4、资源浪费:假设我们的集群在没有请求和限制的情况下运行状态很好,这意味着很可能过度配置。换句话说,你把钱花在了你从未使用过的资源上。

因此,防止上述问题在业务运行中的发生,第一步,则是为所有容器设置资源限制操作。

源码解析

在上述的解析中,我们已经了解了一些配置请求和限制的最佳实践,让我们更深入地研究源代码。

下面的代码展示了 Requests and Scheduling (请求与调度)中 Pod 的请求和 Pod 中容器的请求之间的关系。具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func computePodResourceRequest(pod *v1.Pod) *preFilterState {
  result := &preFilterState{}
  for _, container := range pod.Spec.Containers {
    result.Add(container.Resources.Requests)
  }

  // take max_resource(sum_pod, any_init_container)
  for _, container := range pod.Spec.InitContainers {
    result.SetMaxResource(container.Resources.Requests)
  }

  // If Overhead is being utilized, add to the total requests for the pod
  if pod.Spec.Overhead != nil && utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) {
    result.Add(pod.Spec.Overhead)
  }

  return result
}
...
func (f *Fit) PreFilter(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod) *framework.Status {
  cycleState.Write(preFilterStateKey, computePodResourceRequest(pod))
  return nil
}
...
func getPreFilterState(cycleState *framework.CycleState) (*preFilterState, error) {
  c, err := cycleState.Read(preFilterStateKey)
  if err != nil {
    // preFilterState doesn't exist, likely PreFilter wasn't invoked.
    return nil, fmt.Errorf("error reading %q from cycleState: %v", preFilterStateKey, err)
  }

  s, ok := c.(*preFilterState)
  if !ok {
    return nil, fmt.Errorf("%+v  convert to NodeResourcesFit.preFilterState error", c)
  }
  return s, nil
}
...
func (f *Fit) Filter(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {
  s, err := getPreFilterState(cycleState)
  if err != nil {
    return framework.NewStatus(framework.Error, err.Error())
  }

  insufficientResources := fitsRequest(s, nodeInfo, f.ignoredResources, f.ignoredResourceGroups)

  if len(insufficientResources) != 0 {
    // We will keep all failure reasons.
    failureReasons := make([]string, 0, len(insufficientResources))
    for _, r := range insufficientResources {
      failureReasons = append(failureReasons, r.Reason)
    }
    return framework.NewStatus(framework.Unschedulable, failureReasons...)
  }
  return nil
}

基于上述代码定义,我们可以看到:调度器(调度线程)计算了待调度的 Pod 所需的资源。具体来说,它根据 Pod 规范分别计算 init 容器的总请求数和工作容器的总请求数。在接下来的 Filter 阶段,会检查所有节点是否满足条件。

备注:对于轻量级虚拟机(例如 kata-container),它们自己的虚拟化资源消耗需要计入缓存中。

通常而言,调度过程需要不同的阶段,包括前置过滤器、过滤器、后置过滤器和评分。有关详细信息,可参阅过“滤器和评分节点”内容。具体可参考如下地址所示:

https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/#kube-scheduler-implementation

过滤后,如果只有一个适用的节点,则将 Pod 调度到该节点上。如果有多个适用的 Pod,调度器会选择加权分数总和最高的节点。评分基于多种因素,因为调度插件实现了一个或多个扩展点。请注意,requests 的值和 limits 的值直接影响插件 NodeResourcesLeastAllocated 的最终结果。 其源代码实现如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func leastResourceScorer(resToWeightMap resourceToWeightMap) func(resourceToValueMap, resourceToValueMap, bool, int, int) int64 {
  return func(requested, allocable resourceToValueMap, includeVolumes bool, requestedVolumes int, allocatableVolumes int) int64 {
    var nodeScore, weightSum int64
    for resource, weight := range resToWeightMap {
      resourceScore := leastRequestedScore(requested[resource], allocable[resource])
      nodeScore += resourceScore * weight
      weightSum += weight
    }
    return nodeScore / weightSum
  }
}
...
func leastRequestedScore(requested, capacity int64) int64 {
  if capacity == 0 {
    return 0
  }
  if requested > capacity {
    return 0
  }

  return ((capacity - requested) * int64(framework.MaxNodeScore)) / capacity
}

对于 NodeResourcesLeastAllocated,如果同一 Pod 拥有更多资源,则节点将获得更高的分数。 换句话说,一个 Pod 将更有可能被调度到资源充足的节点上。

在创建 Pod 时,Kubernetes 需要分配不同的资源,包括 CPU 和内存。每种资源都有一个权重(源代码中的 resToWeightMap 结构)。作为一个整体,它们告诉 Kubernetes 调度程序什么是实现资源平衡的最佳决策。在 Score 阶段,调度器除了

NodeResourcesLeastAllocated 外,还使用其他插件(InterPodAffinity)进行评分。

接下来,我们顺带了解一下 QoS and Scheduling (QoS 与调度),QoS 作为Kubernetes 中的一种资源保护机制,主要用于控制内存等不可压缩资源。 它还会影响不同 Pod 和容器的 OOM 分数。 当节点内存不足时,内核(OOM Killer)会杀死低优先级的 Pod(分数越高,优先级越低)。其源代码实现如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func GetContainerOOMScoreAdjust(pod *v1.Pod, container *v1.Container, memoryCapacity int64) int {
  if types.IsCriticalPod(pod) {
    // Critical pods should be the last to get killed.
    return guaranteedOOMScoreAdj
  }

  switch v1qos.GetPodQOS(pod) {
  case v1.PodQOSGuaranteed:
    // Guaranteed containers should be the last to get killed.
    return guaranteedOOMScoreAdj
  case v1.PodQOSBestEffort:
    return besteffortOOMScoreAdj
  }

  // Burstable containers are a middle tier, between Guaranteed and Best-Effort. Ideally,
  // we want to protect Burstable containers that consume less memory than requested.
  // The formula below is a heuristic. A container requesting for 10% of a system's
  // memory will have an OOM score adjust of 900. If a process in container Y
  // uses over 10% of memory, its OOM score will be 1000. The idea is that containers
  // which use more than their request will have an OOM score of 1000 and will be prime
  // targets for OOM kills.
  // Note that this is a heuristic, it won't work if a container has many small processes.
  memoryRequest := container.Resources.Requests.Memory().Value()
  oomScoreAdjust := 1000 - (1000*memoryRequest)/memoryCapacity
  // A guaranteed pod using 100% of memory can have an OOM score of 10. Ensure
  // that burstable pods have a higher OOM score adjustment.
  if int(oomScoreAdjust) < (1000 + guaranteedOOMScoreAdj) {
    return (1000 + guaranteedOOMScoreAdj)
  }
  // Give burstable pods a higher chance of survival over besteffort pods.
  if int(oomScoreAdjust) == besteffortOOMScoreAdj {
    return int(oomScoreAdjust - 1)
  }
  return int(oomScoreAdjust)
}

资源管控

要仔细分析指标,我们需要一步一步来。 通常,可概括为2个阶段组成,每个阶段都会导致不同的策略。从最激进的开始,挑战结果,并在必要时转向更保守的选择。

通常,我们必须独立考虑 CPU 和内存,并根据每个阶段的结论应用不同的策略。

1、观测内存或 CPU

在第一阶段,查看内存或 CPU 的百分之九十九。这种激进的方法旨在通过强制 Kubernetes 对异常值采取行动来减少问题。如果使用此值设置限制,我们的应用程序将有 1% 的时间受到影响。容器 CPU 将受到限制,并且永远不会再次达到该值。

激进的方法通常有利于 CPU 限制,因为其后果相对可以接受,并且可以帮助我们更好地管理资源。关于记忆,百分之九十九可能有问题;如果达到限制,容器将重新启动。

此时,我们应该权衡后果并得出结论,如果 99 个百分位对有意义(作为旁注,我们应该更深入地调查为什么应用程序有时会达到设定的限制)。可能 99 个百分位数过于严格,因为我们的应用程序尚未达到最大利用率。在这种情况下,请继续使用第二个策略来设置限制。

2、实时优化调整

最后阶段是通过添加或减去一个系数(即,最大值 + 20%)来找到基于最大值的折衷方案。如果达到这一点,我们应该考虑执行负载测试以更好地描述我们的应用程序性能和资源使用情况。无限制地对每个应用程序重复此过程。

以上为 Kubernetes 中资源限制与资源请求相关简要解析,更多内容欢迎大家深入沟通、探讨!

# 参考资料

  • https://medium.com/omio-engineering/cpu-limits-and-aggressive-throttling-in-kubernetes-c5b20bd8a718
  • https://learnk8s.io/setting-cpu-memory-limits-requests
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot如何解决跨域问题?
跨域问题是Web开发中常见的问题之一,特别是在前后端分离的项目中。Spring Boot作为一个流行的Java后端框架,提供了多种方式来解决跨域问题。本文将深入探讨Spring Boot如何解决跨域问题,包括原理分析、代码实现和示例展示。
程序猿川子
2024/11/25
4580
SpringBoot如何解决跨域问题?
CORS跨域问题及解决方案详解
CORS(Cross-Origin Resource Sharing,跨域资源共享)跨域问题源于浏览器的同源策略。同源策略是浏览器的一种安全机制,它要求浏览器在访问一个资源时,该资源的协议、域名和端口必须与当前页面的协议、域名和端口完全一致,否则就会被视为跨域请求,浏览器会对这类请求进行限制。
威哥爱编程
2025/02/25
6020
盘点 Spring Boot 解决跨域请求的几种方式
之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击 web 服务器盗取数据。
潘志的技术笔记
2024/07/02
2910
盘点 Spring Boot 解决跨域请求的几种方式
Spring Boot 中解决跨域的多种方式
在开发Web应用时,经常会遇到跨域问题,这给开发者带来了不少困扰。在本文中,我将探讨Spring Boot中解决跨域问题的几种常见方式,包括使用@CrossOrigin注解、自定义WebMvcConfigurer以及使用Filter进行跨域配置。通过深入了解这些方法,我们能够更好地解决跨域问题,保证应用的稳定性和安全性。
默 语
2024/11/20
1430
Spring Boot 中解决跨域的多种方式
Springboot处理CORS跨域请求的三种方法
浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。换句话说,浏览器安全的基石是同源策略。
陈哈哈
2020/07/03
17.3K0
Java如何解决跨域问题
跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。
Vincent-yuan
2021/10/13
2K0
SpringBoot 中实现跨域的5种方式
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。2021Java面试宝典
程序员白楠楠
2021/02/19
4.2K0
JAVA | Java 解决跨域问题 花式解决跨域问题
我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.
双鬼带单
2020/07/27
12.3K0
JAVA | Java 解决跨域问题 花式解决跨域问题
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
点击关注公众号,Java干货及时送达 一、为什么会出现跨域问题 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port) 二、什么是
Java技术栈
2022/07/26
5.8K0
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
vue跨域解决方案 简书_springboot允许跨域
1.方法一:@CrossOrigin 注意: 1、springMVC的版本要在4.2或以上版本才支持@CrossOrigin 2、非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题。 3、在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是:在@RequestMapping注解中没有指定Get、Post方式,具体指定后,问题解决。其中@CrossOrigin中的2个参数:origins : 允许可访问的域列表 maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。可以配置在Controller上 也可以配置在方法上。
全栈程序员站长
2022/09/29
3210
SpringBoot系列(七) 分分钟学会SpringBoot多种跨域解决方式​
 跨域是指不同域名之间的相互访问,这是由浏览器的同源策略决定的,是浏览器对JavaScript施加的安全措施,防止恶意文件破坏。
全栈学习笔记
2022/03/31
8020
SpringBoot系列(七) 分分钟学会SpringBoot多种跨域解决方式​
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
后端码匠
2021/01/06
3560
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
Java技术江湖
2021/01/06
6680
SpringBoot跨域配置「建议收藏」
简单而言,跨域请求就是当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求。举个简单的例子,从http://www.baidu.com,发送一个 Ajax 请求,请求地址是 http://www.taobao.com下面的一个接口,这就是发起了一个跨域请求,在不做任何处理的情况下,显然当前跨域请求是无法被成功请求,因为浏览器基于同源策略会对跨域请求做一定的限制。
全栈程序员站长
2022/09/13
8910
Springboot解决Ajax跨域的三种方式
这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题。大家可以收藏起来,以备用时之需!
业余草
2020/12/23
9150
Springboot解决Ajax跨域的三种方式
SpringBoot跨域配置
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
小沐沐吖
2022/09/22
1.3K0
SpringBoot跨域配置
Spring Boot或Spring MVC前后端分离的项目跨域问题的解决方案
那么跨域问题就是CORS全称Cross-Origin Resource Sharing,意为跨域资源共享。当一个资源去访问另一个不同域名或者同域名不同端口的资源时,就会发出跨域请求。如果此时另一个资源不允许其进行跨域资源访问,那么访问的那个资源就会遇到跨域问题。
Java技术债务
2022/08/09
5240
Spring Boot:处理跨域问题
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
HLee
2021/07/03
2.1K0
Spring Boot:处理跨域问题
SpringBoot跨域及三种解决方式
我们先了解下【域】的定义:协议 + 域名 + 端口。三者完全相同则为同域,反之有其一不同均为不同域。那么,什么是跨域请求?当前【发起请求】的域和【请求指向】的域属于不同域时,该次请求称之为跨域请求。简单说A应用只能访问A应用后台传来数据,B应用只能访问B应用后台传来的数据,如果A应用用Ajax获取数据时的URL地址中的协议、端口、域名其中有一个和B应用对应的话,则是A应用跨域了想获取B应用数据,是不允许的。在谈跨域之前,我们先来看看浏览器的同源策略。
崩天的勾玉
2021/12/24
24.3K1
SpringBoot跨域及三种解决方式
跨域问题(CORS / Access-Control-Allow-Origin)
最近在项目中,调用Eureka REST接口时,出现了CORS跨越问题(Cross-origin resource sharing),在此与大家进行分享,避免多走些弯路。
xcbeyond
2020/10/27
2.2K2
跨域问题(CORS / Access-Control-Allow-Origin)
推荐阅读
相关推荐
SpringBoot如何解决跨域问题?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验