当前位置: 首页 > news >正文

公安局备案网站名称郑州网站推广效果

公安局备案网站名称,郑州网站推广效果,制作公司网站要多少钱,河南省建设厅网站136号文件RPC远程调用 使用 RPC 时,一般的做法是先找服务提供方要接口,通过 Maven把接口依赖到项目中。在编写业务逻辑的时候,如果要调用提供方的接口,只需要通过依赖注入的方式把接口注入到项目中,然后在代码里面直接调用接口…

RPC远程调用

使用 RPC 时,一般的做法是先找服务提供方要接口,通过 Maven把接口依赖到项目中。在编写业务逻辑的时候,如果要调用提供方的接口,只需要通过依赖注入的方式把接口注入到项目中,然后在代码里面直接调用接口的方法 。

接口里并不会包含真实的业务逻辑,业务逻辑都在服务提供方。

核心技术:动态代理

RPC 会自动给接口生成一个代理类,项目中注入接口的时候,运行过程中实际绑定的是这个接口生成的代理类。在接口方法被调用的时候,实际上是被生成代理类拦截到,这样就可以在生成的代理类里面,加入远程调用逻辑。
流程如下:
image-20241028222602052

实现原理

jdk动态代理:

/*** 要代理的接口*/
public interface Hello {String say();
}/*** 真实调用对象*/
public class RealHello {public String haha(){return "i'm proxy";}
}

代理类实现InvocationHandler接口

/*** JDK代理类生成*/
public class JDKProxy implements InvocationHandler {private Object target;JDKProxy(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] paramValues) {return ((RealHello)target).haha();}
}public class TestProxy {public static void main(String[] args){// 构建代理器JDKProxy proxy = new JDKProxy(new RealHello());ClassLoader classLoader = Hello.class.getClassLoader();// 把生成的代理类保存到文件
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles","true");// 生成代理类Hello test = (Hello) Proxy.newProxyInstance(classLoader, new Class[]{Hello.class}, proxy);// 方法调用System.out.println(test.say());}
}

解释:给 Hello 接口生成一个动态代理类,并调用接口 say() 方法,但真实返回的值是来自 RealHello 里面的 haha() 方法返回值。

重点是代理类的生成Proxy.newProxyInstance

参数 saveGeneratedFiles 来控制是否把生成的字节码保存到本地磁盘。

key为“sun.misc.ProxyGenerator.saveGeneratedFiles”的Property来控制的,动态生成的类会保存在工程根目录下的 com/sun/proxy 目录里面。

生成的代理类。

image-20241028234309430

package com.sun.proxy;import com.lkl.proxy.Hello;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy implements Hello {private static Method m1;private static Method m2;private static Method m3;private static Method m0;public $Proxy0(InvocationHandler var1) throws  {super(var1);}public final boolean equals(Object var1) throws  {try {return (Boolean)super.h.invoke(this, m1, new Object[]{var1});} catch (RuntimeException | Error var3) {throw var3;} catch (Throwable var4) {throw new UndeclaredThrowableException(var4);}}public final String toString() throws  {try {return (String)super.h.invoke(this, m2, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final String say() throws  {try {// 代理类执行return (String)super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final int hashCode() throws  {try {return (Integer)super.h.invoke(this, m0, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}static {try {m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));m2 = Class.forName("java.lang.Object").getMethod("toString");m3 = Class.forName("com.lkl.proxy.Hello").getMethod("say");m0 = Class.forName("java.lang.Object").getMethod("hashCode");} catch (NoSuchMethodException var2) {throw new NoSuchMethodError(var2.getMessage());} catch (ClassNotFoundException var3) {throw new NoClassDefFoundError(var3.getMessage());}}
}

$Proxy0 类里面有一个跟 Hello 一样签名的 say() 方法,其中 this.h 绑定的是刚才传入的 JDKProxy 对象,所以当调用 Hello.say() 的时候,实际被转发到了JDKProxy.invoke()。


单纯从代理功能上来看,JDK 默认的代理功能是有一定的局限性的,要求被代理的只能是接口。原因是生成的代理类会继承 Proxy 类,但Java不支持多重继承

JDK默认的代理功能,最大的问题就是性能问题。生成后的代理类是使用反射来完成方法调用,而这种方式相对直接用编码调用来说,性能会降低,但JDK8及以上版本对反射调用的性能有很大的提升。


除了JDK 默认的nvocationHandler能完成代理功能,还有很多其他的第三方框架也可以实现,比如JavassistByte Buddy 这样的框架。

Javassist定位是能够操纵底层字节码,要生成动态代理类比较复杂。但是,通过Javassist生成字节码,不需要通过反射完成方法调用,所以性能会高一些。问题:通过Javassist生成一个代理类后,此 CtClass 对象会被冻结起来,不允许再修改;否则,再次生成时会报错。

Byte Buddy提供了更容易操作的API,编写的代码可读性更高。并且生成的代理类执行速度比Javassist更快。

动态代理框架选型

三个角度考虑:

  • 代理类是在运行中生成的,那么代理框架生成代理类的速度、生成代理类的字节码大小等等,都会影响到其性能——生成的字节码越小,运行所占资源就越小
  • 生成的代理类,是用于接口方法请求拦截的,所以每次调用接口方法的时候,都会执行生成的代理类,生成的代理类的执行效率就需要很高效。
  • 从使用角度出发的,选择使用起来很方便、好上手的代理类框架。
http://www.hkea.cn/news/318039/

相关文章:

  • 美观网站建设物美价廉seo网站优化专员
  • 网站设计应该怎么做推广软文代写
  • 网站建设工作室发展百度收录教程
  • 没有网站 可以做百度口碑吗成都网站制作
  • 医院系统网站建设百度宁波营销中心
  • 网站劫持代码杭州互联网公司排名榜
  • 做网站找哪个部门吸引人的推广标题
  • 网站制作软件名字线做竞价推广代运营公司
  • avada如何做中英文网站沈阳百度推广排名优化
  • 做网站品长沙网络营销公司排名
  • b2b商贸网站环球网最新消息疫情
  • wordpress next主题什么是seo教程
  • 如何规划一个网站快手秒赞秒评网站推广
  • 中国网站开发网站seo需要用到哪些工具
  • 织梦做的网站首页出现空白网页平台做个业务推广
  • 备案做电影网站吗yandx引擎入口
  • 网站双倍浮动百度账号登陆入口
  • 聊城市网站建设网站推广排名
  • 帝国新闻网站模板百度seo推广怎么做
  • 预约做港澳证的网站网站排名在线优化工具
  • 罗湖实惠的网站建设费用成都官网seo厂家
  • 建设部官方网站有哪些优帮云排名优化
  • 天津做网站找谁新东方在线教育平台官网
  • 南宁做网站在哪了日本预测比分
  • 咋样查看网站用什么编程语言做的9个广州seo推广神技
  • 网站链接太多怎么做网站地图谷歌广告
  • 网站关键词更新临汾网络推广
  • 个人做网站靠什么盈利免费网站建设模板
  • 网站开发 打标签aso优化怎么做
  • 教育校园网站建设方案seo每天一贴