Nginx+Tomcat(负载均衡、动静分离)

目录

一、Nginx概述

1.Nginx应用

二、正向代理和反向代理

1.正向代理

1.1主要作用 

1.2工作原理 

2.反向代理 

2.1主要作用 

2.2工作原理

三、负载均衡模式

1.轮询

2.最少连接数

3.IP 哈希

4.加权轮询

5.最少时间算法

6.一致性哈希

四、规划部署负载均衡和反向代理

1.部署Nginx负载均衡器

1.1安装所需的依赖包

1.2创建Nginx用户

1.3下载并解压Nginx源码

1.4创建软链接

1.5创建Nginx服务文件

1.6设置权限并启动Nginx

2.部署2台Tomcat应用服务器

2.1安装JDK 

2.2配置环境变量

2.3安装并启动Tomcat

3.动静分离配置

3.1Tomcat1服务器配置

3.2Tomcat2服务器配置

4.Nginx服务器配置 

1.准备静态页面和静态图片

2.修改Nginx配置文件

3.测试 


一、Nginx概述

1.Nginx应用

Nginx是一款非常优秀的HTTP服务器软件,广泛应用于大型网站的后端,它支持高达50000 个并发连接,并拥有强大的静态资源处理能力

Nginx的运行非常稳定,系统资源(如内存和 CPU)的消耗也非常低。因此,许多大型网站选择 Nginx 作为反向代理服务器和负载均衡器,以提升整个站点的负载并发能力

二、正向代理和反向代理

1.正向代理

正向代理:

是指代理服务器替客户端访问目标服务器,以加快访问速度或突破访问限制。客户端可以访问代理服务器,而代理服务器再去访问目标服务器,并将返回数据传递给客户端。目标服务器只知道请求来自代理服务器,但不清楚实际客户端的地址,因此正向代理可以隐藏客户端的信息

正向代理的工作原理类似于“跳板”:当用户无法直接访问某个网站时,用户可以先连接到能够访问该网站的代理服务器,由代理服务器代为获取网站内容,再将内容返回给用户。目标网站只能记录代理服务器的访问,而不一定知道是用户的请求,这取决于代理服务器是否向网站透露用户信息

1.1主要作用 

1.隐私保护
隐藏用户 IP 地址:正向代理可以隐藏客户端的真实 IP 地址,对目标服务器只暴露代理服务
器的 IP 地址,从而保护用户的隐私
2.绕过地理限制

访问受限内容:正向代理可以帮助用户访问被地理位置限制或被网络过滤器屏蔽的网站和服
务。例如,用户可以通过代理服务器访问在其所在国家或地区被禁止的网站
3.内容过滤和监控
访问控制:企业或机构可以通过正向代理实施访问控制,限制员工访问特定网站或内容,或
监控用户的上网行为
4.缓存和加速
减少延迟和带宽消耗:正向代理可以缓存请求的内容,减少对原始服务器的重复请求,从而
提高访问速度和减少带宽消耗
5.网络安全
安全隔离:通过将客户端请求通过代理服务器转发,可以减少直接暴露到目标服务器的风
险,提高网络安全性
6.数据压缩和优化
减小数据量:正向代理可以对传输的数据进行压缩,减少数据传输量,从而提高网络效率
7.绕过审查和防火墙
突破网络限制:在一些网络受限的环境中,如学校或工作场所的防火墙,通过正向代理可以
访问被封锁的资源或服务

1.2工作原理 

