【Spring Cloud系列】- Ribbon详解与实战

news2024/11/23 20:32:26

【Spring Cloud系列】- Ribbon详解与实战

文章目录

  • 【Spring Cloud系列】- Ribbon详解与实战
    • 一、什么是Ribbon
    • 二、Spring Cloud中Ribbon应用
      • Ribbon使用步骤如下
    • 三、Ribbon负载均衡策略设置
      • 3.1 全局策略设置
      • 3.2 基于注解的针对单个服务的 Ribbon 负载均衡策略
        • 3.2.1 注解方式
        • 3.2.2 IClientConfig针对客户端的配置管理器
      • 3.3 配置文件方式
    • 四、如何自定义Ribbon负载均衡策略
      • 4.1 自定义算法
      • 4.2 自定义配置类
      • 4.3 设置加载自定义Ribbon配置类
    • 五、LoadBalancer–负载均衡器的核心
      • 5.1 什么是LoadBalancerClient
      • 5.2 LoadBalancerClient原理
      • 5.3 LoadBabancerClient源码解析
        • 5.3.1 LoadBalancerClient 类图
        • 5.3.2 LoadBalancerClient 接口源码
        • 5.3.3 ServiceInstanceChooser 接口源码
        • 5.3.4 RibbonLoadBalanceClient 实现类源码
          • choose(),用来选择具体的服务实例
          • getServer(),获取实例
          • 5.3.5 BaseLoadBalancer 源码
          • 5.3.6 IRule 接口源码
          • 5.3.7 ILoadBalancer 源码
    • 六、Ribbon的配置参数
    • 七、总结

在前面的文章 Eureka详解与实战、Eureka Client应用、RestTemplate详解及其负载均衡几篇文章中,已经介绍了Spring Cloud基本应用,本文将从讲解在进程层面的负载均衡,在Spring Cloud中如何使用Ribbon做系统应用层面的负载均衡使用。

一、什么是Ribbon

Ribbon是netflix 公司开源的基于客户端的负载均衡组件,是Spring Cloud大家庭中非常重要的一个模块;Ribbon应该也是整个大家庭中相对而言比较复杂的模块,直接影响到服务调度的质量和性能。全面掌握Ribbon可以帮助我们了解在分布式微服务集群工作模式下,服务调度应该考虑到的每个环节。

Ribbon内部提供了一个接口叫做ILoadBalance的接口代表负载均衡器的操作,这个接口包含添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用服务器列表等功能。

下图展示Ribbon的架构图

在这里插入图片描述

二、Spring Cloud中Ribbon应用

Ribbon使用步骤如下

  1. 在Eureka Client中添加bom.xml 依赖

     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    
  2. RestTemplate配置类添加@LoadBalanced注解

    @Configuration
    public class RestTemplateConfig {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    }
    
  3. 启动类添加注解@EnableEurekaClient和@RibbonClient(name = “Eureka中spring.application.name”)

    @SpringBootApplication
    @EnableEurekaClient
    @RibbonClient(name="GoyeerRibbonDemo")
    public class GoyeerCloudRibbonAppliction {
        public static void main(String[] args){
            SpringApplication.run(GoyeerCloudRibbonAppliction.class);
        }
    }
    
  4. application.yml配置内容

    server:
      port: 8081
    eureka:
      client:
        service-url:
          defaultZone: http://server30000:30000/eureka/,http://server30001:30001/eureka/,http://server30002:30002/eureka/
        register-with-eureka: false
    spring:
      application:
        name: GoyeerRibbon
      profiles:
        active: ribbonClient
    
  5. 编写控制器

     @Autowired
     private  RestTemplateConfig restTemplateConfig;
     @RequestMapping(value = "/")
     public String index(){
            String url="http://GOYEERBOM"; //注册Eureka中的服务名
            RestTemplate restTemplate=restTemplateConfig.getRestTemplate();
            String str=restTemplate.getForObject(url,String.class);
            return str;
     }
    
  6. 服务端效果

    • Eureka服务器端
      在这里插入图片描述

    • Ribbon调用后结构

