基于 SpringBoot 手写 RPC 框架

本文详细介绍了基于Spring Boot的远程过程调用(RPC)框架的设计与实现,包括服务消费者与提供者的注解、代理生成、BIO通信处理、服务注册与发现等关键组件。通过具体示例展示了如何在消费方和提供方应用该RPC框架。

GitHub地址

https://github.com/Asperger12345/shenrpc-spring-boot-starter

文件目录

在这里插入图片描述

Message

传递的消息载体类

package com.shen.api;

import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

@Data
@Builder
public class Message implements Serializable {
   
   
	//服务接口名
    private String className;
    //方法名
    private String methodName;
    //参数
    private Object[] args;
    //接口类型
    private Class[] types;
}

consumer

服务消费方

@EnableRpcConsumer

打在SpringBoot启动类上

package com.shen.api.consumer;

import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import({
   
   ReferenceInvokeProxy.class,RpcHandler.class})
public @interface EnableRpcConsumer {
   
   
}

@Reference

打在注入的接口上

package com.shen.api.consumer;

import org.springframework.stereotype.Component;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Reference {
   
   
}

ReferenceInvokeProxy

对于每个有 @Reference 注解的接口,生成代理

package com.shen.api.consumer;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;

import java.lang.reflect.Field;
import java.lang.reflect.Proxy;

public class ReferenceInvokeProxy implements BeanPostProcessor {
   
   

    @Autowired
    RpcHandler invocationHandler;


    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
   
   
        Field[] fields=bean.getClass().getDeclaredFields();
        for(Field field:fields){
   
   
            if(field.isAnnotationPresent(Reference.class)){
   
   
                field.setAccessible(true);
                Object proxy= Proxy.newProxyInstance(field.getType().getClassLoader(),new Class<?>[]{
   
   field.getType()},invocationHandler);
                try {
   
   
                    field.set(bean,proxy);
                } catch (IllegalAccessException e) {
   
   
                    e.printStackTrace();
                }
            }
        }
        return bean;
    }
}

<

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值