【BlossomRPC】服务暴露与发现

60 阅读2分钟

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端口。