三、Ribbon负载均衡策略设置

3.1 全局策略设置

/**
 * @Author:Goyeer
 * @Description:Ribbon 全局的负载均衡策略配置类
 * @CreateDate:2023-07-11
 */
@Configuration
public class RibbonGlobalLoadBalancingConfiguration {
    /**
     * 随机规则
     */
    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }

}

3.2 基于注解的针对单个服务的 Ribbon 负载均衡策略

3.2.1 注解方式

/**
 * @Author:Goyeer
 * @Description:Ribbon 随机负载均衡策略配置类哪个服务引用就作用在那个服务上面在启动类上方使用 @RibbonClient 引用
 * @CreateDate:2023-07-11
 */
@Configuration
@AvoidScan
public class RibbonRandomLoadBalancingConfiguration {
    @Resource
    IClientConfig clientConfig;
    @Bean
    public IRule ribbonRule(IClientConfig clientConfig) {
        return new RandomRule();
    }
}

3.2.2 IClientConfig针对客户端的配置管理器

/** 配置针对单个服务的 Ribbon 负载均衡策略 **/
@RibbonClient(
        name = "goyeer-balance-ribbon", configuration = RibbonRandomLoadBalancingConfiguration.class
)
/** 此处配置根据标识 @AvoidScan 过滤掉需要单独配置的 Ribbon 负载均衡策略,不然就会作用于全局,启动就会报错 */
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = AvoidScan.class)
)

3.3 配置文件方式

### 针对单个服务的 Ribbon 配置
goyeer-balance-ribbon:
  ribbon:
    # 基于配置文件形式的 针对单个服务的 Ribbon 负载均衡策略
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

四、如何自定义Ribbon负载均衡策略

4.1 自定义算法

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import org.springframework.stereotype.Component;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class RandomRule_ZY extends AbstractLoadBalancerRule {
    //定义一个原子类,以保证原子性
    private AtomicInteger atomicInteger =new AtomicInteger(0);
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
    }
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null){
            return null;
        }
        //用于统计获取次数,当达到一定数量就不再去尝试
        int count = 0;
        Server server = null;
        //当服务还没获取到,并且尝试没有超过8次
        while (server == null && count++ < 8){
            //获取服务
            List<Server> allServers = lb.getAllServers();
            List<Server> reachableServers = lb.getReachableServers();
            int allServersSize = allServers.size();
            int reachableServersSize = reachableServers.size();
            //如果获取的服务list都为0就返回null
            if(allServersSize == 0 || reachableServersSize == 0){
                return  null;
            }
            //获取服务下标
            int next = getServerIndex(allServersSize);
            //获取服务
            server = reachableServers.get(next);
            //如果服务为空直接跳过下面的
            if (server == null){
                continue;
            }
            //如果获取到的这个服务是活着的就返回
            if (server.isAlive()){
                return server;
            }
            //如果获取到的服务不是空,但是不是存活状态,需要重新获取
            server=null;
        }
        //最后这里可能会返回null
        return  server;
    }
    //获取服务下标,为了保证原子性,使用了CAS
    public int getServerIndex(int allServersSize){
        //自旋锁
        for (;;) {
            //获取当前值
            int current = this.atomicInteger.get();
            //设置期望值
            int next = (current + 1) % allServersSize;
            //调用Native方法compareAndSet,执行CAS操作
            if (this.atomicInteger.compareAndSet(current, next))
                //成功后才会返回期望值,否则无线循环
                return next;
        }
    }
    public Server choose(Object key) {
        return choose(getLoadBalancer(),key);
    }
}

4.2 自定义配置类

@Configuration
//针对全局修改
//@RibbonClients(defaultConfiguration = MyRuleConfig.class)
//针对某个服务修改
@RibbonClient(name = "nacos-app-a", configuration = MyRuleConfig.class)
public class MyRuleConfig {
    @Bean
    public IRule rule() {
      //返回上面自定义的规则类
        return new RandomRule_ZY();
    }
}

