您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

我们一起聊聊什么是正向代理和反向代理

时间:2024-03-26 11:41:55  来源:微信公众号  作者:萤火架构

从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。

代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替我们完成某些任务。在技术领域,这个概念也被广泛应用,尤其是在计算机网络通信和程序设计中,代理扮演着相当重要的角色,涉及控制访问、安全保护、能力扩展等复杂而强大的方面。

网络通信中的代理

在计算机网络中,说到代理,经常会谈到正向代理和反向代理的概念。

在详细展开前,我们先使用一个比喻来形象的理解下这两个概念:小明去饭馆吃饭,正向代理就像是小明的朋友帮他去点餐,服务员并不知道最终吃饭的人是小明;而反向代理则像是饭馆的服务员,他们决定把小明的订单送到哪个厨师手里去做。通过这个比喻,我们可以初步感受到正向代理和反向代理在角色和功能上的不同。

搞清楚网络通信中的代理和反向代理,大家只要弄明白两件事:你在公司的电脑是怎么访问到外网的,你部署的网站或者API又是怎么被外网访问到的。

公司电脑上网

首先看公司电脑上网:公司里的电脑一般不会直接连接到互联网,它们通常在一个内网环境中,这既有成本的考虑,也有安全控制的需要。办公电脑一般会先连接到交换机,交换机再连接到路由器,路由器再连接到互联网。

在这些连接中,交换机只是一个小透明,办公电脑可以看到路由器,路由器也可以看到办公电脑,所以交换机不是我们这里所说的代理。

这里真正的代理是路由器,办公电脑访问网络时,请求先到达路由器,路由器做个请求来源的登记,记下这个请求是从哪台电脑发出的,然后再发到互联网上。请求出了路由器,互联网上能够看到的就是这个路由器,而看不到你的办公电脑。数据从远程服务器返回时,也是先到达这个路由器,路由器再根据之前做的请求来源登记,将数据转发到对应的办公电脑上。

这种场景下,路由器就是一个正向代理,代理内网电脑访问互联网。

图片图片

除了使用路由器这种比较常见的代理方式,其实还有很多方式,比如在浏览器中配置HTTP代理,只允许通过浏览器访问外网。

网站被外网访问

再看网站或者API是怎么被外网访问到的:通常情况下,大家的服务器也是放在内网中的,直接暴露在互联网上会有安全风险,也不利于管理。所以,我们会在服务器和互联网之间设置一个代理服务器,通常是Nginx或者LVS这种负载均衡器。当外网的用户想要访问你的网站或API时,他们的请求首先会发送到这个代理服务器上。

这个代理服务器就是一个反向代理。

图片图片

反向代理服务器接到请求后,它知道内网中哪台服务器能提供这个服务,于是它就把请求转发给对应的服务器。服务器处理完这个请求后,再把结果发送回反向代理服务器,最后由反向代理服务器返回给外网的用户。

对比

以上就是计算机网络中正向代理和反向代理的基本原理和应用场景,我们再做一个对比,加深印象。

正向代理和反向代理的区别主要体现在它们服务的对象和用途上:

对比项

正向代理(Forward Proxy)

反向代理(Reverse Proxy)

服务对象

客户端

服务器

主要用途

- 帮助客户端访问无法直接访问的资源

- 进行访问控制和缓存以提高速度和安全性

- 隐藏服务器真实IP地址

- 提供负载均衡功能

- 提高服务器访问速度和安全性

工作方式

- 客户端配置代理服务器,请求先发送至代理服务器

- 代理服务器代为访问目标服务器并返回资源给客户端

- 客户端请求发送至反向代理服务器

- 反向代理服务器根据配置转发请求到内部网络的特定服务器

- 从服务器获取响应后返回给客户端

举例说明

- 使用浏览器设置代理服务器,所有上网请求经由代理服务器访问互联网资源

- 根据负载均衡策略将用户请求分发到不同服务器处理

