当前位置: 首页 > article >正文

5.Nginx+Tomcat负载均衡群集

Tomcat服务器应用场景:tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。

一.Tomcat的安装部署

1.1实施准备

(1)关闭firewalld防火墙

systemctl stop firewalld

setenforce 0

(2)在安装Tomcat之前必须先安装JDK

JDK的全称是Java Development Kit,是sun公司免费提供的Java语言的软件开发工具包,其中包含Java虚拟机(JVM)。编写好的Java源程序经过编译可形成Java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了Java的跨平台性。

1.2查看JDK是否安装

java -version

1.3安装配置Tomcat

(1)Tomcat的安装和配置步骤如下:

解压软件包

tar zxvf apache-tomcat-.......

(2)将解压后的文件夹移动到/usr/local下并改名为tomcat

mv apache-tomacat-....  /usr/local/tomcat

(3)启动tomcat

cat/usr/local/tomcat/bin/startup.sh

Tomcat默认运行在8080端口,运行netstat命令查看8080端口监听的net

netstat -anpt | grep 8080

(4)打开浏览器访问测试:http://192.168.10.101:8080/,如果出现如下图,则表示已经启动成功

如果想关闭Tomcat,则运行/usr/local/tomcat/bin/shutdown.sh命令

1.4Tomcat配置相关说明

Tomcat的主目录为/usr/local/tomcat

ll /usr/local/tomcat/

(1)主要目录说明

bin/:存放Windowns或Linux平台上启动和关闭Tomcat的脚本文件

conf/:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml

lib/:存放Tomcat运行需要的库文件(JARS)

logs/:存放Tomcat执行时的LOG文件

webapps:Tomcat的主要Web发布目录(包括应用程序实例)

work:存放JSP编译后产生的class文件

(2)配置文件说明

catalina.policy:权限控制配置文件

catalina.propertise:Tomcat属性配置文件

context.xml:上下文配置文件

logging.properties:日志log相关配置文件

server.xml:主配置文件

tomcat-users.xml:manager-gui管理用户配置文件

web.xml:Tomcat的servlet、servlet-mapping、filter、MIME等相关配置

2.5Tomcat主配置文件说明

server.xml为Tomcat的主要配置文件,通过此文件开源修改Tomcat的启动端口、网站目录、虚拟主机、开启https等重要功能

整个server.xml由以下结构构成:<Server>、<Service>、<Connector/>、<Engine>、<Host>、<Context>、</Context>、</Host>、</Engine>、</Service>和</Server>。

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
    <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost" appBase="webapps"
                  unpackWARs="true" autoDeploy="true">
                <Context path="/myapp" docBase="/path/to/myapp" />
            </Host>
        </Engine>
    </Service>
</Server>
<Server>

• port="8005":指定Tomcat服务器监听的用于接收关闭命令的端口。

• shutdown="SHUTDOWN":设置关闭服务器的命令字符串。

<Connector>

• port="8080":Tomcat监听HTTP请求的端口号。

• protocol="HTTP/1.1":使用的HTTP协议版本。

• connectionTimeout="20000":连接超时时间,单位为毫秒。

• redirectPort="8443":当需要SSL加密连接时,将请求重定向到的端口。

<Engine>

• name="Catalina":引擎的名称。

• defaultHost="localhost":默认的虚拟主机名。

<Host>

• name="localhost":虚拟主机的名称。

• appBase="webapps":Web应用程序的基础目录。

• unpackWARs="true":是否自动解压WAR文件。

• autoDeploy="true":是否自动部署应用程序。

<Context>

• path="/myapp":Web应用的上下文路径。

• docBase="/path/to/myapp":Web应用的实际文件目录。

2.6Tomcat Server的组成部分说明

(1)Server

代表了整个Catalina的servlet容器

(2)Service

Service是这样一个集合:它由一个或者多个Connector,以及一个Engine(负责处理所有Connector所获得的客户请求)组成

(3)Connector

一个Connector在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户

