Envoy 服务发现原理大揭秘与核心要点概述

1 Envoy动态配置介绍

动态资源,是指由envoy通过xDS协议发现所需要的各项配置的机制,相关的配置信息保存 于称之为管理服务器(Management Server )的主机上,经由xDS API向外暴露;下面是一个 纯动态资源的基础配置框架。

{
"lds_config": "{...}",
"cds_config": "{...}",
"ads_config": "{...}"
}

xDS API为Envoy提供了资源的动态配置机制,它也被称为Data Plane API。
Envoy支持三种类型的配置信息的动态发现机制,相关的发现服务及其相应的API联合起来 称为xDS API。

  1. 基于文件系统发现:指定要监视的文件系统路径
  2. 通过查询一到多个管理服务器(Management Server)发现:通过DiscoveryRequest协议报文发送请求,并要求服务方以DiscoveryResponse协议报文进行响应
    (1) gRPC服务:启动gRPC流
    (2) REST服务:轮询REST-JSON URL

v3 xDS支持如下几种资源类型:

envoy.config.listener.v3.Listener
envoy.config.route.v3.RouteConfiguration
envoy.config.route.v3.ScopedRouteConfiguration
envoy.config.route.v3.VirtualHost
envoy.config.cluster.v3.Cluster
envoy.config.endpoint.v3.ClusterLoadAssignment
envoy.extensions.transport_sockets.tls.v3.Secret
envoy.service.runtime.v3. Runtime

2 DS API介绍

Envoy对xDS API的管理由后端服务器实现,包括LDS、CDS、RDS、SRDS(Scoped Route)、VHDS (Virtual Host)、EDS、SDS、RTDS(Runtime )等。

  1. 所有这些API都提供了最终的一致性,并且彼此间不存在相互影响;
  2. 部分更高级别的操作(例如执行服务的A/B部署)需要进行排序以防止流量被丢弃,因此,基于一个管理服务器提供多类API时还需要使用聚合发现服务(ADS )API。
    ADS API允许所有其他API通过来自单个管理服务器的单个gRPC双向流进行编组,从而允许对操作进行确定性排序
    在这里插入图片描述
    xDS的各API还支持增量传输机制,包括ADS

3 Bootstrap node

一个Management Server 实例可能需要同时响应多个不同的Envoy实例的资源发现请求。

  1. Management Server上的配置需要为适配到不同的Envoy实例
  2. Envoy 实例请求发现配置时,需要在请求报文中上报自身的信息
    • 例如id、cluster、metadata和locality等
    • 这些配置信息定义在Bootstrap配置文件中
      专用的顶级配置段“node{…}”中配置
node:
  id: … # An opaque node identifier for the Envoy node. 
  cluster: … # Defines the local service cluster name where Envoy is running.
  metadata: {…} # Opaque metadata extending the node identifier. Envoy will pass this directly to the management server .
  locality: # Locality specifying where the Envoy instance is running.
    region: …
    zone: …
    sub_zone: …
  user_agent_name: … # Free-form string that identifies the entity requesting config. E.g . “envoy ” or “grpc”
requesting config. E.g . “1.12.2” or “abcd1234” , or “SpecialEnvoyBuild ” 
  user_agent_build_version: # Structured version of the entity requesting config.
    version: …
    metadata: {…}
  extensions: [ ] # List of extensions and their versions supported by the node.
  client_features: [ ]
  listening_addresses: [ ] # Known listening ports on the node as a generic hint to the management server for filtering listeners to be returned

在这里插入图片描述

4 API的流程

1、对于典型的HTTP路由方案,xDS API的Management Server 需要为其客户端(Envoy实例)配 置的核心资源类型为Listener、RouteConfiguration、Cluster和ClusterLoadAssignment四个。每个Listener资源可以指向一个RouteConfiguration资源,该资源可以指向一个或多个Cluster资源,并且每个Cluster资源可以指向一个ClusterLoadAssignment资源。