简单来说,正向代理是客户端的代理,帮助客户端访问到无法直接获取的资源;反向代理是服务器的代理,帮助服务器平滑处理来自各方的请求。

程序设计中的代理

在程序设计中,也有一个代理模式,虽然和网络中的正向代理或反向代理的概念不完全一样,但本质上它们都是代理的概念,都是作为中介提供隔离、隐藏、控制访问和功能增强等作用。

Just show me the code! 现在我们用Go来编写一个代理的实例程序,假设我们有一个资源类,我们希望在访问这个资源时,记录访问次数,并在资源不再被引用时自动释放资源。

首先,定义一个资源接口Resource和实现这个接口的资源类MyResource:

package mAIn

import (
    "fmt"
)

// Resource 接口定义了资源需要实现的方法
type Resource interface {
    Use()
    Release()
}

// MyResource 是实现了Resource接口的资源类
type MyResource struct{}

func (r *MyResource) Use() {
    fmt.Println("Using MyResource")
}

func (r *MyResource) Release() {
    fmt.Println("Releasing MyResource")
}

然后,定义一个代理的类 ResourceProxy,它包含了对资源的引用和引用计数,同时它也实现了Resource接口。

// ResourceProxy 是代理的结构体,包含资源和引用计数
type ResourceProxy struct {
    resource Resource
    refCount int
}

// NewResourceProxy 是ResourceProxy的构造函数
func NewResourceProxy(resource Resource) *ResourceProxy {
    return &ResourceProxy{resource: resource, refCount: 1} // 初始引用计数为1
}

// Use 方法增加引用计数并使用资源
func (sr *ResourceProxy) Use() {
    sr.refCount++
    fmt.Printf("Resource is used %d timesn", sr.refCount)
    sr.resource.Use()
}

// Release 方法减少引用计数,当计数为0时释放资源
func (sr *ResourceProxy) Release() {
    sr.refCount--
    if sr.refCount == 0 {
        sr.resource.Release()
    } else {
        fmt.Printf("Resource is still used by %d referencesn", sr.refCount)
    }
}

最后我们使用这个代理:

func main() {
    resource := &MyResource{}
    proxyRef := NewResourceProxy(resource)

    proxyRef.Use() // 使用资源,引用计数增加
    proxyRef.Release() // 释放一次引用,引用计数减少到0,资源被释放

    // Output:
    // Resource is used 1 times
    // Using MyResource
    // Releasing MyResource
}

这个简单的例子演示了代理在资源管理中的应用,可以根据实际需要添加更多复杂的逻辑,比如错误处理、同步控制、日志记录等。

在程序设计中,代理模式是一种结构型设计模式,它让我们能提供一个替代品来代表另一个对象,这个替代品控制着对原对象的访问,可以在访问原对象前后进行一些额外处理。

通过上边的示例,我们可以发现代理模式的三个主要角色:

  • 抽象主题(Subject):定义了代理和真实主题的共用接口,这样在任何使用真实主题的地方都可以使用代理。
  • 真实主题(Real Subject):实现了抽象主题的具体类,代表了实际的对象,是最终要使用的对象。
  • 代理(Proxy):包含对真实主题的引用,控制着对真实主题的访问,并可能负责创建和删除它。通常会做一些额外的事情来实现自己的价值。

在代码实际实现时,代理模式其实有多种不同的实现,包括:

  • 远程代理(Remote Proxy):为一个对象在不同的地址空间(通常是不同计算机上的服务)提供局部代表。常见的如RPC、gRPC等,通过本地代理对象,客户端可以像调用本地接口一样访问远程服务,而无需关心网络通信的细节。
  • 虚拟代理(Virtual Proxy):通过它来存放实例化需要很长时间的真实对象。常见的就是懒加载,比如加载一个大文件或者从数据库中读取大量数据,我们不希望在程序启动时就立刻加载,而是希望在真正需要这些数据的时候才去加载它们。
  • 保护代理(Protection Proxy):控制对原始对象的访问。用于对象应该有不同访问权限的时候。
  • 智能引用(Smart Reference):当对象被引用时,提供一些额外的操作,比如计算对象被引用的次数。上边提供的代码示例就是一个智能引用的例子。