1.客户端请求
客户端(如浏览器)发出请求,目标是访问互联网资源(例如一个网站)
2.请求发送到正向代理
客户端将请求发送到正向代理服务器,而不是直接发送到目标服务器。此时,客户端的请求
头中会包含代理服务器的地址,而目标服务器并不会直接接收到请求
3.正向代理处理请求
正向代理服务器接收到请求后,会处理请求的相关信息,包括解析目标URL、处理请求头等
4.请求转发到目标服务器
正向代理将请求转发到目标服务器。这时,目标服务器只会看到正向代理服务器的IP地址而无法看到客户端的真实 IP 地址
5.目标服务器响应
目标服务器处理请求,并生成响应数据,然后将响应发送回正向代理服务器
6.响应转发到客户端
正向代理服务器收到来自目标服务器的响应数据,并将其转发给原始的客户端
7.客户端接收响应
客户端从正向代理服务器接收响应数据,并对其进行处理和显示

2.反向代理 

反向代理:

则是代理服务器替服务器端处理客户端请求,通常用于负载均衡。反向代理屏蔽了后端服务器的信息,常用于多台服务器的分布式部署。对于访问量大的网站,反向代理服务器可以根据一定规则将客户端的请求分发到不同的后端服务器,客户端无需知道具体是哪台服务器处理了请求

2.1主要作用 

1.负载均衡
分配请求:反向代理可以将客户端的请求分发到多个后端服务器,从而实现负载均衡。这样
可以提高系统的处理能力和响应速度,避免单一服务器的过载
2.缓存加速
提高性能:反向代理可以缓存常见的响应内容,减少对后端服务器的重复请求,从而提高访
问速度和降低带宽消耗
3. SSL/TLS 终端
处理加密:反向代理可以处理 SSL/TLS 加密和解密(即 HTTPS 终端),将加密处理从后端服务器中剥离,提高后端服务器的性能和安全性
4.安全性增强
隐藏内部结构:反向代理可以隐藏后端服务器的真实 IP 地址和架构,对外只暴露代理服务器
的 IP 地址,从而提高系统的安全性
5.集中管理和监控
统一入口:通过反向代理,可以集中管理和监控所有流量,提供统一的访问日志和流量统
计,简化运维和监控工作
6.内容重写和路由
动态路由:反向代理可以根据请求的 URL、主机名或其他请求信息,动态地将请求路由到不
同的后端服务器或应用,从而支持复杂的应用场景和需求
7.应用层防火墙
增强防护:反向代理可以充当应用层防火墙,过滤恶意请求和攻击,提供额外的安全防护层
8.跨域支持
解决跨域问题:在某些情况下,反向代理可以帮助解决跨域请求问题,使得不同域名的资源
能够在同一个应用中进行交互

2.2工作原理

