我们通过HelloWorld的例子介绍了RPC框架。我们知道客户端调用服务端需要使用两个注解。让我们一起实现这两个注解。注解相关的实现代码是RPC框架的核心代码。写好后可以打包成jar包作为框架在业务代码中使用,这样我们前面写的客户端和服务端的demo就可以正常工作了。好了,有了这么多的基础,我们才真正开始编写RPC框架代码。RPC框架计划提供两个注解:@ServiceReference@ServiceExpose@ServiceReference@ServiceReference注解用于引用服务端提供的服务。客户端启动后,可以自动注入相应的bean,像调用本地方法一样调用远程服务方法。首先,让我们定义一个注解类。interface关键字用于声明接口。在前面加一个@可以用来定义注解类。上面提到,客户端注解的名字是:ServiceReference。public@interfaceServiceReference{}注解类还可以添加很多配置项,通常用几个元注解来装饰:@Target表示我们定义注解的范围,ElementType是一个枚举类,有很多枚举值,这里我们只使用ElementType.FIELD,业务意义:目前这个自定义注解只能用在类的成员变量上。@Retention表示注解的保留策略,RetentionPolicy.RUNTIME表示注解可以保留到运行时,那为什么要保留到运行时呢?因为我们想在运行时通过这个注解自动注入依赖。如果值为RetentionPolicy.SOURCE,则表示只保存在源代码中,代码编译后该注解的信息将丢失。@Documented与文档相关,没有其他业务意义,这里不再赘述。一个完整注解类的详细代码如下:@Target({ElementType.FIELD})//注解保留策略@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceServiceReference{}注解已经定义,代码非常简单而且使用起来比较简单,只需要在类的成员变量上加上这样的注解即可:classA{@ServiceReferenceprivateXxxServicexxxService;...省略}有朋友可能会问,为什么加一个简单的注解就可以让远程服务依赖注入进来呢?这其实就是框架背后的功劳。服务启动后,会自动扫描框架的注解。根据不同的注解框架,会有相应的初始化动作。至于@ServiceReference的初始化逻辑,我们会在下一节详细讨论。接下来,看另一篇笔记。@ServiceExpose@ServiceExpose注解被服务器用来暴露自己的服务接口(方法),然后可以被客户端发现和调用。类似于@ServiceReference,定义一个名为:ServiceExpose的注解。public@interfaceServiceExpose{}和@ServiceReference的区别是多了一个元注解:@Component和@Target有不同的值。@Component是Spring原生注解。Spring启动后,它会扫描注解并初始化一个bean以便与@ServiceExpose注解一起使用。具体逻辑会在后面的章节中详细介绍。@Target用于约束注解的范围。ElementType.TYPE表示注解只能用在类(class)、接口(interface)、枚举(enum)类上。在其他地方使用是非法的,会编译失败。完整代码如下://元注解,Spring原生注解@Component//约束注解使用范围@Target({ElementType.TYPE})//注解保留策略@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceServiceExpose{}代码结构前面搭建环境的时候创建了一个maven项目,我们继续在项目中创建一个package,并命名为:annotation,将刚才编写的两个注解类代码放入其中。当前框架的代码结构如下:├──easy-rpc-spring-boot-starter│├──pom.xml│├──src││└──main││├──java│││└──com│││└──雷小帅│││└──easyrpc│││├──注解││││├──ServiceExpose.java│││└──ServiceReference.java│││资源我们写完了框架中的两个核心注解类:@ServiceReference和@ServiceExpose。客户端经常使用@ServiceReference来引用服务器;服务器通常使用@ServiceExpose来公开自己的服务以供客户端发现和使用。定义注解的步骤很简单:使用@interface声明注解类,在注解类前面加上元注解,比如:@Target、@Retention等。相信大家也发现了注解类之后定义了,不会立即生效,比如在一个类上加注解@ServiceReference,我们期望这个类在服务启动后自动暴露自己,但是你会发现什么也没有发生,这是为什么呢?其实注解只是一种标记手段,本身没有业务逻辑。如果想让注解达到预期的效果,需要自己写一段驱动代码。在代码中,可以通过反射扫描所有添加注解的地方,然后执行相应的逻辑,至于什么时候执行这个驱动代码,需要结合注解保留策略,一般在编译时执行或操作。明白了这个道理之后,为了实现@ServiceReference和@ServiceExpose这两个注解对应的功能,就需要分别写一个驱动程序。这段代码会在后面的章节中详细介绍,我们继续往下看。