Tomcat有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其他WebServer的请求

Coyote Http/1.1 Connector在端口8080处侦听来自客户browser的http请求

Coyote JK2 Connector在端口8009处侦听来自其他webserver的servlet/jsp代理请求

(4)Engine

Enginxe下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名,当Engine获得一个请求时,他把该请求匹配到某个Host上,然后把该请求交给该Host来处理

Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理

(5)Host

代表一个Virtual Host,即虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配

每个虚拟主机下都可以部署一个或者多个Web app,每个web app对应于一个Context,有一个Context path

当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理,匹配的方法是“最长的匹配”,所以一个path==""的Context将成为Host的默认Context

(6)Context

所有无法和其他Context对应于一个Web Application,一个Web application由一个或者多个Servlet组成

2.7建立Java的Web站点

(1)在根目录下建立一个web目录,并在里面建立一个webapp1目录,用于存放网站文件

mkdir -p /web/webapp1

(2)在webapp1目录下建立一个index.jsp的测试页面

vim /wen/webapp1/index.jsp

(3)修改Tomcat的server.xml文件

定义一个虚拟主机,并将网站文件路径指向已经建立的/web/webapp1,在host段增加context段

vim /usr/local/tomcat/conf/server.xml

   <Context doBase="/web/webapp1"  path=""  reloadable="false"  >

   </Context>

</Host>

(4)关闭Tomcat,再重新启动

/usr/local/tomcat/bin/shutdown.sh

/usr/local/tomcat/bin/startup.sh

(5)确认web站点

通过浏览器访问http://192.168.10.101:8080/,出现如图所示,说明该Tomcat站点已经配置成功,并且已经能够运行JSP了

显式“静态页面的图片2”文字,并没有出现logo.jpg图片,原因是由于静态图片暂时没配,所以加载不出来

二.案例:Nginx+Tomcat负载均衡、动静分离群集

1.案例分析

1.1案例概述

通常情况下,一台Tomcat 站点由于可能出现单点故障及无法应付过多客户复杂多样的 请求等问题,不能单独应用于生产环境下,所以需要一套更可靠的解决方案来完善 Web 站点 架构。
Nginx 是一款非常优秀的 http 服务器软件,它能够支持高达 50000 个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且内存、CPU等系统资源消耗非常低。目 前很多大型网站都应用 Nginx 服务器作为后端网站程序的反向代理及负载均衡器,来提升整 个站点的负载并发能力。
Nginx 是一个非常强大的静态 web 服务,Tomcat 处理动态请求效率不高,而一般网站大 多数的内容都是静态文件(如图片、html、css、js 等),经过 Nginx 前端的反向代理加速 和过滤,后端Tomcat 处理请求的压力便可大大减少,只需负责处理动态内容就可以了。在 性能与稳定性的权衡下,使用 NginxtTomcat 搭配便可让它们在各自擅长的领域大展拳脚。

1.2案例环境

主机IP地址操作系统应用
Tomcat1服务器

192.168.10.101

openeuler24apache-tomcat
Tomcat2服务器192.168.10.102openeuler24apache-tomcat
Nginx服务器192.168.10.103openeuler24nginx

需求:

a.安装nginx、tomcat

b.nginx、tomcat配置

c、编写动静分离页面

2.案例实施

2.1Tomcat2 server配置

(1)关闭防火墙

(2)确认是否安装 JDK,JAVA 版本与 Tomcatl server 保持一致。

(3)安装配置 Tomcat,版本与 Tomcatl server 保持一致。

(4)创建/web/webapp1 目录,修改 Tomcat 配置文件 server.xml,将网站文件目录更改 到/web/webapp1/路径下。

(5)在/web/webapp1/路径下建立 index.jsp,为了区别将测试页面 index.jsp 的内容更改如下。

vim /web/webapp1/index.jsp

(6)启动 Tomcat,浏览器访问 Tomcat2 server, 测试 http://192.168.10.102:8080/

2.2Nginx服务器配置