2、Envoy实例在启动时请求加载所有Listener和Cluster资源,而后,再获取由这些Listener和 Cluster所依赖的RouteConfiguration和ClusterLoadAssignment配置;此种场景中,Listener资源和Cluster资源分别代表着客户端配置树上的“根(root)”配置,因而 可并行加载。

3、类型gRPC一类的非代理式客户端可以仅在启动时请求加载其感兴趣的Listener资源, 而后再加载这些特定Listener相关的RouteConfiguration资源;再然后,是这些 RouteConfiguration资源指向的Cluster资源,以及由这些Cluster资源依赖的 ClusterLoadAssignment资源;该种场景中,Listener资源是客户端整个配置树的“根”。

5 Envoy的配置方式

Envoy的架构支持非常灵活的配置方式:简单部署场景可以使用纯静态配置,而更复 杂的部署场景则可以逐步添加需要的动态配置机制

1、纯静态配置:用户自行提供侦听器、过滤器链、集 群及HTTP路由(http代理场景),上 游端点的 发 现仅可通过DNS服务进行,且配置的重新加载必须通过内置的热 重启( hot restart)完成;

2、仅使用EDS:EDS提供的端点发现功能可有效规避DNS的限制( 响应中的 最大记录 数等);

3、使用EDS和CDS:CDS能够让Envoy以优雅的方式添加、更新和删除 上游集群 ,于是, 初始配置 时, Envoy无须事先了解所有上游集群;

4、EDS、CDS和RDS:动态发现路由配置;RDS与EDS、CDS一起使用时 ,为用户 提供了构 建复杂路 由 拓扑的能力(流量转移、蓝/绿部署等);

5、EDS、CDS、RDS和LDS:动态发现侦听器配置,包括内嵌的过滤 器链;启 用此四种 发现服务 后,除 了较罕见的配置变动、证书轮替或更新Envoy程序之外,几 乎无须再 热重启Envoy;

6、EDS、CDS、RDS、LDS和SDS:动态发现侦听器密钥相关的证书、 私钥及TLS会 话票据, 以及对证 书 验证逻辑的配置(受信任的根证书和撤销机制等 );

6 Envoy资源的配置源(ConfigSource)

1、配置源(ConfigSource)用于指定资源配置数据的来源,用于为Listener、Cluster、Route、 Endpoint、Secret和VirtualHost等资源提供配置数据。
2、目前,Envoy支持的资源配置源只能是path、api_config_source或ads其中之一。
3、api_config_source或ads的数据来自于xDS API Server,即Management Server。
在这里插入图片描述

7 基于文件系统的订阅

为Envoy提供动态配置的最简单方法是将其放置在ConfigSource中显式指定的文件路径中

  1. Envoy将使用inotify(Mac OS X上的kqueue)来监视文件的更改,并在更新时解析文件中的DiscoveryResponse 报文
  2. 二进制protobufs,JSON,YAML和proto文本都是DiscoveryResponse 所支持的数据格式

提示

  1. 除了统计计数器和日志以外,没有任何机制可用于文件系统订阅ACK/NACK更新
  2. 若配置更新被拒绝,xDS API的最后一个有效配置将继续适用
  • 1、基于eds实现Envoy基本全动态的配置方式
    以EDS为例,Cluster为静态定义,其各Endpoint通过EDS动态发现
    集群定义格式
# Cluster中的endpoint配置格式
clusters:
- name:
  ...
  eds_cluster_config:
    service_name:
    eds_config:
      path: ... # ConfigSource,支持使用path, api_config_source或ads三者之一;

cluster的配置

# 类似如下纯静态格式的Cluster定义
clusters:
- name: webcluster
  connect_timeout: 0.25s
  type: STATIC #类型为静态
  lb_policy: ROUND_ROBIN
  load_assignment:
    cluster_name: webcluster
    endpoints:
    - lb_endpoints:
      - endpoint:
        address:
          socket_address:
            address: xx.xx.xx.xx
            port_value: 8080

#使用了EDS的配置
clusters:
- name: targetCluster
  connect_timeout: 0.25s
  lb_policy: ROUND_ROBIN
  type: EDS #类型为EDS
  eds_cluster_config:
    service_name: webcluster
    eds_config:
      path: '/etc/envoy/eds.yaml' # 指定订阅的文件路径
