文章目录
RPC项目
配置中心项目
网关项目
与传统RPC框架一样,我们需要保证我们的服务是能被发现的。
也就是说,我希望通过一种简单的方式,就能将我们的服务暴露出去,使得其他服务可以方便的去依赖这个服务。
因此,我们提供一个注解,@RpcServiceDeclaration。
这个注解的作用就是用来暴露能够提供RPC功能的服务。
在Server端中,使用这个注解来标注某个对外暴露服务的Service服务即可。
之后,当Client需要用到这个服务的时候,就会去配置中心中找到这个服务,然后通过代理对象的方式调用这个服务的方法,从而最终调用服务成功。
而Client端也同理,我们需要标注那些服务需要进行服务代理。
因此,我们还需要为Client提供一个注解,@RpcAutowiredProxy。
这个注解的作用就是当Client使用服务的时候,如果使用了当前注解,那么就会对当前属性进行代理,通过代理对象的方式调用RPC方法。
而服务暴露与发现就非常依赖注册中心的功能了,因此我们还需要考虑如何整合第三方或者自研的注册中心,并且,为了保证项目的封装性,我们最好能将注册中心的功能进行一下封装,方便用户实现自己的注册中心功能。
对于注册中心,一言以蔽之—提供服务的ip和port。
所以,我们需要定义一下我们RPC项目中如何对接不同注册中心的一个服务实例信息。
参考Nacos,Nacos中存在一个Instance对象,这个对象中存储了服务的信息。
我们模仿一个,编写一个丐版的来存储我们项目的服务实例信息。
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RpcServiceInstance {/*** 服务名称*/private String serviceName;/*** 服务ip*/private String serviceIp;/*** 服务端口*/private int servicePort;/*** nacos会用到env信息*/private String groupName = RpcCommonConstants.DEFAULT_GROUP;/*** 元数据信息*/private Map<String,String> metadata = new ConcurrentHashMap<>();}
同时,我们提供接口,为用户提供自定义注册中心的接口功能,这样子用户就能按照自己的需要来实现注册中心了。
public interface RegisterService {default void init(){}void register(RpcServiceInstance instance);default void unregister(RpcServiceInstance instance){}RpcServiceInstance discovery(RpcServiceInstance instance);
}
有了注册中心服务实例的定义,接下来我们就需要思考,如何在项目启动的时候,扫描所有的Bean对象,并且将存在有对应RpcServiceDeclaration注解的服务信息注册到注册中心上去了。
而RpcServiceDeclaration的使用在Server端,因为Server端负责提供我们的服务定义信息,所以,这里我们先开始编写一下Server端口。