在nginx服务器上安装nginx,反向代理到两个Tomcat站点,并实现负载均衡

(1)关闭防火墙

systemctl stop firewalld

setenforce 0

(2)安装相关软件包。

dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker

(3)解压并安装 Nginx。

useradd-M-s /sbin/nologin nginx

tar zxf nginx-l.26.3. tar. gz

 cd nginx-l.26.3

./configure  --prefix=/usr/local/nginx  --user=nginx  --group=nginx  --with-http_ssl_module --with-http_v2_module  --with-pcre

make && make install

(4)配置 nginx.conf

vim /usr/local/nginx/conf/nginx.conf

在 http {…}中加入以下代码,设定负载均衡的服务器列表,weight 参数表示权重,权重越高,被分配到的概率越大。为了使测试效果比较明显,我们把权重设置为一样

upstream tomcat server  {

        server 192.168.10.101:8080 weight=1;

        server 192.168.10.102:8080 weight=l;

}

下面是编辑 Nginx 静态页面文件。

 vim /usr/local/nginx/html/index.html

<!DOCTYPE html>
<html>
<head>

<meta http-equiv="content-type"  content="text/html;charset=utf-8”>

<title>静态页面</title>

<style>

body {

width: 35em;

margin:0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;

}

</style>
</head>
<body>
<h1>静态页面</h1>
<p>这是个静态页面</p>
</body>
</html>

//在 http{…}- server{…}中加入 location~.*.jsp${…}动态请求条件规则以及静态图片请求规则。

.......

location ~.*.jsp$ {                          //动态页面正则

      proxy_set_header HOST $host;

      proxy set header X-Real-IP $remote addr;

      proxy set header Client-IP $remote addr;

      proxy set header X-Forwarded-For $proxy add x forwarded for;

      proxy pass http://tomcat server;

}

location ~.*\.(gif jpgljpeg|pnglbmp|swf)$   {                  //静态图片正则

      root /usr/local/nginx/html/img;

      expires 30d;

}

location /  {
      root html;
      index index.html index.htm;

}

......

把 Nginx 的默认站点通过 proxy_pass 方法代理到了设定好的 tomcat_server 负载均衡服务器组上。配置完整的 nginx.conf 文件内容如下。