#提示:文件后缀名为conf,则资源要以json格式定义;文件后缀名为yaml,则资源需要以yaml格式定义;另外,动态配置中,各Envoy实例需要有惟的id标识;

7.1 EDS的配置

  1. 文件/etc/envoy/eds.yaml中以Discovery Response报文的格式给出响应实例,例如,下面的 配置示例用于存在地址xx.xx.xx.xx某上游服务器可提供服务时
  2. 响应报文需要以JSON格式给出
resources:
  - "@type": type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment
    cluster_name: webcluster
    endpoints:
    - lb_endpoints:
      - endpoint:
        address:
          socket_address:
            address: xx.xx.xx.xx
            port_value: 8080

随后,修改该文件,将xx.xx.xx.xx也添加进后端端点列表中,模拟配置变动
- endpoint:
        address:
          socket_address:
            address: xx.xx.xx.xx
            port_value: 8080

7.2 基于lds和cds实现Envoy基本全动态的配置方式

  1. 各Listener的定义以Discovery Response 的标准格式保存于一个文件中。
  2. 各Cluster的定义同样以Discovery Response的标准格式保存于另一文件中。
    如下面Envoy Bootstrap配置文件示例中的文件引用
node:
  id: envoy_front_proxy 
  cluster: MageEdu_Cluster

admin:
  profile_path: /tmp/envoy.prof 
  access_log_path: /tmp/admin_access.log
  address: 
    socket_address: 
      address: 0.0.0.0
      port_value: 9901

dynamic_resources:
  lds_config:
    path: /etc/envoy/conf.d/lds.yaml 
  cds_config: 
    path: /etc/envoy/conf.d/cds.yaml 

lds的Discovery Response格式的配置示例如下

resources:
- "@type": type.googleapis.com/envoy.config.listener.v3.Listener
  name: listener_http
  address: 
    socket_address: { address: 0.0.0.0, port_value: 80 }
  filter_chains:
  - filters:
    name: envoy.http_connection_manager
    typed_config: 
      "@type":type.googleapis.com/envoy.extensions.filters.network.http_connection_manag
er.v3.HttpConnectionManager
      stat_prefix: ingress_http
      route_config:
        name: local_route 
        virtual_hosts:
        - name: local_service
          domains: ["*"]
          routes:
          - match:
              prefix: "/"
            route:
              cluster: webcluster
      http_filters:
      - name: envoy.filters.http.router

cds的Discovery Response格式的配置示例如下

resources:
- "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
  name: webcluster
  connect_timeout: 1s
type: STRICT_DNS
  load_assignment:
  cluster_name: webcluster
    endpoints:
    - lb_endpoints:
      - endpoint:
          address: 
            socket_address: 
              address: webserver01
              port_value: 8080
      - endpoint:
          address: 
            socket_address: 
              address: webserver02
              port_value: 8080

在这里插入图片描述

8 基于gRPC的动态配置

8.1 gRPC的介绍

Enovy支持为每个xDS API独立指定gRPC ApiConfigSource,它指向与管理服务器对应的某 上游集群。
这将为每个xDS资源类型启动一个独立的双向gRPC流,可能会发送给不同的管理服务器
每个流都有自己独立维护的 资源版本,且不存在跨资源类型的共享版本机制;
在不使用ADS的情况下,每个资源类型可能具有不同的版本,因为Envoy API允许指向不同的 EDS/RDS资源配置并对应不同的ConfigSources

8.2 API的交付方式采用最终一致性机制

基于gRPC的动态配置格式
以LDS为例,它配置Listener以动态方式发现和加载,而内部的路由可由发现的Listener直接 提供,也可配置再经由RDS发现。
下面为LDS配置格式,CDS等的配置格式类同:

