代理模式

187 阅读4分钟

1.计算机网络层面的代理

正向代理

是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

例子:科学上网

小明想要访问某国外网站,该网站无法在国内直接访问,但是小明可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,小明对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给小明。这个上网的过程就是用到了正向代理。

使用说明

1.PC无法直接访问web服务器,但是代理服务器可以访问

2.代理服务器帮助PC请求页面并缓存到本地,并将页面返回给PC

注释:PC只需要浏览器设置代理服务器IP和端口即可,PC知道代理服务器和WEB服务器的存在

在通过正向代理服务器的时候,目标服务器是不知道真正的客户端是谁的,只知道是代理服务器在发送请求。

用途

突破访问限制 通过代理服务器,可以突破自身IP访问限制,访问国外网站,教育网等。

提高访问速度 通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。

隐藏客户端真实IP 上网者也可以通过这种方法隐藏自己的IP,免受攻击。

反向代理

是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

例子:

就是我们在Web开发中用到的负载均衡服务器,客户端发送请求到负载均衡服务器上,负载均衡服务器再把请求转发给一台真正的服务器来执行,再把执行结果返回给客户端。

使用说明

1.PC访问web服务,并不知道访问的是代理服务器,PC以为代理服务器就是web服务器。

2.代理服务器将web服务器页面缓存到本地,当PC访问时直接反馈给PC页面

注释:PC浏览器不需要做任何设置,PC访问代理服务器就等于访问web,pc并不知道真实web服务器的存在

用途

隐藏服务器真实IP 使用反向代理,可以对客户端隐藏服务器的IP地址。

负载均衡 反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。

提高访问速度 反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。

提供安全保障 反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。

2.java中的代理

静态代理

被代理对象

public interface HelloSerivice {
    public void say();
}

public class HelloSeriviceImpl implements HelloSerivice{

    @Override
    public void say() {
        System.out.println("hello world");
    }
}

代理类

public class HelloSeriviceProxy implements HelloSerivice{

    private HelloSerivice target;
    public HelloSeriviceProxy(HelloSerivice target) {
        this.target = target;
    }

    @Override
    public void say() {
        System.out.println("记录日志");
        target.say();
        System.out.println("清理数据");
    }
}

测试类

public class Main {
    @Test
    public void testProxy(){
        //目标对象
        HelloSerivice target = new HelloSeriviceImpl();
        //代理对象
        HelloSeriviceProxy proxy = new HelloSeriviceProxy(target);
        proxy.say();
    }
}

// 记录日志
// hello world
// 清理数据

这就是一个简单的静态的代理模式的实现。代理模式中的所有角色(代理对象、目标对象、目标对象的接口)等都是在编译期就确定好的。

静态代理的用途

控制真实对象的访问权限 通过代理对象控制对真实对象的使用权限。

避免创建大对象 通过使用一个代理小对象来代表一个真实的大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。

增强真实对象的功能 这个比较简单,通过代理可以在调用真实对象的方法的前后增加额外功能。