在互联网中,有一种特殊的网络服务,叫做代理(
Proxy
),也称网络代理。它是指一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。代理可以起到中介的作用,实现不同的目的和功能。根据代理的方向和对象,可以分为正向代理和反向代理两种模式。本文将介绍这两种模式的区别和应用,并给出一些常见的实现方式和代码示例。
在学习正向代理和反向代理之前,要先了解什么是代理?
你可以把代理想象成一个中间人,它可以帮助你和别人进行沟通。
比如,你想和一个外国人聊天,但是你不会说外语,那么你就可以找一个会说外语的翻译来做你的代理,让他把你想说的话翻译给对方听,然后再把对方说的话翻译给你听。
这样,你就可以和外国人聊天了,而且对方也不知道你是谁,只知道你的代理是谁。
在互联网中,代理也是类似的作用。比如,你想访问一个网站,但是这个网站不让你进,或者进去了也很慢,那么你就可以找一个能访问这个网站的代理服务器来帮你。
你把你想访问的网址告诉代理服务器,然后代理服务器去访问这个网站,并把网站的内容传回给你。这样,你就可以看到这个网站了,而且这个网站也不知道你是谁,只知道代理服务器是谁。
下面是一个互联网中使用代理的示例图:
正向代理和反向代理是两种常见的代理模式,它们都可以在客户端和服务器之间起到中介的作用,但是它们的目的和实现方式有所不同。
正向代理是指客户端通过代理服务器来访问目标服务器,代理服务器对客户端是透明的,目标服务器对客户端是不可见的。
正向代理的作用有:
正向代理的实现方式有:
正向代理的示意图如下:
正向代理的代码示例(使用node.js
):
js// 引入http模块
const http = require('http');
// 创建一个正向代理服务器
const proxy = http.createServer((req, res) => {
// 解析客户端请求的目标地址
const targetUrl = new URL(req.url);
// 创建一个目标请求选项对象
const options = {
hostname: targetUrl.hostname,
port: targetUrl.port || 80,
path: targetUrl.pathname,
method: req.method,
headers: req.headers
};
// 向目标服务器发起请求
const targetReq = http.request(options, (targetRes) => {
// 将目标服务器的响应头复制给客户端
res.writeHead(targetRes.statusCode, targetRes.headers);
// 将目标服务器的响应数据转发给客户端
targetRes.pipe(res);
});
// 监听目标请求的错误事件
targetReq.on('error', (err) => {
// 返回一个500错误给客户端
res.writeHead(500);
res.end(err.message);
});
// 将客户端的请求数据转发给目标服务器
req.pipe(targetReq);
});
// 监听8080端口
proxy.listen(8080, () => {
console.log('正向代理服务器启动在8080端口');
});
反向代理是指客户端通过代理服务器来访问目标服务器,代理服务器对客户端是不透明的,目标服务器对客户端是可见的。
反向代理的作用有:
反向代理的实现方式有:
反向代理的示意图如下:
反向代理的代码示例(使用node.js
和express
):
js// 引入express模块
const express = require('express');
// 引入http-proxy-middleware模块
const { createProxyMiddleware } = require('http-proxy-middleware');
// 创建一个反向代理服务器
const proxy = express();
// 定义一个后端服务器列表
const servers = [
'http://localhost:3000',
'http://localhost:3001',
'http://localhost:3002'
];
// 定义一个负载均衡策略,轮询法
let i = 0;
const balance = () => {
const target = servers[i];
i = (i + 1) % servers.length;
return target;
};
// 使用中间件将所有请求转发到后端服务器
proxy.use('/', createProxyMiddleware({
target: balance, // 动态获取目标地址
changeOrigin: true, // 修改请求头中的host为目标地址的host
}));
// 监听8080端口
proxy.listen(8080, () => {
console.log('反向代理服务器启动在8080端口');
});
正向代理和反向代理都是代理模式的一种,它们的区别在于:
希望这篇博文能够帮助你了解代理服务器的两种模式:正向代理和反向代理,并学会一些常见的实现方式和代码示例。
本文作者:CreatorRay
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!