dynamic_resouces:
  lds_config:
  api_config_source:
    api_type: ... # API 可经由REST或gRPC获取,支持的类型包括REST、gRPC和delta_gRPC
    resource_api_version: ... # xDS 资源的API版本,对于1.19及之后的Envoy版本,要使用v3;
    rate_limit_settings: {...} # 速率限制
    grpc_services: # 提供grpc服务的一到多个服务源
      transport_api_version : ... # xDS 传输协议使用的API版本,对于1.19及之后的Envoy版本,要使用v3;
      envoy_grpc: # Envoy内建的grpc客户端,envoy_grpc和google_grpc二者仅能用其一;
        cluster_name: ... # grpc集群的名称;
      google_grpc: # Google的C++ grpc客户端
      timeout: ... # grpc超时时长;

注意:
提供gRPC API服务的Management Server (控制平面)也需要定义为Envoy上的集群, 并由envoy实例通过xDS API进行请求;
(1) 通常,这些管理服务器需要以静态资源的格式提供;
(2) 类似于,DHCP协议的Server 端的地址必须静态配置,而不能经由DHCP协议获取;

8.3 基于GRPC管理服务器订阅

基于gRPC的订阅功能需要向专用的Management Server请求配置信息。
下面的示例配置使用了lds和cds 分别动态获取Listener和Cluster相关的配置。

node:
  id: envoy_front_proxy 
  cluster: webcluster
  
admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

dynamic_resources: 
  lds_config:  #定义动态获取listener
    resource_api_version: V3
    api_config_source:
      api_type: GRPC  #使用GRPC模式
      transport_api_version: V3
      grpc_services:
      - envoy_grpc:
        cluster_name: xds_cluster #调用grpc服务器
        
  cds_config: #定义动态获取cluster
    resource_api_version: V3
    api_config_source:
      api_type: GRPC  #使用GRPC模式
      transport_api_version: V3
      grpc_services:
      - envoy_grpc:
        cluster_name: xds_cluster #调用grpc服务器

#xds_cluster需要静态配置
static_resources:
  clusters:
    - name: xds_cluster
      connect_timeout: 0.25s
      type: STRICT_DNS
      # Used to provide extension-specific protocol options for upstream connections. 
      typed_extension_protocol_options: 
        envoy.extensions.upstreams.http.v3.HttpProtocolOptions: 
          "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions 
           explicit_http_config:
           http2_protocol_options: {}
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: xds_cluster
        endpoints:
        - lb_endpoints:
          - endpoint:
              address:
                socket_address:
                  address: xdsserver-IP
                  port_value: 18000

8.4 ADS

通过上面的交互顺序保证MS资源分发时的流量丢弃是一项很有挑战的工作,而ADS允许单 一MS通过单个gRPC流提供所有的API更新。
在这里插入图片描述

  1. 配合仔细规划的更新顺序,ADS可规避更新过程中流量丢失
  2. 使用 ADS,在单个流上可通过类型 URL 来进行复用多个独立的 DiscoveryRequest/DiscoveryResponse 序列
    使用了ads分别动态获取Listener和Cluster相关的配置
node:
  id: envoy_front_proxy 
  cluster: webcluster
  
admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

dynamic_resources:
  ads_config:
    api_type: GRPC
    transport_api_version: V3
    grpc_services:
    - envoy_grpc:
      cluster_name: xds_cluster
      set_node_on_first_message_only: true

  cds_config:
    resource_api_version: V3
    ads: {}
    lds_config:
      resource_api_version: V3
      ads: {}
 


 #xds_cluster需要静态配置
static_resources:
  clusters:
    - name: xds_cluster
      connect_timeout: 0.25s
      type: STRICT_DNS
      # Used to provide extension-specific protocol options for upstream connections. 
      typed_extension_protocol_options: 
        envoy.extensions.upstreams.http.v3.HttpProtocolOptions: 
          "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions 
           explicit_http_config:
           http2_protocol_options: {}
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: xds_cluster
        endpoints:
        - lb_endpoints:
          - endpoint:
              address:
                socket_address:
                  address: xdsserver-IP
                  port_value: 18000

9 REST-JSON轮询订阅