http  {
…… 
#gzip on;
upstream tomcat_server {
server 192.168.10.101:8080 weight=1;
server 192.168.10.102:8080 weight=1;

}

server {

      listen 80;
      server_name localhost;
      #charset koi8-r;
      #access_log logs/host.access.log main;

      location ~ .*.jsp$ {

            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr,
            proxy_set_header Client-Ip $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_pass http://tomcat_server;

}

location ~ .*\.(gir | jpg | jpeg |png | bmp | swf | css)$ {

      root /usr/local/nginx/html/img;

      expires 30d;

}

location / {
      root html.
      index index.html index.htm;

}

下面在Nginx上准备静态图片

mkdir /usr/local/nginx/html/img //创建静态文件目录

cp /root/logo.jpg /usr/local/nginx/html/img

测试 Nginx 配置文件是否正确。

 /usr/local/nginx/sbin/nginx  -t

启动 Nginx 服务

/usr/local/nginx/sbin/nginx  -c 

查看 Nginx 服务进程

ps aux | grep nginx

nginx 查看端口号及 PID 进程号

netstat -anpt | grep nginx 

2.3测试效果

(1)测试静态页面效果

浏览器访问http://192.168.10.103/,可以看到访问到nginx静态页面

(2)测试负载均衡效果

打开浏览器访问 http://192.168.10.103/index.jsp。不断刷新浏览器测试,可以看到由于权重相同,页面会反复在以下两个页面来回切换。第一次访问,出现 test1 的测试页面,并且能正常加载 nginx 上的静态页面图片,刷新后,第二次访问,出现 test2 的测试页面。

此时负载均衡群集搭建成功,已经可以在两个Tomcat server站点进行切换了

相关文章:

5.Nginx+Tomcat负载均衡群集

Tomcat服务器应用场景&#xff1a;tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;Tomcat虽然和Apache或…...

React项目的状态管理:Redux Toolkit

目录 1、搭建环境 2、Redux Toolkit 包含了什么 3、使用示例 &#xff08;1&#xff09;创建user切片 &#xff08;2&#xff09;合并切片得到store &#xff08;3&#xff09;配置store和使用store 使用js来编写代码&#xff0c;方便理解一些 1、搭建环境 首先&#xf…...

跨界破局者鲁力:用思辨与创新重塑汽车流通行业标杆

来源&#xff1a;投资家 在汽车流通行业深度变革的浪潮中&#xff0c;东莞东风南方汽车销售服务有限公司塘厦分公司总经理鲁力历经近二十年行业深耕&#xff0c;构建了一条从汽车销售顾问到区域运营掌舵者的进阶范本。作为东风日产体系内兼具理论建构与实战穿透力的标杆管理者…...

Druid连接池实现自定义数据库密码加解密功能详解

Druid连接池实现自定义数据库密码加解密功能详解 在企业级应用开发中&#xff0c;数据库密码的明文存储是一个显著的安全隐患。Druid作为阿里巴巴开源的高性能数据库连接池组件&#xff0c;提供了灵活的密码加密与解密功能&#xff0c;允许开发者通过自定义逻辑实现数据库密码…...

OS11.【Linux】vim文本编辑器

目录 1.四种模式 命令模式 几个命令 插入模式 底行模式 一图展示三种模式之间的关系 2.分屏(多文件操作) 3.配置vim的原理 4.脚本一键配置vim CentOS 7 x86_64 其他发行版 5.NeoVim(推荐) vim文本编辑器是一个多模式的编辑器,因此先介绍它的四种模式 附vim的官网:…...

基于SFC的windows系统损坏修复程序

前言 在平时使用Windows操作系统时会遇到很多因为系统文件损坏而出现的错误 例如:系统应用无法打开 系统窗口(例如开始菜单)无法使用 电脑蓝屏或者卡死 是如果想要修复很多人只能想到重装系统。但其实Windows有一个内置的系统文件检查器可以修复此类错误。 原理 SFC命令…...

强化学习基础概念图文版笔记

&#x1f4d8; 强化学习基础概念图文版笔记 1️⃣ 基本框架&#xff1a;Agent 与 Environment &#x1f9e0; 核心角色&#xff1a; Agent&#xff08;智能体&#xff09;&#xff1a;做出决策的“大脑”&#xff0c;根据当前状态选择动作。Environment&#xff08;环境&…...

k8s下离线搭建elasticsearch

前提 已经完成k8s安装 已经完成相关组件如helm的安装 下载es的chart包 如下地址 https://helm.elastic.co/helm/elasticsearch/elasticsearch-版本号.tgz 如6.8.10 https://helm.elastic.co/helm/elasticsearch/elasticsearch-6.8.10.tgz 修改配置 修改value.yaml文件…...

WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验

一、WAF绕过文件上传漏洞 win7&#xff1a;10.0.0.168 思路&#xff1a;要想要绕过WAF&#xff0c;第一步是要根据上传的内容找出来被拦截的原因。对于文件上传有三个可以考虑的点&#xff1a;文件后缀名&#xff0c;文件内容&#xff0c;文件类型。 第二步是根据找出来的拦截原…...

Oracle杀进程注意事项

文章目录 一、哪些后台进程杀死会导致数据库重启二、杀死哪些后台进程会导致数据库关闭三、杀死哪些后台进程对数据库没有影响 一、哪些后台进程杀死会导致数据库重启 CKPT&#xff1a;检查点进程&#xff0c;checkpoint 检查点&#xff0c;检查点事件的责任是&#xff1a;标志…...

Vue 3 弹出式计算器组件(源码 + 教程)

&#x1f9ee; Vue 3 弹出式计算器组件&#xff08;源码 教程&#xff09; &#x1f4cc; 建议收藏 点赞 关注&#xff0c;本组件支持加减乘除、双向绑定、计算过程展示&#xff0c;适用于表单辅助输入场景。 &#x1f527; 一、完整源码&#xff08;复制即用&#xff09; …...

监测预警系统重塑隧道安全新范式

在崇山峻岭的脉络间延伸的隧道&#xff0c;曾是交通安全的薄弱环节。智慧隧道监测预警系统的诞生&#xff0c;正在彻底改变这种被动防御格局&#xff0c;通过数字神经网络的构建&#xff0c;为地下交通动脉注入智能守护基因。 一、安全防控体系的质变升级 1.风险感知维度革命…...

solidity中sar和>>的区别

sar和>>都是右移操作&#xff0c;其区别简而言之前者保留符号位&#xff0c;后者不保留。要解释清楚这个问题&#xff0c;需要从有符号数和无符号数讲起: 有符号数和无符号数 打个比方int8和uint8 uint8&#xff08;无符号 8 位整数&#xff09; 取值范围&#xff1a;…...

ESP32与STM32

ESP32与STM32深度对比&#xff1a;物联网与嵌入式开发的王者之争 一、核心架构对比 1.1 ESP32 - 无线物联网霸主 // 典型双核架构配置 #include "freertos/FreeRTOS.h" #include "freertos/task.h"void app_main() {// 核心0执行无线通信任务xTaskCreat…...

vue在打包的时候能不能固定assets里的js和css文件名称

在 Vue 项目中&#xff08;特别是使用 Vue CLI 构建的项目&#xff09;&#xff0c;打包时生成的 assets 目录下的 .js 和 .css 文件默认会带有哈希值&#xff08;如 app.123abc.js&#xff09;&#xff0c;这是为了缓存优化。但你可以配置固定名称&#xff0c;方法如下&#x…...

用设计模式重新思考(类FSM)验证:从混乱到优雅

在数字设计的世界里&#xff0c;Finite-State Machine&#xff08;FSM&#xff09;就像一个城市的交通信号系统。每个状态都有自己的规则&#xff0c;每个转换都需要精确的条件。而对于验证工程师来说&#xff0c;如何优雅地验证这些状态机&#xff0c;一直是个让人头疼的问题。…...

技巧小结:外部总线访问FPGA寄存器

概述 需求&#xff1a;stm32的fsmc总线挂载fpga&#xff0c;stm32需要访问fpga内部寄存器 1、分散加载文件将变量存放到指定地址即FPGA寄存器地址 sct文件指定变量存储地址&#xff0c;从而可以直接访问外设&#xff0c;&#xff08;28335也可以&#xff0c;不过用的是cmd文件…...

Qt客户端技巧 -- 窗口美化 -- 圆角窗口

不解析&#xff0c;直接给代码例子 利用窗口重绘事件处理函数paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…...

Go语言爬虫系列教程5:HTML解析技术以及第三方库选择

Go语言爬虫系列教程5&#xff1a;HTML解析技术以及第三方库选择 在上一章中&#xff0c;我们使用正则表达式提取网页内容&#xff0c;但这种方法有局限性。对于复杂的HTML结构&#xff0c;我们需要使用专门的HTML解析库。在这一章中&#xff0c;我们将介绍HTML解析技术以及如何…...

理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析

前言 在JavaScript面试中&#xff0c;map和parseInt的组合常常被用作考察候选人对这两个方法理解深度的题目。让我们通过一个简单的例子来深入探讨其中的原理。 问题现象 [1, 2, 3].map(parseInt) // 输出结果是什么&#xff1f;很多人可能会预期输出[1, 2, 3]&#xff0c;但…...

文件上传漏洞深度解析:检测与绕过技术矩阵

文件上传漏洞深度解析&#xff1a;检测与绕过技术矩阵 引言&#xff1a;无处不在的文件上传风险 在当今的Web应用生态系统中&#xff0c;文件上传功能几乎无处不在。从社交媒体分享图片到企业文档管理系统&#xff0c;用户上传文件已成为现代Web应用的核心功能之一。然而&…...

3.2 HarmonyOS NEXT跨设备任务调度与协同实战:算力分配、音视频协同与智能家居联动

HarmonyOS NEXT跨设备任务调度与协同实战&#xff1a;算力分配、音视频协同与智能家居联动 在万物互联的全场景时代&#xff0c;设备间的高效协同是释放分布式系统潜力的关键。HarmonyOS NEXT通过分布式任务调度技术&#xff0c;实现了跨设备算力动态分配与任务无缝流转&#…...

Elasticsearch 海量数据写入与高效文本检索实践指南

Elasticsearch 海量数据写入与高效文本检索实践指南 一、引言 在大数据时代&#xff0c;企业和组织面临着海量数据的存储与检索需求。Elasticsearch&#xff08;以下简称 ES&#xff09;作为一款基于 Lucene 的分布式搜索和分析引擎&#xff0c;凭借其高可扩展性、实时搜索和…...

jenkins集成gitlab发布到远程服务器

jenkins集成gitlab发布到远程服务器 前面我们讲了通过创建maven项目部署在jenkins本地服务器&#xff0c;这次实验我们将部署在远程服务器&#xff0c;再以nginx作为前端项目做一个小小的举例 1、部署nginx服务 [rootweb ~]# docker pull nginx [rootweb ~]# docker images …...

AI问答-vue3+ts+vite:http://www.abc.com:3022/m-abc-pc/#/snow 这样的项目 在服务器怎么部署

为什么记录有子路径项目的部署&#xff0c;因为&#xff0c;通过子路径可以区分项目&#xff0c;那么也就可以实现微前端架构&#xff0c;并且具有独特优势&#xff0c;每个项目都是绝对隔离的。 要将 Vue3 项目&#xff08;如路径为 http://www.abc.com:3022/m-saas-pc/#/sno…...

当主观认知遇上机器逻辑:减少大模型工程化中的“主观性”模糊

一、人类与机器的认知差异 当自动驾驶汽车遇到紧急情况需要做出选择时&#xff0c;人类的决策往往充满矛盾&#xff1a;有人会优先保护儿童和老人&#xff0c;有人坚持"不主动变道"的操作原则。这种差异背后&#xff0c;体现着人类特有的情感判断与价值选择。而机器的…...

会计 - 金融负债和权益工具

一、金融负债和权益工具区分的基本原则 (1)是否存在无条件地避免交付现金或其他金融资产的合同义务 如果企业不能无条件地避免以交付现金或其他金融资产来履行一项合同义务,则该合同义务符合金融负债的义务。 常见的该类合同义务情形包括:- 不能无条件避免的赎回; -强制…...

.net Span类型和Memory类型

.NET 中 Span 类型和 Memory 类型的深度剖析 在 .NET 编程的世界里&#xff0c;高效处理内存是提升程序性能的关键。Span<T> 和 Memory<T> 类型的出现&#xff0c;为开发者提供了强大而灵活的工具&#xff0c;用于高效地访问和操作连续内存区域。今天&#xff0c;…...

Dify工具插件开发和智能体开发全流程

想象一下&#xff0c;你正在开发一个 AI 聊天机器人&#xff0c;想让它能实时搜索 Google、生成图像&#xff0c;甚至自动规划任务&#xff0c;但手动集成这些功能耗时又复杂。Dify 来了&#xff01;这个开源的 AI 应用平台让你轻松开发工具插件和智能体策略插件&#xff0c;快…...

ES6——对象扩展之Set对象

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;Set 对象允许存储任何类型的唯一值&#xff0c;无论是原始值还是对象引用。Set 对象有一些有用的方法&#xff0c;可以操作集合中的数据。以下是一些常用的 Set 对象方法&#xff1a; 方法描述 add 向 Set 对象添加…...