这里就不展示更多的代码了,关键是在合适的时机使用恰当的代理模式来解决问题,这需要细细体会。

做个简单的小结,代理模式就像程序中的一个“中间人”,在不需要直接访问某个对象,或者直接访问某个对象不太方便或者不符合需求时,代理模式提供了一个非常灵活的解决方案。

正如本文所探讨的,代理模式在网络通信和程序设计中都扮演着重要的角色。它通过提供一个中间层,增强了系统的安全性、灵活性和可维护性。掌握代理,我们就拥有了在合适的场景下解决问题的一种强大能力。希望本文的讨论能对你有一点用处。



Tags:正向代理   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  Search: 正向代理  点击:(10)  评论:(0)  加入收藏
正向代理和反向代理
在日常工作中,我们经常会听到代理和反向代理这两个词,那么,什么是代理?什么又是反向代理?为什么有了代理还需要反向代理?他们之间有什么差异?今天我们就来一起聊一聊。一、定义 在...【详细内容】
2023-08-06  Search: 正向代理  点击:(153)  评论:(0)  加入收藏
nginx--正向代理、反向代理及负载均衡
什么是nginx?总结送学习资料(包含视频、技术学习路线图谱、文档等)Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器…除了反向代理,nginx还支持正向代理、负载均...【详细内容】
2022-07-20  Search: 正向代理  点击:(428)  评论:(0)  加入收藏
一文搞懂正向代理和反向代理
▶ 什么是代理定义:代理的英文单词为proxy,其实就是一个中介,充当部件A与部件B的桥梁。如果把代理中介定义为P,则有如下模型:代理模型分类: 正向代理(forward proxy) 反向代理(revers...【详细内容】
2021-11-24  Search: 正向代理  点击:(301)  评论:(0)  加入收藏
Nginx正向代理配置
一、nginx正向代理介绍及配置(需要在客户端配置代理服务器进行指定网站访问)#模块 ngx_http_proxy_module: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy...【详细内容】
2021-08-16  Search: 正向代理  点击:(494)  评论:(0)  加入收藏
正向代理与反向代理
前几天,智象科技的运维工程师在工作实施中遇到了一个因为代理产生的问题,所以去重新温习了一下正向代理与反向代理的原理与区别,在此给大家分享一下。 正向代理(FORWARD PROXY)...【详细内容】
2021-03-05  Search: 正向代理  点击:(345)  评论:(0)  加入收藏
五分钟9步搞定nginx正向代理配置
nginx在绝大数的场景中我们使用其用于做web中间件或反向代理使用,但是nginx实际上也提供了正向代理的功能。下面我们来进行nginx正向代理配置操作,以便大家能够掌握nginx正向代理配置方法。...【详细内容】
2021-01-18  Search: 正向代理  点击:(413)  评论:(0)  加入收藏
理解什么是正向代理?反向代理?
这篇文章想跟大家再进一步分享一下,我对反向代理及负载均衡的理解。 什么是正向代理,什么是反向代理?首先“反向代理”是相对于“正向代理”而言的,有朋友会问这个反向代理到底...【详细内容】
2020-04-20  Search: 正向代理  点击:(393)  评论:(0)  加入收藏
nginx使用学习之正向代理、反向代理、负载均衡
正向代理Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访...【详细内容】
2019-12-09  Search: 正向代理  点击:(418)  评论:(0)  加入收藏
快速了解正向代理与反向代理
正向代理正向代理是作用在用户端的。比如访问某些国外网站,可能需要购买vpn,并且vpn是在用户浏览器端设置的(并不是在远端的服务器设置)。浏览器先访问vpn地址,vpn地址转发请求...【详细内容】
2019-08-26  Search: 正向代理  点击:(849)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(5)  评论:(0)  加入收藏
站内最新
站内热门
站内头条