Nginx负载均衡配置、限流配置、Https配置详解

news2024/11/16 9:19:44

一. 负载均衡

1. 用法

 通过proxy_pass 可以把请求代理至后端服务,但是为了实现更高的负载及性能, 我们的后端服务通常是多个, 这个是时候可以通过upstream 模块实现负载均衡。

使用的模块为:【ngx_http_upstream_module】,具体配置可以根据模块名去查找文档。

负载均衡的算法有:

  • ll:轮询
  • ll+weight: 轮询加权重
  • ip_hash : 基于Hash 计算,用于保持session 一至性 该算法下权重失效
  • url_hash: 静态资源缓存,节约存储,加快速度(第三方) 该算法下权重配置失效
  • least_conn :最小链接数
  • least_time :最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重

2. 参数

upstream 相关参数如下:

  • server 反向服务地址加端口
  • weight 权重,默认是1,越大权重就越大
  • max_fails 失败多少次认为主机已挂掉则,踢出 (默认配置10s,即服务器宕掉,会自动剔除)
  • fail_timeout 踢出后重新探测时间
  • backup 备用服务,当其他非backup的机器全部宕机或者繁忙的时候,才会启动这台机器。
  • down 表示当前Server不参与负载
  • max_conns 允许最大连接数
  • slow_start 当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列。
upstream myApiTest {
          server localhost:9001 weight=10;
          server localhost:9002 weight=5;
          server localhost:9003  max_fails=3 fail_timeout=30s;
          server localhost:9004 backup;
          server localhost:9005 down;
    }

3. 案例

事先准备:

  有三个同样的api服务,分别部署在9001、9002、9003端口下,比如:访问 http://localhost:9001/Home/GetMsg,会返回 【 获取成功,当前端口为:9001】,其它端口类似。

要求:

 Nginx监听8080端口,接收到8080端口的请求,按照响应的算法进行转发到9001-9003端口。 

(1). 轮询

 访问地址:http://localhost:8080/Home/GetMsg ,会依次转发到9001、9002、9003端口上。【最新版本测试,轮询的时候一个服务器连续沦陷两次,才到下一个服务器,继续连续两次】??

