代理模式

基于注解的SpringAOP源码解析(三)

你说的曾经没有我的故事 提交于 2019-11-28 07:11:32
注意,读完本篇文章需要很长很长时间 在之前的2篇文章: AOP源码分析(一) AOP源码分析(二) 中,我们搭建了SpringAOP源码分析的环境,介绍了 @EnableAspectJAutoProxy 注解和 postProcessBeforeInstantiation 方法是如何加载所有增强的。本篇文章则将描述一下AOP中剩余的实现逻辑 postProcessAfterInitialization 这个方法是在bean实例化之后调用的,它是适用于所有需要被代理的类的 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (!this.earlyProxyReferences.contains(cacheKey)) { //往下看 return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; } protected Object wrapIfNecessary(Object bean, String

最强开源微服务框架

喜夏-厌秋 提交于 2019-11-28 07:05:20
转载:https://my.oschina.net/u/3820517/blog/3072547 诞生于 2014 年的“微服务架构”,其思想经由 Martin Fowler 阐述后,在近几年持续受到重视,理论与相关实践都不断发展,目前它已经成为了主流软件架构模式。 关于微服务架构是什么,没有一个明确的定义,每个实践者有自己的理解,但是有人给出的一个公式值得思考: 微服务架构 = 80% 的 SOA 服务架构思想 + 100% 的组件化架构思想 + 80% 的领域建模思想 微服务架构的优点很多,比如它解耦业务,提供更高的灵活性,允许在服务频繁发版的同时保持系统其它部分的可用性与稳定性;解耦编程语言,针对不同业务可以使用更加合适的语言进行开发;解耦开发团队,不同团队各自负责一个微服务,互不影响,加速交付。 关于微服务架构,网上资料相当多(因为现在很火,各家都有实践案例分享),读者可以另行查阅,这里不赘述。 下边为大家列举了当前最为火热,最常被人提及的开源微服务开发框架,希望对开发者有一定的帮助(点击项目名,可以直接跳转介绍页): Spring Cloud Spring Cloud 为开发者提供了分布式系统配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 Token、全局锁、决策竞选、分布式会话与集群状态等的开发工具。使用 Spring Cloud

Java 中的动态代理

不问归期 提交于 2019-11-28 06:14:11
一、概述 1. 什么是代理   我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品。关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者”对我们来说是不可见的;其次,微商代理主要以朋友圈的人为目标客户,这就相当于为厂家做了一次对客户群体的“过滤”。我们把微商代理和厂家进一步抽象,前者可抽象为代理类,后者可抽象为委托类(被代理类)。通过使用代理,通常有两个优点,并且能够分别与我们提到的微商代理的两个特点对应起来:   优点一:可以隐藏委托类(被代理类)的实现;   优点二:可以实现客户与委托类间的解耦,在不修改委托类代码的情况下能够做一些额外的处理。 2. 静态代理   若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类。 下面我们用Vendor类代表生产厂家,BusinessAgent类代表微商代理,来介绍下静态代理的简单实现,委托类和代理类都实现了Sell接口,Sell接口的定义如下: public interface Sell { void sell(); void ad(); }   Vendor类的定义如下: public class Vendor

squid代理与缓存(下)

痞子三分冷 提交于 2019-11-28 06:03:17
squid代理与缓存(下) 6. squid代理模式案例 6.1 squid传统正向代理生产使用案例 6.1.1 squid传统正向代理两种方案 (1)普通代理服务器 作为代理服务器,这是SQUID的最基本功能;通过在squid.conf文件里添加一系列访问及控制规则,用户在客户端设置服务器地址和端口,即可通过SQUID访问INTERNET,在下面的规则里,squid实现局域网用户代理和高速缓存功能: 即通过浏览器设置代理服务器地址实现共享上网,这种方式不需要代理服务器在网络的出入口位置,只要代理服务器可以上网,其他的客户机就可以通过IE等客户端设置代理服务器的地址及端口进行上网(客户机不能上网,但是可以通过代理服务器来达到上网的目的)。 (2)透明代理服务器 另一种就是透明代理,所谓透明代理,是相对于代理服务器而言,客户端不需要做任何和代理服务器相关的设置和操作,对用户而言,感觉不到代理服务器的存在,所以称之为透明代理。即把代理服务器部署在核心的上网出口,当用户上网浏览页面时,会交给代理服务器向外请求,如果结合iptables可以实现代理+网关+内容过滤+流量安全控制等完整的上网解决方案。 透明代理流程说明: 用户A发送一个访问请求到防火墙,由防火墙将该用户的访问请求转发到SQUID,SQUID在先检查自身缓存中有无该用户请求的访问内容,如果没有,则请求远端目的服务器

分布式系统监视zabbix讲解七之分布式监控

别来无恙 提交于 2019-11-28 05:25:32
分布式监控 概述 Zabbix通过Zabbix proxy为IT基础设施提供有效和可用的分布式监控 代理(proxy)可用于代替Zabbix server本地收集数据,然后将数据报告给服务器。 Proxy 特征 当选择使用/不使用proxy时,必须考虑几个注意事项。 Proxy 轻量级(Lightweight) Yes 图形界面(GUI) No 独立工作(Works independently) Yes 易于维护(Easy maintenance) Yes 自动生成数据库(Automatic DB creation) 1 Yes 本地管理(Local administration) No 准备嵌入式硬件 (Ready for embedded hardware) Yes 单向TCP连接(One way TCP connections) Yes 集中配置(Centralised configuration) Yes 生成通知(Generates notifications) No 代理 概述 zabbix proxy 可以代替 zabbix server 收集性能和可用性数据,然后把数据汇报给 zabbix server,并且在一定程度上分担了zabbix server 的压力. 此外,当所有agents和proxies报告给一个Zabbix server并且所有数据都集中收集时

【面试】Spring 执行流程

半城伤御伤魂 提交于 2019-11-28 05:12:50
Spring Aop的实现原理: AOP 的全称是 Aspect Orient Programming ,即面向切面编程。是对 OOP (Object Orient Programming) 的一种补充,专门用于处理一些具有横切性质的服务。常常用于日志输出、、安全控制等。 AOP(面向切面编程思想)主要是的实现技术有 Spring AOP 和 AspectJ。 AspectJ 的底层技术:AspectJ 的底层技术是静态代理,即用一种AspectJ 支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类,该代理类增强了业务类,这是在编译时增i强,相对于下面说的运行时增强,编译时增强的性能更好。 Spring AOP : Spring AOP 采用的是动态代理,在运行期间对业务方法进行增强,所以不会生成新类,对于动态代理技术,Spring AOP 提供了对 JDK 动态代理的支持以及 CFLib的支持。 JDK 动态代理只能为接口创建动态代理实力,而不能对类创建动态代理。需要获得被目标类的接口信息(应用 JAVA 的反射技术),生成一个实现了代理接口的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利用构造函数生成动态代理类的实例对象,在调用具体方法前调用 invokeHandler 方法来处理。   CGLib 动态代理需要依赖ASM包,把代理对象类的

Mybatis框架(8)---Mybatis插件原理

╄→гoц情女王★ 提交于 2019-11-28 04:14:02
Mybatis插件原理 在实际开发过程中,我们经常使用的Mybaits插件就是分页插件了,通过分页插件我们可以在不用写 count语句和limit 的情况下就可以获取分页后的数据,给我们开发带来很大 的便利。除了分页,插件使用场景主要还有更新数据库的通用字段,分库分表,加解密等的处理。 这篇博客主要讲Mybatis插件原理,下一篇博客会设计一个Mybatis插件实现的功能就是每当新增数据的时候 不用数据库自增ID而是通过该插件生成雪花ID ,作为每条数据的主键。 一、JDK动态代理+责任链设计模式 Mybatis的插件其实就是个 拦截器功能 。它利用 JDK动态代理和责任链设计模式的综合运用 。采用责任链模式,通过动态代理组织多个拦截器,通过这些拦截器你可以做一些 你想做的事。所以在讲Mybatis拦截器之前我们先说说JDK动态代理+责任链设计模式。有关JDK动态代理的原理,可以参考我之前写的一篇博客: 【java设计模式】---代理模式 1、JDK动态代理案例 public class MyProxy { /** * 一个接口 */ public interface HelloService{ void sayHello(); } /** * 目标类实现接口 */ static class HelloServiceImpl implements HelloService{

spirng Aop原理

旧城冷巷雨未停 提交于 2019-11-28 03:26:19
spring aop 即面些切面编程 具体的关键点在于: CGLIB的动态代理技术,可以代理类和接口,相对于JDK自带的动态代理技术,多了可以代理除了接口的类的功能。 具体流程: 通过切面的思想,在类加载的同时,进行一些增强操作,如记录到日志中等 在jvm中,我们程序运行都是以方法为基本单位,那么就是纵向的程序执行方式,这时,aop引入了一个连接点的概念,所谓的连接点(join Point),就是所谓的方法。 而我们选择的切入点(point cut),就是选择哪几个方法的过程。 选择完切入点后,我们就需要获取到方法,即所谓的连接点,那么aop就是利用的动态代理的模式来获取到的,加入动态代理后的程序,会先执行动态代理(通过的也是IOC的方式)对象的方法,然后在去执行原本的方法,在spring aop框架中,它能够获取到所有的非final的public方法,因此能够插入一些我们自己的业务代码。 具体的插入aop提供了 这样的一个思路,即 (简单版) before Method 之前怎么做 try { 调用 Method } catch (InterruptedException e) { 异常的怎么做 } finally { 返回结果之前怎么做 } 在aop中,我们又存在了一个advice和aspect的概念,advice即上述途中给出的思路,它包括了前置,后置,环绕,异常等建以

动态代理源码解析

拥有回忆 提交于 2019-11-28 02:43:07
摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理(如在调用目标方法前校验权限,在调用完目标方法后打印日志等)等功能。 使用动态代理的五大步骤 1.通过实现InvocationHandler接口来自定义自己的InvocationHandler; 2.通过Proxy.getProxyClass获得动态代理类 3.通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class) 4.通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入 5.通过代理对象调用目标方法 动态代理的使用 例1(方式一) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 public class MyProxy { public interface IHello{ void sayHello(); }

代理设计模式

本小妞迷上赌 提交于 2019-11-28 02:01:03
什么 是代理 模式 为其他对象提供一种代理以控制对这个对象的访问。 为什么使用 代理 模式 中介隔离:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。 开闭原则,增加功能 代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。 代理 模式实现原理 代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色,Proxied)以及代理类角色(Proxy),如下图所示: 抽象主题角色:可以是接口,也可以是抽象类; 委托类角色:真实主题角色,业务逻辑的具体执行者; 代理类角色:内部含有对真实对象RealSubject的引用,负责对真实主题角色的调用,并在真实主题角色处理前后做预处理和后处理。 代理 模式应用场景