什么是正向代理和反向代理?

news2024/9/21 19:36:44

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

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

网络通信中的代理

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

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

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

公司电脑上网

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

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

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

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

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

网站被外网访问

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

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

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

对比

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

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

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

程序设计中的代理

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

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 times\n", 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 references\n", 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):当对象被引用时,提供一些额外的操作,比如计算对象被引用的次数。上边提供的代码示例就是一个智能引用的例子。

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

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

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

文章转载自:萤火架构

原文链接:https://www.cnblogs.com/bossma/p/18095781

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

官宣子品牌艾荷,坚定数字化赋能,鸿雁2024新春发布会助推40多年央企品牌焕新升级

3月25日,一场以“春江水暖雁先飞”为主题的2024鸿雁电器智能物联战略及新品发布会在杭州盛大召开。鸿雁电器总裁王米成、副总裁吴明、副总裁夏晓衍、市场部总经理梁彩雷、五金水暖渠道部总经理刘亮、灯饰与智能家居渠道部总经理王育炳等公司领导出席,以及…

SpringMvc之映射器HandlerMapping

简介 在springmvc的处理流程中,第一步就是查询请求对应的映射器,然后组装成处理器链处理请求,本文意在梳理该过程 重要实现 HandlerMapping是一个接口,该接口用于通过HttpServletRequest寻找对应的处理器,接口介绍如下…

super的使用细节

1、super的使用细节 2、super和this的比较

Git_.gitignore文件相关知识

.gitignore 作用:指明不对哪些文件进行版本控制。 应当忽略哪些文件? 系统或软件自动生成的文件编译时产生的中间文件和结果文件运行时产生的日志文件,临时文件和缓存文件涉及身份,密码,口令,秘钥等敏感…

Spring Boot | SpringBoo“开发入门“

目录 : 1.SpringBoot的“介绍”SpringBoot”概述” :SpringBoot”简介“SpringBoot的“优点” 2. SpringBoot入门程序环境准备使用 “Maven”方式构建SpringBoot 项目使用“Spring Initializr”方式构建Spring Boot 项目 3. “单元测试” 和“热部署”单元测试热部署…

银行单元化架构体系介绍

1.背景 自2018年以来,受“华为、中兴事件”影响,我国科技受制于人的现状对国家稳定和经济发展都提出了严峻考验。目前我国IT架构体系严重依赖国外产品,金融行业尤其明显。大部分传统银行的关键账务系统都架设在IBM的大型机、小型机之上&…

EPSON的实时时钟模块RX8010SJ丰富的定时功能及超低功耗特性

温控器是用于控制温度的设备,目前市面上的温控器用于控制地暖空调、热水器、中央新风系统等设备。随着智能家居理念深入人心,人们也期望温控器不仅能控得"准”,还能控得“智能”。为了实现智能控制,温控器一般需要实时时钟模…

【Vue 页面+flex布局 】一行内显示4个元素,超出4个换行,每一行的最后一个去掉marginRight属性

问题 一行展示4个,每个元素之间的margin-right 为20px,导致最右侧没有和上面的输入框对齐 实现效果 修改 正确思路: 一行展示4个,前三个元素之间的margin-right 为20px,最后一个元素margin-right 设置为 0px 代码 …

【198】Java8编写Main程序场景下引入log4j2的例子

场景 有些情况下,需要程序员编写非服务器程序,或者编写不使用 Springboot 框架的程序。这个时候如果需要生成日志,就要采用本文的方法来引入 log4j2 。本文的例子还涉及了在程序打包的时候,如何处理依赖jar包的问题。 例子 下面…

钢结构行业的MES需求特点解析

导 读 ( 文/ 973 ) 钢结构行业作为重要的建筑材料供应商和施工服务提供商,对于生产过程的高效管理和质量控制有着严格要求。其中制造执行系统(MES)在钢结构行业中扮演着关键的角色。本文将探讨钢结构行业中MES的需求特点,包括…

sdrangel下载与部署for windows

下载 https://github.com/f4exb/sdrangel 在其目录下新建build文件 部署 打开cmake软件,修改如下 点击下面Configure,选择对应vs版本 点击finish,按照提示报错信息配置即可 ARCH_OPT=SSE4_2 DEBUG_OUTPUT

数据库事务补充和存储引擎

一、数据库事物补充 1.1 事务之间的相互影响 1.2 Mysql事务隔离级别 1.2.1 read uncommitted 1.2.2 read committed 1.2.3 repeatable read(重读读取) 1.2.4 serializable(串行化) 1.3 事务的作用范围 1.3.1 查询全局事务…

智慧医疗包括哪些方面?智慧医疗发展前景如何?

近年来,随着云计算、物联网(internet of things,IOT)、移动互联网、大数据、人工智能(artificial intelligence,AI)、5G网络、区块链等新一代信息技术的逐步成熟和广泛应用,信息化已…

设计模式之工厂方法模式精讲

工厂方法模式又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。 工厂模式可以分为简单工厂…

【哈希专题】【蓝桥杯备考训练】:星空之夜、模拟散列表、字符串哈希、四平方和、扫雷【已更新完成】

目录 1、星空之夜(usaco training 5.1) 2、模拟散列表(模板) 3、字符串哈希(模板) 4、四平方和(第七届蓝桥杯省赛C A组/B组 & JAVA B组/C组) 5、扫雷(Google Ki…

【学习】软件测试行业未来的发展趋势预测

近年来,随着中国数字经济的蓬勃发展,软件测试行业也迎来了新的春天。从早期的手工测试到自动化测试,再到持续集成和持续交付,中国的软件测试行业经历了快速的发展和变革。各行各业均对软件测试提出了更高的要求,尤其在…

基于java+springboot+vue实现的大学生二手物品交易商城(文末源码+Lw+ppt)23-329

摘 要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这…

暴雨讲堂:AI时代第五代英特尔CPU能做什么?

如果把科技圈比作娱乐圈,那么这两年的顶流一定是AI。2023年,世人见证了ChatGPT在全球范围内的大火,以生成式AI为代表的新一轮人工智能应用问世,改变了人工智能(AI)技术与应用的发展轨迹,并开始在…

展馆人数统计显示屏的功能分析

展馆人数统计显示屏是展览馆、博物馆、商场等公共场所常见的一种设备,它能够实时显示当前场馆内的人数信息,为管理者和游客提供重要参考。展馆人数统计显示屏的功能分析是对这一设备的作用、特点和优势进行深入剖析,有助于更好地了解其在实际…

音视频处理 - 音频概念详解,码率,采样率,位深度,声道,编码

1. 音频采样 与视频不同,音频的最小单位不是一帧,而是一个采样。 采样是当前一刻声音的声音样本,样本需要经过数字转换才能存储为样本数据。 真实声音是连续的,但是在计算机中,声音是离散且均匀的声音样本。 2. 位深…