4.3 设置加载自定义Ribbon配置类

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "Client",configuration = MyRuleConfig.class)
public class GoyeerCloudRibbonAppliction {
    public static void main(String[] args){
        SpringApplication.run(GoyeerCloudRibbonAppliction.class);
    }
}

五、LoadBalancer–负载均衡器的核心

Ribbon实现负载均衡是通过LoadBalancer注解来给RestTemplate标记,来实现负载均衡。LoadBalancer是如何实现负载均衡哪?查看源码我们可以看到有一个接口LoadBalancerClinet来实现的。

5.1 什么是LoadBalancerClient

LoadBalancerClient 是 SpringCloud 提供的一种负载均衡客户端,Ribbon 负载均衡组件内部也是集成了 LoadBalancerClient 来实现负载均衡。

5.2 LoadBalancerClient原理

LoadBalancerClinet在初始化时会通过Euraka Clinet向Eureka服务端获取所有的服务实例的注册信息并缓存到本地,并且每10秒向EurakaClinet发送“Ping”请求,来判断服务的可用性。如果服务的可用性发生了改变或者服务数量和之前的不一致,则更新或重新拉取最新到本地。在得到最新服务注册信息后,ILoadBalancer根据IRule的策略进行负载均衡(默认策略为轮询)。

当使用LoadBalancerClient进行远程调用的负载均衡时,LoadBalancerClient先通过目标服务名在本地服务注册清单中获取服务提供方的某个实例,如多个服务器节点,LoadBalancerClient会通过choose()方法获取到多个节点中一个服务,拿到服务的信息之后取出服务IP信息,就可以得到完整的想要访问的IP地址和端口号,最后通过RestTempate访问具体的服务信息。

5.3 LoadBabancerClient源码解析

5.3.1 LoadBalancerClient 类图

LoadBalancerClient 是 Spring Cloud 提供的一个非常重要的接口,它继承ServiceInstanceChooser 接口,该接口的实现类是 RibbonLoadBalanceClient,它们之间的关系如下图所示:

5.3.2 LoadBalancerClient 接口源码

public interface LoadBalancerClient extends ServiceInstanceChooser 
{
	<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;
     
    <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
    
    URI reconstructURI(ServiceInstance instance, URI original);
}

可以发现 LoadBalancerClient 接口继承了 ServiceInstanceChooser 接口,包含两个方法:executereconstructURI

  • execute() 用来执行Request请求
  • reconstructURI() 用来重构URL

5.3.3 ServiceInstanceChooser 接口源码

public interface ServiceInstanceChooser 
{
	ServiceInstance choose(String serviceId);
}

ServiceInstanceChooser 接口中的主要方法为 choose(),该方法用于根据服务的名称 serviceId 来选择其中一个服务实例,即根据 serviceId 获取ServiceInstance。

5.3.4 RibbonLoadBalanceClient 实现类源码

LoadBalancerClient 的实现类 RibbonLoadBalanceClient,它用来执行最终的负载均衡请求。其中,RibbonLoadBalanceClient 的一个 choose() 方法用于选择具体的服务实例,其内部是通过 getServer() 方法交给 ILoadBalancer 完成的。

  • choose(),用来选择具体的服务实例
    @Override
    public ServiceInstance choose(String serviceId) {
    	return choose(serviceId, null);
    }
     
    /**
     * New: Select a server using a 'key'.
     * @param serviceId of the service to choose an instance for
     * @param hint to specify the service instance
     * @return the selected {@link ServiceInstance}
     */
    public ServiceInstance choose(String serviceId, Object hint) {
      Server server = getServer(getLoadBalancer(serviceId), hint);
      if (server == null) {
    	 return null;
      }
      return new RibbonServer(serviceId, server, isSecure(server, serviceId),serverIntrospector(serviceId).getMetadata(server));
    }
    
  • getServer(),获取实例
    protected Server getServer(ILoadBalancer loadBalancer) {
       return getServer(loadBalancer, null);
    }
    protected Server getServer(ILoadBalancer loadBalancer, Object hint) {
       if (loadBalancer == null) {
    	   return null;
       }
       // 最终通过 loadBalancer 去做服务实例的选择。
       // Use 'default' on a null hint, or just pass it on?
       return loadBalancer.chooseServer(hint != null ? hint : "default");
    }
    