9.1 REST-JSON介绍

  1. 通过REST端点进行的同步(长)轮询也可用于xDS单例API
  2. 上面的消息顺序是类似的,除了没有维护到管理服务器的持久流
  3. 预计在任何时间点只有一个未完成的请求,因此响应nonce在REST-JSON中是可选的 p proto3的JSON规范转换用于编码DiscoveryRequest和DiscoveryResponse消息。
  4. ADS不适用于REST-JSON轮询
    5)当轮询周期设置为较小的值时,为了进行长轮询,则还需要避免发送DiscoveryResponse ,除 非发生了对底层资源的更改

9.2 以LDS为例,它用于发现并配置Listener

基于REST订阅的LDS配置格式,CDS等其它配置类似

dynamic_resources:
  lds_config:
  resource_api_version: … # xDS 资源配置遵循的API版本,v1.19版本及以后仅支持V3 ;
  api_config_source:
    transport_api_version: ... # xDS 传输协议中使用API版本,v1.19版本及以后仅支持V3;
    api_type: ... # API 可经由REST或gRPC获取,支持的类型包括REST、GRPC和DELTA_GRPC
    cluster_names: ... # 提供服务的集群名称列表,仅能与REST类型的API一起使用;多个集群用于冗余之目的,故障时将循环访问;
    refresh_delay: ... # REST API 轮询时间间隔;
    request_timeout: ... # REST API请求超时时长,默认为1s;

注意:提供REST API服务的管理服务器也需要定义为Envoy上的集群,并由LDS等相关 的动态发现服务进行调用;但这些管理服务器需要以静态配置的格式提供;

9.3 基于REST管理服务器订阅

使用了ads分别动态获取Listener和Cluster相关的配置

node:
  id: envoy_front_proxy
  cluster: webcluster

admin:
  profile_path: /tmp/envoy.prof
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

dynamic_resources:
  cds_config:
    resource_api_version: V3
    api_config_source:
      api_type: REST
      transport_api_version: V3 refresh_delay: {nanos: 500000000} # 1/2s cluster_names:
      - xds_cluster

  lds_config:
    resource_api_version: V3
    api_config_source:
    api_type: REST
      transport_api_version: V3 refresh_delay: {nanos: 500000000} # 1/2s cluster_names:
      - xds_cluster

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PYNQ - 自定义含 DPU 的 overlay 层(MPSoC)

目录 1. 简介 2. 通过脚本构建 2.1 准备工作 2.2 通过 Makefile 构建 2.3 Makefile 源码及解析 2.3.1 源码-中文注释 2.3.2 主要功能分析 2.3.3 vivado batch 模式 2.3.4 package_xo 命令 2.3.5 vitis v 命令 2.4 DPU 参数 2.4.1 Arch 选项卡 2.4.2 Advanced 选项…

GPT-SoVITS语音合成模型部署及使用

1、概述 GPT-SoVITS是一款开源的语音合成模型,结合了深度学习和声学技术,能够实现高质量的语音生成。其独特之处在于支持使用参考音频进行零样本语音合成,即使没有直接的训练数据,模型仍能生成相似风格的语音。用户可以通过微调模…

25.DDD数量关系

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗?领域对象之…

GB28181系列二:TS、PS格式

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、TS、PS简介 二、PES格式 三、TS格式 3.1 固定字段 3.2、调整域(Adaptation field) 3.3、第一个可选域(optional fields) 3.4、第二个可选域(optional fields) 3.5、负载 3.6、PSI 四、PS格式 4.1、PS头…

OpenAI 正式赋予 ChatGPT 通过视频实时与用户互动的能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

QT 国际化(翻译)

QT国际化(Internationalization,简称I18N)是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用,并且可以根据用户的语言和地区提供本地化的使用体验。…

【大语言模型】LangChain 核心模块介绍(Chains、Retrieval、Tools)

【大语言模型】LangChain 核心模块 一、LangChain 核心模块 Chains1、简介2、应用场景3、使用技巧3.1、LCEL Chains3.2、Legacy Chains 4、实践演练 二、LangChain 核心模块 Retrieval1、简介2、应用场景2.1、需求说明2.2、实现思路 三、LangChain 核心组件 Tools1、应用场景2、…

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接:Uniapp Tool - IntelliJ IDEs Plugin | Marketplace (结合自己的webstorm版本下载,不然解析不了) 将下载到的zip文件防在webstorm安装路径下,本文的地址为: 2、安装uniapp插…

