代理模式

Spring AOP动态代理介绍,解决Spring Boot中无法正常启用JDK动态代理的问题

别来无恙 提交于 2019-11-29 00:54:34
Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理。 JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例。 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类。 JDK动态代理具体实现原理: 通过实现 InvocationHandlet 接口创建自己的调用处理器; 通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理; 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型; 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入; CGLib动态代理 CGLib 全称 Code Generation Library ,是一个强大的高性能字节码生成类库,可以实现运行期动态扩展Java类。 Spring在运行期采用CGLib的字节码技术为类创建一个子类,并在子类中拦截所有父类方法的调用,织入横切逻辑实现AOP面向切面编程。 注意事项 如果被代理的对象实现了接口,那么Spring默认会使用JDK动态代理,否则会强制使用CGLib实现动态代理(如果被代理的类被final关键字所修饰,那么代理会失败) 关于两者的性能,JDK动态代理所创建的代理对象

RPC框架调用过程详解

ⅰ亾dé卋堺 提交于 2019-11-29 00:45:31
RPC框架调用过程详解 2017年09月16日 21:14:08 荷叶清泉 阅读数 6275 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/heyeqingquan/article/details/78006587 RPC是远程调用过程的简写,是一个协议,处于网络通信协议的第五层:会话层,其下就是TCP/IP协议,在建立在其基础上的通信会话协议。RPC定义了交互的模式,而应用程序使用这些模式,来访问其他服务器的方法,并不需要关系具体的网络上的细节。 一、RPC基础知识 1.RPC模式 RPC采用C/S模式,客户端发送请求,服务端响应。 基于底层的协议,比如TCP/IP模式。 2.设计目的 ①通过固定的协议,调用非本机的方法 ②实现不同程序语言之间的通信 ③不需要了解底层协议,像本地方法一样调。它完全封装了网络传输,以及其他细节。 二、RPC过程详解 图一 RPC调用过程 从RPC的角度看,应该有服务的提供方,即生产者;还有服务的调用方,即消费者。 对消费者来时,在RPC调用过程中,使用第1步、第2步、第3步、第4步是透明的,其他的都是使用RPC框架去封装这些事情。当应用开始调用PRC的方式时,就会去容器中去取Bean对象,所以我们应该首先注册Bean对象到容器中

10.Nginx反向代理

六眼飞鱼酱① 提交于 2019-11-29 00:35:11
1. Nginx代理服务基本概述 1.1 什么是代理 代理一词往往并不陌生, 该服务我们常常用到如(代理理财、代理租房、代理收货等等),如下图所示 1.2 没有代理情景 在没有代理模式的情况下,客户端和Nginx服务端,都是客户端直接请求服务端,服务端直接响应客户端。 1.3 企业场景 那么在互联网请求里面,客户端往往无法直接向服务端发起请求,那么就需要用到代理服务,来实现客户端和服务通信,如下图所示 2. Nginx代理服务常见模式 Nginx作为代理服务,按照应用场景模式进行总结,代理分为正向代理、反向代理 2.1 正向代理 正向代理,(内部上网)客户端<—>代理->服务端 2.2 反向代理 反向代理,用于公司集群架构中,客户端->代理<—>服务端 2.3 正向代理与反向代理的区别 1.区别在于形式上服务的”对象”不一样 2.正向代理代理的对象是客户端,为客户端服务 3.反向代理代理的对象是服务端,为服务端服务 3. Nginx代理服务支持协议 Nginx作为代理服务,可支持的代理协议非常的多,具体如下图 3.1 反向代理使用协议 如果将Nginx作为反向代理服务,常常会用到如下几种代理协议,如下图所示 模块总结 反向代理模式与Nginx代理模块总结如表格所示 反向代理模式 Nginx配置模块 http、websocket、https ngx_http_proxy_module

WebMagic使用代理ip爬数据解决HTTP407问题