5.3.5 BaseLoadBalancer 源码
5.3.6 IRule 接口源码
public interface IRule{ 
    public Server choose(Object key);
    public void setLoadBalancer(ILoadBalancer lb);
    public ILoadBalancer getLoadBalancer();    
}

IRule 接口定义了3个方法,分别是:choosesetLoadBalancergetLoadBalancer

  • choose() 是用来选择实例的
  • setLoadBalancer()用来设置负载均衡规则
  • getLoadBalancer()获取负载均衡规则

实现IRule有个类,分别定义不同的负载均衡规则:

  • 随机策略 RandomRule
  • 轮询策略 RoundRobinRule
  • 重试策略 RetryRule
  • 可用过滤策略 PredicateBaseRule
  • 响应时间权重策略 WeightedRespinseTimeRule
  • 并发量最小可用策略 BestAvailableRule
  • 区域权重策略 ZoneAvoidanceRule
5.3.7 ILoadBalancer 源码

ILoadBalancer 是一个接口,该接口定义了一系列实现负载均衡的方法,LoadBalancerClient 的实现类 RibbonLoadBalanceClient 也将负载均衡的具体实现交给了 ILoadBalancer 来处理,ILoadBalancer 通过配置 IRule、IPing 等,向 EurekaClient 获取注册列表信息,默认每10秒向 EurekaClient 发送一次 “ping”,进而检查是否需要更新服务的注册列表信息。最后,在得到服务注册列表信息后,ILoadBalancer 根据 IRule 的策略进行负载均衡。

查看 BaseLoadBalancer 和 DynamicServerListLoadBalancer 源码,默认情况下实现了以下配置:

  1. IClientConfig clientConfig:用于配置负载均衡客户端,默认实现类是 DefaultClientConfigImpl。
  2. IRule rule:用于配置负载均衡的策略,默认使用的是 RoundRobinRule 轮询策略。
  3. IPing ping:用于检查当前服务是否有响应,从而判断当前服务是否可用,默认实现类是 DummyPing,该实现类的 isAlive() 方法返回值是 true,默认所有服务实例都是可用的。
  4. ServerList serverList:用于获取所有 Server 注册列表信息。通过跟踪源码会发现,ServerList 的实现类是 DiscoveryEnabledNIWSServerList,该类定义的 obtainServersViaDiscovery() 方法是根据 eurekaClientProvider.get() 方法获取 EurekaClient,再根据 EurekaClient 获取服务注册列表信息。EurekaClient 的实现类是DiscoveryClient,DiscoveryClient 具有服务注册、获取服务注册列表等功能。
  5. ServerListFilter filter:定义了根据配置过滤或者动态获取符合条件的服务列表,默认实现类是 ZonePreferenceServerListFilter,该策略能够优先过滤出与请求调用方处于同区域的服务实例。

六、Ribbon的配置参数

控制参数说明默认值
<service-name>.ribbon.NFLoadBalancerPingIntervalPing定时任务周期30s
service-name>.ribbon.NFLoadBalancerMaxTotalPingTimePing超时时间2s
<service-name>.ribbon.NFLoadBalancerRuleClassNameIRule实现类RoundRobinRule,基于轮询调度算法规则选择服务实例
<service-name>.ribbon.NFLoadBalancerPingClassNameIPing实现类DummyPing,直接返回true
<service-name>.ribbon.NFLoadBalancerClassName负载均衡器实现类2s
<service-name>.ribbon.NIWSServerListClassNameServerList实现类ConfigurationBasedServerList,基于配置的服务列表
<service-name>.ribbon.ServerListUpdaterClassName服务列表更新类PollingServerListUpdater
<service-name>.ribbon.NIWSServerListFilterClassName服务实例过滤器2s
<service-name>.ribbon.NIWSServerListFilterClassName服务实例过滤器2s
<service-name>.ribbon.ServerListRefreshInterval服务列表刷新频率2s
<service-name>.ribbon.NFLoadBalancerClassName自定义负载均衡器实现类2s