实现 RAM 时应该考虑的性能因素

实现 RAM 时应该考虑的性能因素 要高效地推断存储元件,需要考虑下列影响性能的因素: • 使用专用块还是分布式 RAM RAM 可以在专用块 RAM 或使用分布式 RAM 的 LUT 内实现。不同的选择会影响资源选择,同时还会严重地影响性 能和功耗…

【前端开发】HTML+CSS网页,可以拿来当作业(免费开源)

HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content_lizhongyu"widthdevice-width, initial-scale1.0"><title>小兔鲜儿-新鲜、惠民、快捷<…

TongWe7.0-东方通TongWeb控制台无法访问 排查

**问题描述&#xff1a;**无法访问TongWeb的控制台 逐项排查&#xff1a; 1、控制台访问地址是否正确&#xff1a;http://IP:9060/console #IP是服务器的实际IP地址 2、确认TongWeb进程是否存在&#xff0c;执行命令&#xff1a;ps -ef|grep tongweb 3、确认TongWeb服务启动…

【Python入门】传输与运算成分

文章一览 前言一、print函数&#xff08;输出&#xff09;1、字符串和数值类型&#xff0c;可以直接输出2、变量&#xff1a;无论什么类型&#xff0c;数值、字符、列表、字典... 可以直接输出3. 格式化输出3.1 str.format() 方法3.2 f-string 方法 二、input 函数1、函数 eval…

Linux内核结构及源码概述

参考&#xff1a;深入分析LINUX内核源码 深入分析Linux内核源码 (kerneltravel.net) Linux 是一个庞大、高效而复杂的操作系统&#xff0c;虽然它的开发起始于 Linus Torvalds 一个人&#xff0c;但随着时间的推移&#xff0c;越来越多的人加入了 Linux 的开发和对它的不断完善…

linux - 存储管理

1.了解硬件 -- 磁盘 硬盘有机械硬盘(HDD)和固态硬盘(SDD) 接下来&#xff0c;主要以机械磁盘为例(更具代表性&#xff0c;在linux系统层面&#xff0c;无论是机械磁盘还是固态硬盘&#xff0c;文件的读取和写入都iNode(索引节点)管理文件的元数据和实际数据块) 1.盘片&#x…

某名校考研自命题C++程序设计——近10年真题汇总(上)

本帖更新一些某校的编程真题&#xff0c;总体来说不难&#xff0c;考察的都是基本功&#xff0c;92高校大一期末的难度&#xff0c;不过有些细节颇为繁琐&#xff0c;各位还是需要一定程度上注意的~ 目录 一.分数求和 二.大小写字母转换 三.判断当年天序 四.交替合并字符串…

滑动窗口算法专题

滑动窗口简介 滑动窗口就是利用单调性&#xff0c;配合同向双指针来优化暴力枚举的一种算法。 该算法主要有四个步骤 1. 先进进窗口 2. 判断条件&#xff0c;后续根据条件来判断是出窗口还是进窗口 3. 出窗口 4.更新结果&#xff0c;更新结果这个步骤是不确定的&#xff0c…

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…

R语言的数据结构-向量

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 在R语言中&#xff0c;数据结构是非常关键的部分&#xff0c;它提…

SpringBoot使用Nacos进行application.yml配置管理

Nacos是阿里巴巴开源的一个微服务配置管理和服务发现的解决方案。它提供了动态服务发现、配置管理和 服务管理平台。Nacos的核心功能包括服务发现、配置管理和动态服务管理&#xff0c;使得微服务架构下的服务治理 变得简单高效。 Nacos的设计基于服务注册与发现、配置管理、动…

【Java学习笔记】Collections 工具类

一、基本介绍 Collections 是一个操作 Set、List 和 Map 等集合的工具类Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作 二、排序操作&#xff1a;&#xff08;均为 static 方法) 三、查找、替换