风流意气都作罢 提交于 2019-11-29 00:11:12
手头一个小活儿是爬竞品网站数据。使用webmagic来实现。光公司ip不行,被封了就会影响业务正常访问。刚好公司另一个项目购买了代理IP资源“站大爷”,那个项目夭折了,于是申请借来用用。 调通站大爷提供的获取代理ip的api接口并没什么技术难度。可是,在运行爬数据程序时,收到http的407错误。经了解,407是授权错误,要求代理身份验证。站大爷技术支持提醒说检查一下产品配置。发现“一手私密代理”里当前授权模式是“用户名+密码”。然后,再看webmagic的Proxy类,有一个构造器是除了必传的ip、端口外,还可以传用户名和密码。那就是它了。改正以后,测试ok。 webmagic使用代理IP实现爬虫的部分代码: Request request = new Request("https://www.xxx.com/a/b"); request.setMethod("POST"); try { request.addHeader("Proxy-Authorization","Basic "+ Base64.getEncoder().encodeToString("201904301322525245:45000349".getBytes("utf-8"))); request.addHeader("Authorization","Basic "+ Base64.getEncoder()

[转]Maven 全局配置文件settings.xml详解

痞子三分冷 提交于 2019-11-28 23:56:45
原文地址:https://www.jianshu.com/p/110d897a5442 概要 settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径。 Paste_Image.png settings.xml文件是干什么的,为什么要配置它呢? 从settings.xml的文件名就可以看出,它是用来设置maven参数的配置文件。并且, settings.xml是maven的全局配置文件 。而pom.xml文件是所在项目的局部配置。 Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。 settings.xml文件位置 settings.xml文件一般存在于两个位置: 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置。${user.home} 和和所有其他系统属性只能在3.0+版本上使用。请注意windows和Linux使用变量的区别。 配置优先级 需要注意的是: 局部配置优先于全局配置 。 配置优先级从高到低:pom.xml> user settings > global settings 如果这些文件同时存在,在应用配置时,会合并它们的内容

java的动态代理机制详解

一曲冷凌霜 提交于 2019-11-28 22:58:30
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾。 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler: InvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of

java 动态代理—— 拦截器链基本实现

牧云@^-^@ 提交于 2019-11-28 22:42:03
1.摘要   Mybaties 中有个分页插件,之前有特意的去了解了一下原理 : https://www.cnblogs.com/jonrain0625/p/11168247.html ,从了解中得知分页插件是基于Mybaties的拦截器去实现的,这个插件就是一个拦截器,别的拦截器组成了Mybaties的拦截器链,然后所有的拦截器都对Executor 这个类 做了动态代理。本次主要的再次去学习下这个动态代理,去实现一个最基本的拦截器链的效果。当然还有spring aop 等很多地方都是基于动态代理去实现的,关于Aop可以在 : https://www.cnblogs.com/lcngu/p/5339555.html 去了解。本次也是基于这篇文章,及代码去学习和实现 拦截器链。 2.java动态代理   java中代理模式分静态代理和动态代理,而动态代理的实现有两种实现方法,一种是基于JDK 用 接口方法去实现 ,一种是基于CGLIB 基于类去实现 ,了解可以看: https://www.cnblogs.com/rinack/p/7742682.html 。   2.1 JDK 代理的基本使用:     1.代理类的接口     2.实现代理类执行的接口 InvocationHandler     3.创建代理:Proxy.newProxyInstance(loader,

Http协议与TCP协议简单理解

谁都会走 提交于 2019-11-28 22:11:38
  TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。   随着时间的推移,html页面变得复杂了,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次tcp连接就显得低效了。因此Keep-Alive被提出用来解决效率低的问题。从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。虽然这里使用TCP连接保持了一段时间

企业服务总线项目集成标准

一笑奈何 提交于 2019-11-28 21:15:34
1 概述   企业服务总线(Enterprise Service Bus,缩写 ESB),是SOA面向服务架构的骨干,在完成服务的接入、服务间的通信和交互基础上,提供安全性、可靠性、 高性能的服务能力保障。采用 SOA 架构,基于ESB总线进行企业异构应用集成,可以有效降低应用系统、各个组件及相关技术的耦合度,消除应用系统点对点集成瓶颈,降低集成开发难度,提高复用,增进系统开发和运行效率,便于业务系统灵活重构、敏捷适应业务及流程变化。   本文对企业服务总线ESB集成项目中,基于AEAI ESB实现异构系统集成的相关规范、标准进行阐述、明确,为项目开展以及后续完善扩展提供技术参考和依据。 2 功能特点   AEAI ESB作为数通畅联公司的企业应用集成产品,主要用来实现异构系统(如:不同的数据库、消息中间件、ERP或CRM等)之间的资源整合,实现互连互通、数据共享、业务流程协调统一等功能,构建灵活可扩展的分布式企业应用。   相比传统的企业应用集成软件平台,AEAI ESB是一个全新的符合SOA架构的应用服务整合平台,是基于大量集成实践经验不断完善、用于构建可管理、可扩展及经济高效的EAI技术解决方案。 图1.基于AEAI ESB总线的企业应用集成模式   AEAI ESB提供了从企业应用集成的设计、开发、部署,到运行、管理、监控各个生命周期阶段的工具。它提供的图形化

etcd代理组件的开发思想

淺唱寂寞╮ 提交于 2019-11-28 19:45:57
最近在一个项目中,需要使用到etcd集群来实现服务发现的功能,目的是统一管理相应的服务资源,同时也可对资源做一定的负载均衡策略。然而,项目中使用的技术栈是C++语言,github上没有合适的C++开源的etcd客户端。于是需要在etcd和应用组件间加上一个etcd的代理层,利用etcd代理来沟通彼此。 etcd代理模块实现的思路: etcd代理组件作为客户端与etcd集群建立TCP长连接,并通过区分不同的指令来与集群做不同的消息交互(数据形式:cmd+payload)。同时暴露一些接口给应用层调用,发送一些指令到集群,如注册和监听相应的服务信息。当etcd代理接收到etcd集群发送回来的tcp包时,使用回调函数,或C++信号与槽函数的关系来调用应用层的处理接口,从而可更新服务信息。 主要实现的细节和方法: 1、在etcd代理内部维持一个循环,不断等待并处理epoll事件,监听socket消息 2、定时向etcd发送心跳消息,保持socket长连接 3、通信数据格式可采用struct+Json的形式(struct用于传相关头信息及cmd,而json则为具体的数据) 4、etcd代理类采用单例模式,提供统一的对象访问接口(static instance()) 5、回调函数的构建有两种方式:     1.在etcd代理中创建一个接口类,包含相应的回调函数(虚函数)