七、总结

Ribbon是Spring cloud的核心,负载微服务内负载调用;Ribbon可以脱离Spring Cloud的单独使用。

Ribbon是微服务整个微服务组件最复杂的一环,控制流程上为保证服务的高可用性,有比较多的细节参数控制,在使用的过程中需要深入理清每个环节的处理机制,使之发挥稳定且高效的作用。

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

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

相关文章

『赠书活动 | 第十五期』《Java核心技术·卷II》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十五期』 本期书籍&#xff1a;《Java核心技术卷II》 公众号赠书&#xff1a;第六期 参与方式&#xff1a;关注公众号&#xff1a;低调而…

折叠屏手机的屏幕,华为Mate X3给出了一份“内外兼修”的解决方案

说起折叠屏手机&#xff0c;屏幕一直都是这个领域的重头戏&#xff0c;很多人都对折叠屏手机有一种刻板印象&#xff0c;那就是脆弱。但是&#xff0c;3月份华为最新推出的Mate X3可以说是非常的亮眼&#xff0c;在内外屏幕、水滴铰链、影像系统等多个核心部件的全方位提升&…

MKPFMSEG字段增强后 关于 BAPI_GOODSMVT_CREATE 的extensionin的增强参数带入。

首先在MKPF 的增强表结构 BAPI_TE_XMKPF 增强字段 如果是行项目上的 BAPI_TE_XMSEG 然后在实际赋值的时候 前面14位数是 10位物料凭证号 4位 年度 CLEAR: ls_extensionin.ls_extensionin-STRUCTURE BAPI_TE_XMKPF.ls_extensionin-valuepart114(50) ls_…

告诉你有哪些音频转换成mp3免费软件

曾经有一个名叫小华的音乐爱好者&#xff0c;他对于收集和欣赏各种类型的音频文件情有独钟。然而&#xff0c;他在构建自己的音乐库时遇到了一个困扰&#xff1a;不同设备和平台支持的音频格式千差万别&#xff0c;这让他无法顺利地播放和分享自己喜爱的音乐。幸运的是&#xf…

GTK列表显示文本和图片

使用GtkTreeView控件显示包含文本和图片的列表&#xff0c;GtkTreeView/GtkListStore或者GtkTreeView/GtkTreeModel使用的是MVC设计理念。 关于MVC: M层: model 数据模型层(处理数据的增删改查) 提供数据 V层: Views 视图层 (数据展示) 渲染数据 C层: controller 控制层(处理业…

【UI框架-uView】Input输入框如何使用前后槽?

【UI框架-uView】Input输入框如何使用前后槽&#xff1f; 官方链接如下&#xff1a;Input输入框 - 前后槽 前槽如下&#xff1a; 后槽如下&#xff1a; 可以看到&#xff0c;前后槽的灵活使用&#xff0c;不仅方便我们的布局&#xff0c;还可以在input中实现复杂的应用。 注意…

Vue 组件化开发

文章目录 前言组件化开发父子组件相互传数据父传子&#xff1a;自定义属性子传父&#xff1a;自定义事件父子组件互传案例 插槽 slot多个插槽 总结组件化开发总结Vue组件的基本组成子组件使用的三个步骤父子组件相互传递数据 前言 提示&#xff1a;这里可以添加本文要记录的大…

jenkins 创建项目的ci

一.创建视图 1.点击加号 选择列表视图 2.输入名称&#xff0c;点击确定 二.创建任务 1.点击到你新建的视图之后&#xff0c;再点击文本中的创建一个新的任务。 2.进入创建页面后首先填写描述 三.选择丢弃旧的构建 保持构建的天数是指&#xff1a;是指保留多少天内的构建 …

【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

实验板卡&#xff1a;xc7a100tlc sg324-2L&#xff0c;共20个开关 实验要求&#xff1a;

