# 《RPC手撸专栏》第11章:服务提供者扩展支持CGLib调用真实方法

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

除了反射能够调用方法外,还有哪些技术可以实现方法的调用?

# 一、前言

我不想用反射技术调用真实方法,怎么办?

在前面的章节中,服务提供者基于Java的反射技术实现了对真实方法的调用,并对服务消费者向服务提供者发送数据、服务提供者调用真实方法、服务提供者向服务消费者响应结果数据进行了测试。

那么问题来了,服务消费者向服务提供者发送数据、服务提供者调用真实方法、服务提供者向服务消费者响应结果数据的整个请求与响应链路都是通畅的,但是目前对于服务提供者来说,美中不足的就是在调用真实方法时,使用的是Java的反射技术。如果在bhrpc框架中,服务提供者只能够使用Java的反射技术调用真实方法,一方面会限制了框架了扩展,一方面也不利于框架的性能优化。

那除了反射技术能够调用方法外,还有没有其他的技术也能够调用远程方法呢?答案就是使用CGLib也能够调用远程方法。

# 二、目标

我想在bhrpc框架的服务提供者中,支持CGLib调用真实方法!

都说在开发系统,尤其是在开发通用型框架时,一定要注重框架的性能和扩展性。在目前实现的bhrpc框架中,服务提供者只支持使用Java的反射技术调用真实方法,大家也都知道其实反射技术的性能还是稍微有点差劲的,除了性能问题外,再由就是限制了bhrpc框架的扩展性。

所以,在服务提供者端除了能够使用Java的反射技术调用真实方法外,也需要支持CGLib调用真实方法,用户在使用bhrpc框架时,在启动服务提供者时,可以根据实际需要配置使用Java反射技术调用真实方法,还是使用CGLib技术调用真实方法。

# 三、设计

如果让你实现服务提供者扩展支持CGLib调用真实方法,你会怎么设计?

服务提供者需要在启动的时候根据配置选择使用Java反射技术或者CGLib调用真实方法,其实就是在构建服务提供者时,再多暴露一个参数,这个参数就是选择使用Java反射技术或者CGLib调用真实方法的一个标识,整体如图11-1所示。

图11-1 服务提供者扩展使用CgLib调用真实方法的交互图

由图11-1可以看出,当服务提供者扩展支持CgLib调用真实方法时,需要在启动服务提供者之前,通过单独的配置项配置服务提供者使用Java反射还是CGLib来调用真实方法。服务提供者在启动后,会读取对应的配置项,然后根据对应的配置项路由到使用Java反射还是CGLib来调用真实方法。

随后,真实方法执行业务逻辑,并向服务提供者返回结果数据。后续服务提供者向服务消费者响应对应的结果数据,整个过程与前面的章节一致。

# 四、实现

说了这么多,服务提供者扩展支持CGLib调用真实方法的代码该如何实现呢?

# 1.工程结构

  • bhrpc-annotation:实现bhrpc框架的核心注解工程。

  • bhrpc-codec:实现bhrpc框架的自定义编解码功能。

  • bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。

  • bhrpc-constants:存放实现bhrpc框架通用的常量类。

  • bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。

  • bhrpc-provider:服务提供者父工程。

    • bhrpc-provider-common:服务提供者通用工程。
    • bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。
  • bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。

    • bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。
    • bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。
  • bhrpc-test:测试bhrpc框架的父工程。

    • bhrpc-test-api:测试的通用Servcie接口工程
    • bhrpc-test-provider:测试服务提供者的工程。
    • bhrpc-test-consumer:测试服务消费者的工程
      • bhrpc-test-consumer-codec:测试服务消费者基于自定义网络协议与编解码与服务提供者进行数据交互
    • bhrpc-test-scanner:测试扫描器的工程。

工程源码: 关注冰 冰河技术 微信公众号,回复 bhrpc, 获取代码链接地址。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码