1.客户端请求发送到反向代理服务器
客户端向某个域名或IP 地址发送请求(例如`www.example.com'),这个地址指向反向代理服务器,而不是实际的后端服务器
2.反向代理服务器接收请求
反向代理服务器接收到客户端的请求,解析该请求,确定需要转发给哪个后端服务器。此
时,客户端并不知道实际的后端服务器的地址
3.反向代理转发请求至后端服务器
反向代理服务器根据配置,将请求转发到适当的后端服务器进行处理。它可以根据不同的策
略(如负载均衡、内容路由等)选择合适的后端服务器
4.后端服务器处理请求并生成响应
后端服务器接收到从反向代理转发的请求后,处理该请求,并生成响应(例如,返回 HTML
页面、API数据等)
5.反向代理接收后端服务器的响应
反向代理服务器接收到后端服务器的响应后,它可以选择缓存这些响应以提高后续的请求速
度,或者对响应内容进行处理(如数据压缩、内容修改等)
6.反向代理将响应返回给客户端
反向代理服务器将处理后的响应返回给客户端。客户端感知到的服务器就是反向代理服务
器,而不是实际处理请求的后端服务器

三、负载均衡模式

1.轮询

轮询算法:

是 Nginx 的默认分流算法。它按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配了流量

数据流向:

每个请求依次被分配到下一个服务器。假设有三台服务器(ServerA、ServerB、ServerC)第一个请求被分配到 Server A,第二个请求分配到 Server B,第三个请求分配到 Server C,第四个请求又回到 Server A,依此类推
特点:

请求均匀分布,无视服务器的当前负载和响应时间

配置示例upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

2.最少连接数

最少连接数算法:

将请求分配给当前活动连接数最少的服务器。这种算法适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载

数据流向:

每个请求被分配到当前连接数最少的服务器。例如,Server A 有 2 个连接,Server B 有 5 个连接,新的请求会被分配到 Server A
特点:

动态均衡负载,适用于请求处理时间不一的场景

配置示例upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

3.IP 哈希

IP 哈希算法:

通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器。适用于需要将特定客户端的请求固定在同一台服务器上的场景

数据流向:

每个客户端的 IP 地址被哈希计算,然后根据哈希值将请求固定分配到某一台服务器。假设客户端 X 的哈希值指向 Server A,客户端 Y 的哈希值指向 Server B,则无论多少次请求,X 的请求总是流向 Server A,Y 的请求总是流向 Server B
特点:

同一个客户端总是被分配到同一台服务器,有助于会话保持

配置示例upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

4.加权轮询

加权轮询算法:

允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。适用于服务器性能不均衡的情况

数据流向:

根据服务器设置的权重值分配请求。假设 Server A 权重为 3,Server B 权重为 1,则 4 个请求中,3 个会被分配到 Server A,1 个会被分配到 Server B
特点:

高权重服务器接收更多的请求,适用于服务器性能差异较大的场景

配置示例upstream backend {server backend1.example.com weight=3;server backend2.example.com weight=1;server backend3.example.com weight=2;
}

5.最少时间算法

最少时间算法:

基于请求的响应时间,将请求分配给响应时间最短的服务器。这种算法适用于需要最大化响应速度的场景,在 Nginx 1.15.3 及以后版本中可用

数据流向:

每个请求分配到响应时间最短或平均连接时间最短的服务器。假设 Server A 的响应时间较快,Server B 较慢,则新的请求更可能流向 Server A
特点:

进一步优化了最少连接算法,适用于高负载环境下的动态负载均衡

配置示例upstream backend {least_time header;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

6.一致性哈希

一致性哈希算法:

可以保证当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配。这在缓存等场景中非常有用

数据流向:

根据请求的某个特定参数(如 URL、Cookie 或其他 Header),进行哈希计算,将请求分配到哈希值对应的服务器。假设 Server A 和 Server B,参数 "foo" 的哈希值指向 Server A,参数 "bar" 的哈希值指向 Server B,则 "foo" 请求总是流向 Server A,"bar" 请求总是流向 Server B
特点:

适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景

配置示例upstream backend {hash $request_uri consistent;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

四、规划部署负载均衡和反向代理

1.部署Nginx负载均衡器

关闭防火墙和临时防护systemctl stop firewalld
setenforce 0

1.1安装所需的依赖包

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

1.2创建Nginx用户

useradd -M -s /sbin/nologin nginxtail -2 /etc/passwd

1.3下载并解压Nginx源码

解压
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/编译安装
cd nginx-1.20.2/./configure --prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-file-aio \--with-http_stub_status_module \--with-http_gzip_static_module \--with-http_flv_module \--with-http_ssl_module \--with-streammake && make install

1.4创建软链接

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

1.5创建Nginx服务文件

vim /lib/systemd/system/nginx.service[Unit]
Description=nginx
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target

1.6设置权限并启动Nginx

chmod 777 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

2.部署2台Tomcat应用服务器

停止防火墙并禁用SELinuxsystemctl stop firewalld
setenforce 0

2.1安装JDK 

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

2.2配置环境变量

vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH加载环境变量
source /etc/profile

2.3安装并启动Tomcat

tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh检查端口
netstat -ntap | grep 8080

3.动静分离配置

3.1Tomcat1服务器配置

创建JSP页面
mkdir /usr/local/tomcat/webapps/testvim /usr/local/tomcat/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>修改server.xml
vim /usr/local/tomcat/conf/server.xml<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
</Host>重启Tomcat服务
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

3.2Tomcat2服务器配置

创建JSP页面
mkdir /usr/local/tomcat/tomcat1/webapps/testvim /usr/local/tomcat/tomcat1/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>修改server.xml
vim /usr/local/tomcat/tomcat1/conf/server.xml<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>重启Tomcat服务
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

4.Nginx服务器配置 

1.准备静态页面和静态图片

echo '<html><body><h1>汪铭是帅哥</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img

2.修改Nginx配置文件

vim /usr/local/nginx/conf/nginx.confhttp {...upstream tomcat_server {server 172.16.58.10:8080 weight=1;server 172.16.58.20:8080 weight=1;server 172.16.58.30:8080 weight=1;}server {listen 80;server_name www.kgc.com;charset utf-8;location ~ .*\.jsp$ {proxy_pass http://tomcat_server;proxy_set_header HOST $host;   proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;}location / {root html;index index.html index.htm;}}...
}

3.测试 

测试静态页面

浏览器访问:http://172.16.58.40

浏览器访问:http://172.16.58.40/game.jpg

测试负载均衡效果

浏览器访问:http://172.16.58.40/index.jsp

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle数据库安装和配置详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Oracle 数据库是全球广泛使用的关系型数据库管理系统 (RDBMS)&#xff0c;提供高性能、可靠性、安全性和可扩展性&#xff0c;广泛应用于企业关键任务系统。下面详细介绍如何在 CentOS 系统上安装和配置 Or…

【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

智能家居环境监测系统设计(论文+源码)

1. 系统方案 系统由9个部分构成&#xff0c;分别是电源模块、烟雾传感器模块、GSM发送短信模块、报警模块、温度传感器模块、人体红外感应模块、按键设置模块、显示模块、MCU模块。各模块的作用如下&#xff1a;电源模块为系统提供电力&#xff1b;烟雾传感器模块检测烟雾浓度&…

[项目实战]EOS多节点部署

文章总览&#xff1a;YuanDaiMa2048博客文章总览 EOS多节点部署 &#xff08;一&#xff09;环境设计&#xff08;二&#xff09;节点配置&#xff08;三&#xff09;区块信息同步&#xff08;四&#xff09;启动节点并验证同步EOS单节点的环境如何配置 &#xff08;一&#xf…

开放系统,面向各类业务需求可提供定制化服务的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

计算机毕业设计 智慧物业服务系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Python数据分析 Pandas库-初步认识

Python数据分析 Pandas库-初步认识 认识Pandas ​ pandas是一个非常实用的Python工具&#xff0c;我们可以把它想象成一个超级强大的表格处理工具&#xff0c;它比Excel更智能&#xff0c;操作更为简单。pands可以从各种文件格式&#xff08;CSV、JSON、SQL、Excel&#xff0…

ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯

IGT-DSER智能网关模块支持西门子、三菱、欧姆龙、罗克韦尔AB等各种品牌的PLC之间通讯&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪表、变频器等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。无需PLC内编程开发&#xff0c;只要在IGT-DSER智…

AI大模型与产品经理:替代与合作的深度剖析

在创业的征途中&#xff0c;产品经理常常被外界以一种半开玩笑的口吻提及&#xff1a;“就差一个程序员了。”这句话背后&#xff0c;既蕴含着对产品经理创意与策略能力的认可&#xff0c;也揭示了技术实现环节对于产品成功不可或缺的重要性。然而&#xff0c;随着AI技术的飞速…

2024年微电子与纳米技术国际研讨会(ICMN 2024) Microelectronics and Nanotechnology

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus大会时间&#xff1a;2024年9月20-22日地点&#xff1a;成都…

Golang数据流处理:掌握Reader和Writer接口的技巧

Golang数据流处理&#xff1a;掌握Reader和Writer接口的技巧 引言理解Reader和Writer接口Reader接口的定义和基本方法Writer接口的定义和基本方法 Reader接口的深入探讨Reader接口的实现示例使用io.Reader读取文件内容从网络连接中读取数据 常用Reader类型及其应用场景strings.…

Selenium打开浏览器后闪退问题解决

笔者这两天在做一个自动化方案&#xff0c;用来优化数据统计。其中一部分数据需要通过云上堡垒机跳转访问&#xff0c;而这个堡垒机在笔者日常使用的火狐浏览器上运行不是很正常&#xff08;表现在有些复制粘贴按钮显示不太灵敏&#xff09;。 但在Edge浏览器上基本正常&#…

Unity3d 以鼠标位置点为中心缩放视角(正交模式下)

思路整理&#xff1a; 缩放前&#xff1a; 缩放后&#xff1a; 记录缩放前鼠标的屏幕坐标 A&#xff0c;计算鼠标位置对应的世界坐标 A_world 缩放完成后&#xff0c;根据当前屏幕下A所对应的世界坐标A1_world 计算A1_world 和 A_world 的偏移量 移动摄像机 代码&#xff…

数据集 wider person 户外密集行人检测 >> DataBall

数据集 wider person 用于野外密集行人检测的多样化数据集 行人检测 目标检测 户外密集行人检测的多样化数据集 WiderPerson: A Diverse Dataset for Dense Pedestrian Detection in the Wild article{zhang2019widerperson, Author {Zhang, Shifeng and Xie, Yiliang and Wa…

TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理

作者&#xff1a; 尚雷5580 原文来源&#xff1a; https://tidb.net/blog/beeb9eaf 注&#xff1a;本文基于 TiDB 官网 董菲老师 《TiDB 数据库核心原理与架构&#xff08;101) 》系列教程之 《Lesson 01 TiDB 数据库架构概述》内容进行整理和补充。 课程链接&#xff1a;…

跟《经济学人》学英文:2024年09月14日这期 Demand for high-end cameras is soaring

Demand for high-end cameras is soaring The ubiquity of smartphones has helped ubiquity: 美 [juːˈbɪkwəti] 到处存在&#xff1b;遍在 注意发音 原文&#xff1a; Buying a Leica feels like buying a piece of art. Made in Germany, the cameras are sold in th…

电容的充放电时间的计算(容性负载的输出建立时间)

本文重点叙述开关电源带容性负载时&#xff0c;电源的输出建立时间&#xff08;对应电容的充电时间&#xff09;和掉电时间&#xff08;对应电容的放电时间&#xff09;。 无论是恒压源还是恒流源&#xff0c;其输出的电流都是可以确定的&#xff0c;因此&#xff0c;电容的充…

高职院校人工智能技术和无人机技术实训室建设方案

一、方案背景与需求分析 1.1 人工智能与无人机技术发展概况 人工智能&#xff08;AI&#xff09;和无人机技术作为当今科技领域的两大热点&#xff0c;正以前所未有的速度发展和渗透到各行各业中。根据国际数据公司(IDC)的报告&#xff0c;全球人工智能市场规模预计将在2024年…

function uuid_generate_v4()不存在

说明&#xff1a;记录一次使用postgresql函数错误&#xff0c;如下&#xff1a; 项目中的一个SQL用到了uuid_generate_v4()函数生成uuid作为记录的主键&#xff0c;结果报上面这个错误&#xff1b; 分析&排查 首先&#xff0c;我连接上了数据库&#xff0c;在数据库里敲下…

【JavaScript】数据结构之字典 哈希表

字典 键值对存储的&#xff0c;类似于js的对象&#xff0c;但在js对象中键[key]都是字符串类型或者会转换成字符串类型&#xff0c;因此后声明的键值会覆盖之前声明的值。字典以map表示&#xff0c;map的键不会转换类型。 let map new Map() map.set(a, 1) map.set(b, 2) ma…