【C#】并行编程实战:同步原语(1)

在第4章中讨论了并行编程的潜在问题&#xff0c;其中之一就是同步开销。当将工作分解为多个工作项并由任务处理时&#xff0c;就需要同步每个线程的结果。线程局部存储和分区局部存储&#xff0c;某种程度上可以解决同步问题。但是&#xff0c;当数据共享时&#xff0c;就需要用…

Chrome内建DNS导致的解析错误修复

Index Chrome内建DNSDisable Async DNS resolver Chrome内建DNS 实际上 , Chrome在使用自己的DNS来进行域名的解析 , 这导致有时候一些域名解析会出现错误 , 导致访问速度变慢 , 例如 blog.csdn.net 使用谷歌的 8.8.8.8 dns解析就会 , 解析到香港的ip上去 , 导致访问速度变慢 …

群晖NAS:docker查询注册表失败解决方案 docker安装网心云、mysql等

群晖NAS&#xff1a;docker查询注册表失败解决方案 差不多2023年4月底开始的&#xff0c;docker内不能直接搜索注册表。据说是有人在库里放了一些有意思的东西&#xff0c;被和谐掉了&#xff0c;所以也别指望什么时候能解封。 网上很多案例&#xff0c;都不能用。还有奇葩的…

史上最细接口测试详解,接口测试从0到1实施,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口测试描述定…

【C语言】-- 死循环了怎么办?

#include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello\n");}return 0; } 阅读上面这个代码&#xff0c;我们会认为这不就是简单的数组访问越界么。那么这段代码就应该会报错&#xff0c;…

macOS Sonoma 14beta 3 (23A5286i)第二个更新「附黑/白苹果镜像下载」

系统镜像下载&#xff1a; 系统介绍 黑果魏叔 7 月12 日消息&#xff0c;苹果今天发布 macOS Sonoma 14.0 Beta 3&#xff08;内部版本号&#xff1a;23A5286i&#xff09;第二个更新。 目前尚不清楚苹果为什么要发布 macOS Sonoma Beta 3 的第二个版本&#xff0c;但它可能…

外包干了2年,我裸辞了...

我25岁&#xff0c;中级测试&#xff0c;外包&#xff0c;薪资13.5k&#xff0c;人在上海。内卷什么的就不说了&#xff0c;而且人在外包那些高级精英年薪大几十的咱也接触不到&#xff0c;就说说外包吧。 假设以我为界限&#xff0c;25岁一线城市13.5k&#xff0c;那22-24大部…

CUDA11.1、cuDNN8.6.0、Tensorrt8.5.3,ubuntu20.04安装过程记录

CUD11.1 下载地址&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 安装&#xff1a; wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run sudo sh cuda_11.1.1_455.32.00_linux.run 对于不是sudo用户&…

CRYPTO-36D-飞鸽传书

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 TVdJd09HRm1NamMyWkdKak56VTVNekkzTVdZMFpXVTJNVFl5T0Rrek1qUWxNRUZsTW1GbE0yRXlNelV3TnpRell6VXhObU5rWVRReE1qUTVPV0poTTJKbE9TVXdRV0prWlRVeVkySXpNV1JsTXpObE5EWXlORFZsTURWbVltUmlaRFptWWpJMEpUQkJaVEl6…

Jmeter性能测试插件jpgc的安装

目录 一、获取插件包 1.访问官网获取 2.百度网盘下载 二、安装路径 三、安装插件 1.重启Jmeter 2.进入Plugins Manager 3.jpgc插件安装 4.安装完成后检查 总结&#xff1a; 一、获取插件包 1.访问官网获取 官网地址&#xff1a; ​ 2.百度网盘下载 链接&#xff1…

LiveGBS 国标平台作为下级GB28181级联到海康大华宇视华为等第三方国标平台的操作步骤说明

LiveGBS 国标平台作为下级GB28181级联到海康大华宇视华为等第三方国标平台的操作步骤说明 1、什么是GB/T28181级联2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入LiveGBS示例 4、配置国标级联4.1、国标…