配置如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream myApiTest {
          server localhost:9001;
          server localhost:9002;
          server localhost:9003;
    }
    server {
        listen       8080;
        server_name   xxx;    #随意配置一个即可,优先走代理地址
        location / {
            proxy_pass http://myApiTest;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

补充其他参数说明:

 下面配置,当请求 http://localhost:8080/Home/GetMsg 时候,只会被转发到9003端口上,此时把9003端口的服务关掉,再次请求,则会被转发到9001端口上,其中9002端口,全程不参与负载。

upstream myApiTest {
    server localhost:9001 backup;
    server localhost:9002 down;
    server localhost:9003;
}

(2).轮询+权重

  下面配置,被转发到9001 9002端口的概率要大于9003端口。

配置如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream myApiTest {
          server localhost:9001 weight=10;
          server localhost:9002 weight=5;
          server localhost:9003;
    }
    server {
        listen       8080;
        server_name   xxx;    #随意配置一个即可,优先走代理地址
        location / {
            proxy_pass http://myApiTest;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

(3). ip_hash

 同一个ip永远会被分配到同一个Server上,主要用来解决Session不一致的问题,但该策略也有弊端,weight权重无效,所以该方案会导致某个Server压力可能过大,请求分配不均匀问题。

配置如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream myApiTest {
          ip_hash;   #开启ip_hash策略
          server localhost:9001;
          server localhost:9002;
          server localhost:9003;
    }
    server {
        listen       8080;
        server_name   xxx;    #随意配置一个即可,优先走代理地址
        location / {
            proxy_pass http://myApiTest;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

(4). url_hash

 主要用于节省空间,比如我有9G的图片资源,服务器集群有三台,因为不确定请求会被转发到哪一台上,所以每台服务器都存放9G,显然这样是不合理的。

 我们可以在存储的时候,将图片进行urlhash算法,分别存放到三台服务器上,这样请求的时候也是用urlhash,去指定服务器请求即可,节省了服务器空间,也就是3台服务器总共用了9G。

PS:上面只是举例方便理解,生产中,大量图片资源存放cdn第三方,然后在自己的服务器上做一层临时缓存,为了提高缓存的命中率,通常用urlhash算法。

更多C++后台开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。

C/C++Linux服务器开发高级架构师/C++后台开发架构师​免费学习地址

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取

二. 限流配置

1. 说明

(1). 限流的作用

限流主要用作安全目的,比如可以减慢暴力密码破解的速率。

通过将传入请求的速率限制为真实用户的典型值,并标识目标URL地址(通过日志),

还可以用来抵御DDOS攻击。更常见的情况,该功能被用来保护上游应用服务器不被同时太多用户请求所压垮。

(2). 原理

令牌桶算法

漏桶算法

(3). 涉及到的模块

A. 用来限制同一时间连接数,即并发限制 【不常用】

【ngx_http_limit_conn_module】 对应文档:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

B. 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 【推荐使用】

【ngx_http_limit_req_module】 对应文档:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

2. 环境准备

(1). Api接口

启动指令如下:

【dotnet NginxTest.dll --urls="http://*:7061" --ip="127.0.0.1" --port=7061】

【dotnet NginxTest.dll --urls="http://*:7062" --ip="127.0.0.1" --port=7062】

接口地址为: http://localhost:7061/api/Home/GetNowTime 【Post请求】

接口代码如下:

[Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        [HttpPost]
        public string GetNowTime()
        {
            string nowTime = DateTime.Now.ToString();
            Console.WriteLine($"当前时间为:{nowTime}");
            return $"当前时间为:{nowTime}";
        }
    }

(2). nginx服务

使用到的指令

启动服务:【start nginx】

 强制关闭服务:【nginx -s stop】

 重载服务:【nginx -s reload】 

nginx监听7000端口,然后进行代理配置,这里重点测试的是限流,只用7061一个api端口即可。

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    server {
        listen       7000;        #监听端口
        server_name  xxx;         #随意配置一个地址即可,优先走代理
        location / {
             proxy_pass http://localhost:7061;   #代理地址
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

通过post请求访问:http://localhost:7000/api/Home/GetNowTime ,返回当前时间,表示配置成功。

(3). jmeter测试工具

添加线程组,然后在线程组的基础上添加:http请求、察看结果树、聚合报告、用表格查结果。

配置请求的并发数、请求地址。

 测试结果:10个请求全部成功。

3. 限流-限制并发连接数【不常用】

声明格式:

limit_conn_zone $server_name zone=myLimit0:10m;
limit_conn_zone $binary_remote_addr zone=myLimit1:10m;

(1). $server_name:表示虚拟主机(server) 同时能处理并发连接的总数。 (数量在启用时配置)

(2). $binary_remote_addr:表示限制每个客户端IP(单个ip)连接到服务器的链接数量。 (数量在启用时配置)

(3). zone=myLimit1:10m :表示内存区域名称 和 空间大小。

调用格式:

limit_conn myLimit1 2;	 #启用限流

(1). myLimit1 :表示用上述声明的哪个配置进行限制,myLimit1与上述声明的名称相对应。

(2). 2: 表示配置的数量限制。

(1). 限制-虚拟主机同时能处理的并发链接总数

分析:

虚拟主机(server) 同时能处理并发连接的总数为5.

测试条件:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    # 限流配置声明
    limit_conn_zone $server_name zone=myLimit0:10m;
    server {
        listen       7000;        #监听端口
        server_name  xxx;         #随意配置一个地址即可,优先走代理
        location / {
             limit_conn myLimit0 5;  #启用限流
             proxy_pass http://localhost:7061;   #代理地址
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

测试结果:

忽略

(2). 限制-单个ip链接到服务器的数量

剖析:

单个IP同时最多能持有8个连接

测试条件:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 限流配置声明
    limit_conn_zone $binary_remote_addr zone=myLimit1:10m;
    server {
        listen       7000;        #监听端口
        server_name  xxx;         #随意配置一个地址即可,优先走代理
        location / {
             limit_conn myLimit1 8;	 #启用限流
             proxy_pass http://localhost:7061;   #代理地址
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

测试结果:忽略

4. 限流-限制速率【推荐使用】

声明格式:

limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=5r/s;

(1). $binary_remote_addr : 表示限制同一客户端ip地址,即限制速率是以ip为分类的,限制每个ip的速度

(2). zone=myLimit2:10m: myLimit2表示内存区域的名称,10m表示内存空间的大小。

(3). rate=5r/s : 表示1s允许5个请求, 注意这里需要拆分理解,即200ms允许1个请求,当第一个请求处理完成,如果200ms内又进来一个请求,该请求将被拒绝处理,只有过了200ms后,才会处理第2个请求,一次类推。

调用格式 :

limit_req zone=myLimit2 burst=5 nodelay;

(1). zone=myLimit2:表示用上述声明的哪个配置进行限制,myLimit2与上述声明的名称相对应。

(2). burst=5 :设置一个大小为5的缓冲区,当有大量请求(瞬间爆发)过来时,超过了上述配置的访问频次限制的请求,可以先放到这个缓冲区内。

注:burst的作用是让多余的请求可以先放到队列里,慢慢处理。如果不加nodelay参数,队列里的请求不会立即处理,而是按照rate设置的速度,以毫秒级精确的速度慢慢处理。

(3). nodelay : 设置后,burst缓冲区中排队的请求立即被处理,超过频次限制 并且 缓冲区满了的情况下,直接返回503状态码;如不设置,那么额外的请求将进入等待排队的状态

注:通过设置burst参数,我们可以允许Nginx缓存处理一定程度的突发,多余的请求可以先放到队列里,慢慢处理,不报错,这起到了平滑流量的作用。

但是如果队列设置的比较大,请求排队的时间就会比较长,从用户角度看来就是响应变长了,这对用户很不友好,所以引入nodelay参数。

  nodelay参数允许请求在排队的时候就立即被处理,也就是说只要请求能够进入burst队列,就会立即被后台处理,请注意,这意味着burst设置了nodelay时,系统瞬间的QPS可能会超过rate设置的阈值。

所以:nodelay参数要跟burst一起使用才有作用。

(1). 实操1-限制速率

分析:

 使用jmeter发送10个请求进行测试,nginx的限制速率设置为 2r/s,意味着第1个请求处理完后,500ms内接收的请求都将拒绝,过了500ms后,才能处理下一个请求。 详见下面的测试结果。

测试条件:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 限流配置声明
    limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=2r/s;
    server {
        listen       7000;        #监听端口
        server_name  xxx;         #随意配置一个地址即可,优先走代理
        location / {
             limit_req zone=myLimit2;	 #启用限流	 
             proxy_pass http://localhost:7061;   #代理地址
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

测试结果:

第1个成功的请求的是008ms,接下来第 2-6个请求,由于是在500ms内,所有都请求失败; 第2个成功的请求为608ms,正好过了500ms了,所以成功了。

(2). 限制速率+设置缓冲区

分析:

使用jmeter发送10个请求进行测试,nginx的限制速率设置为 2r/s,burst=5,意味着第1个请求处理完后,接下来的5个请求都是存放到缓存中,第7个请求如果在第1个的500ms后,则请求成功,反之失败。

测试条件:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 限流配置声明
    limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=2r/s;
    server {
        listen       7000;        #监听端口
        server_name  xxx;         #随意配置一个地址即可,优先走代理
        location / {
             limit_req zone=myLimit2 burst=5;	  #启用限流
             proxy_pass http://localhost:7061;   #代理地址
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

测试结果:

  第1个成功的请求为343ms,接下来第2-6个加入到缓存区,依次执行成功; 第7个请求为944,与第一个成功的请求相比,已经超过了500ms,所以执行成功,接下来的8-10个请求,均在第7个成功后的500ms内,所以均失败。

(3). 限制速率+设置缓冲区+立即处理

分析:

使用jmeter发送10个请求进行测试,nginx的限制速率设置为 2r/s,burst=5 nodelay,意味着第1个请求处理完后,接下来的5个请求立即执行,第7个请求如果在第1个的500ms后,则请求成功,反之失败。

测试条件:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 限流配置声明
    limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=1r/s;
    server {
        listen       7000;        #监听端口
        server_name  xxx;         #随意配置一个地址即可,优先走代理
        location / {
             limit_req zone=myLimit2 burst=5 nodelay;	#启用限流	 
             proxy_pass http://localhost:7061;   #代理地址
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

测试结果:

  第1个成功的请求为278ms,接下来2-6个立即执行,第7个请求为879,距离第一个成功的已经超过500ms,所以执行成功,接下来的8-10个请求,均在500ms内,所以执行失败。

三. Https配置

1. 准备

(1). 生成证书

OpenSSL工具下载地址:http://slproweb.com/products/Win32OpenSSL.html 【这里以3.0.5为例】

OpenSSL生成证书步骤:https://jingyan.baidu.com/article/6c67b1d6be538c2787bb1e06.html

(2). 相关模块

【ngx_http_rewrite_module】 参考文档:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

2. 实操

(1). 配置https的Server

开启一个新的虚拟主机,用来配置https监听8000端口,配置证书的物理地址即可,就可以通过 https://localhost:8000/api/Home/GetNowTime ,访问代理地址下7061的api了。

(PS:下面配置同时开启了 http的主机,所以通过 http://localhost:7000/api/Home/GetNowTime,也可以访问)

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    #http主机
    server {
        listen       7000;          #监听端口
        server_name  test1;         #随意配置一个地址即可,优先走代理
        location / {	 
            proxy_pass http://localhost:7061;   #代理地址
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
	
    #https主机
    server {
        listen       8000 ssl;
        server_name  test2;
        #证书目录
        ssl_certificate      D:/cert/server-cert.pem;
        ssl_certificate_key  D:/cert/server-key.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        location / {
            proxy_pass http://localhost:7061;
        }
    }
}

(2). 将http跳转到https

上述http监听的7000端口,https监听的8000端口,如何让http请求自动跳转到https请求上呢?

加个 return 301 xxxxx 跳转即可。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	#http主机
    server {
        listen       7000;          #监听端口
        server_name  test1;         #随意配置一个地址即可,优先走代理
        location / {	 
            proxy_pass http://localhost:7061;   #代理地址
			
			#跳转到https (test2是https主机的server_name)
			return 301 https://test2$request_uri;
			
			#或者
			#return 301 https://$host:8000$request_uri;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
	
	#https主机
	server {
        listen       8000 ssl;
        server_name  test2;

		#证书目录
		ssl_certificate      D:/cert/server-cert.pem;
        ssl_certificate_key  D:/cert/server-key.pem;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        location / {
            proxy_pass http://localhost:7061;
        }
    }
}

原文链接:第二节:Nginx负载均衡配置、限流配置、Https配置详解 - Yaopengfei - 博客园

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

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

相关文章

股票买卖明细接口是怎样实现查询交易数据的?

股票买卖明细接口作为软件应用而言,很多资源和数据不一定就是由其自身提供的,所以说某些功能还是需要调用第三方提供的服务,这其中就涉及到API接口的调用。也就是说,股票买卖明细接口是与数据端直接挂钩的,通过一些量化…

大数据毕设选题 - 招聘岗位数据分析可视化(python 爬虫)

文章目录1 前言1 课题背景2 实现效果3 项目实现3.1 概述3.2 数据采集3.3 数据清洗与预处理4 数据分析与可视化Flask框架介绍5 最后1 前言 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学…

Head First设计模式(阅读笔记)-03.装饰者模式

星巴兹咖啡 咖啡存在许多的种类,同时也有不同的调料。此时用户可以单点咖啡,也可以点咖啡调料,请计算费用(这里咖啡和调料都属于Drink的一类) 简单实现 方案1 每出现一种组合就实现一个类,但是每次增加一个咖啡种类或者一个新的调…

Centos7通过SSH使用密钥实现免密登录

Centos7通过SSH使用密钥实现免密登录 日常开发中,难免会有登录服务器的操作,而通过ssh方式登录无疑是比较方便的一种方式。 如果登录较频繁,使用密钥实现免密登录无疑更是方便中的方便。因此本文就简单说一说如何实现免密登录。一、安装配置ssh服务 默认情况下Centos7是安装…

推荐一款制作精良、功能强大、毫秒级精度的定时任务执行软件

目录 一、定时执行专家 - 功能详细 二、定时执行专家 - 最新版下载 三、定时执行专家 - 更新日志 四、关键字/Keyword 一、定时执行专家 - 功能详细 1、支持多种触发方式(定时方式):倒计时执行、持续执行、键盘鼠标空闲指定时长时执行、…

了解的Java泛型

作者:~小明学编程 文章专栏:JavaSE基础 格言:目之所及皆为回忆,心之所想皆为过往 目录 前言 什么是泛型 为什么要引入泛型 使用泛型 裸类型 泛型类的定义 类型擦除 通配符 什么是通配符 通配符的上下界 通配符的使用 …

Cookie和Session的工作流程以及Servlet中与之相关的API

目录 一、认识Cookie和Session 1、Cookie 2、Session 二、Cookie和Session的工作流程 三、Servlet中与Cookie和Session相关的API 1、HttpServletRequest类中的相关方法 2、HttpServletResponse类中的相关方法 3、HttpSession类中的相关方法 4、Cookie类中的相关方法 …

常用的框架技术-10 Spring Security Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1.Spring Security简介1.1 Spring Security概述1.2 Spring Security历史发展1.3 产品的对比1.3.1 Spring Security1.3.2 Shiro1.4 Spring Security 核心类1.4.1 Auth…

既然有了ES,为何还用ClickHouse——从原理万字总结ClickHouse为何这么快

通过了解 CH 的几大特性了解千亿级企业 ClickHouse 实时处理引擎架构设计、核心技术设计、运行机理全流程。 文章目录1 初始 ClickHouse1.1 什么是 ClickHouse1.2 ClickHouse 的优缺点1.3 谁在用 ClickHouse3 数据引擎3.1 库引擎3.2 表引擎3.3 MergeTree 引擎4 工作原理4.1 数据…

浙大MBA经验分享:在工作生活的缝隙中奋勇上岸

非常高兴可以为大家分享我的浙大MBA备考经验!首先针对我的背景简要介绍一下,我本科毕业于省内的普通大学浙江理工大学,学的是设计专业,就业于一家外企公司。在2022年的联考中获得了综合133,英语75,总分是20…

一个简单的音乐网站设计与实现(HTML+CSS)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…

常见集群算法解析

Gossip协议 Gossip协议简介 定义 Gossip protocol,又叫 Epidemic Protocol (流行病协议),也叫“流言算法” 、 “疫情传播算法”等。其名称已经形象的说明了算法的原理和工作方式 应用场景 分布式网络,无集中管理节…

同花顺l2数据接口的委托队列是什么?

我们都知道股票交易时有买方也有卖方,“买一”通俗理解就是此刻“买”价最“高”即第一的委托集合,卖一则是“卖”价最低的委托集合。 “一”并非指一笔委托或一手股票,它的背后是有多笔报价相同的买入或卖出委托组成,可能是主力…

cesium火箭发射,模型控制,模型动画,模型移动

起因:最近想做模型的动画,结果上网查资料,看到网上好多对于模型控制的文章都有限制。决定还是自己研究下。欢迎大家一起探讨,评论留言。 效果 火箭全部代码在最后 起步 模型控制,第一步当然是需要一个合适的模型&#…

链动2+1模式是否合法合规?它涉及多级传销吗?

根据国家《禁止传销条例》第2条规定,传销是指组织者或者经营者发展人员,通过对被发展人员以其直接或者间接发展的人员数量或者销售业绩为依据计算和给付报酬,或者要求被发展人员以交纳一定费用为条件取得加入资格等方式牟取非法利益&#xff…

【多线程】Thread的interrupt()

一、前言 如果子线程执行完毕终止状态,主线程再去调用interrupt()有什么效果?如果子线程还在执行过程中,主线程调用interrupt()有什么结果? 二、模拟实验 1、模拟子线程执行完毕再调用interrupt() ​ public class Test {publi…

2023年天津美术学院专升本报名考试须知

天津美术学院2023年高职升本科报考须知(一)专业考试1.报名方法: ①网上报名及缴费: 我校采取网上报名的方式,考生于2022年12月份(具体时间关注公众号“高职接本科”另行公告)(10:00-22:00)登录网站(网址&am…

web前端期末大作业 html+css学生心理 7页主题网页设计

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家 | HTML期末大学生网页设计作业 HTML:结构 CSS:样式 在操作方面上运用了html5和css3, 采用了divcss结构、表单、…

Oculus Deeplink

DeepLink 初始化 platform sdk 后设置 应用启动回调判断应用打开的方式发起应用跳转 接收应用跳转 GroupPresence 本文档基于 GroupPresenceSample 脚本逻辑编写,展示通过群组状态发起用户邀请,以及响应对应回调。参考 Oculus 工程 SharedSpaces 使…

【安装教程】vscode安装教程(超详细)

Visual Studio Code(简称 VSCode)是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全、代码重构功能,并且内置了命令行工具和 Git版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置,也可以…