搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇

[复制链接]
查看: 18|回复: 0

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32598
发表于 2020-1-15 01:20 | 显示全部楼层 |阅读模式
条件

前置文章:
在前置的《基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇》一文中已经界说了一个相对简单的RPC私有协议,而且实现了对应的编码息争码模块。这篇文章基于协议篇,完成Server端代码挪用的编写。考虑到现在相对支流的IOC容器是Spring,这里选用了spring-boot-starter(非MVC容器,只是纯真治理Bean),依靠JDK1.8+。
思绪

首先RPC私有协议界说了Client端会传过来四个和办事挪用息息关连的字符:接口全类名interfaceName、方式名methodName、方式参数签名字符串数组methodArgumentSignatures(可选,这个参数不是必须传入的)以及方式参数数组methodArguments(可选,空方式列表的时候不需要传入参数)。严重流程以下:

  • 把Server真个全数办事端(实现)类交由IOC容器托管。
  • Client端倡议RPC请求。
  • 经过前面提到的最多四个参数,从Server办究竟例的IOC容器中婚配出合适度最高的一个方式java.lang.reflect.Method实例、该方式实例的宿主类以及宿主类对应的Bean实例,假如这一步婚配的方针方式横跨1个大要为0个,可以间接返回很是信息。
  • 把前一步获得的Method实例、宿主类Bean实例,团结方式参数数组methodArguments举行反射挪用,获得挪用结果。
  • Server端把响应结果封装到payload经过私有协议发送回Client端。
Server端代码实现

为了姑且方便起见,部分数组入参被重新封装为ArrayList,现实上编写RPC框架的时候应当优先考虑性能题目,像JDK供给的聚集类库等等应当尽大要少用(以ArrayList为例,扩容的时候存在底层Object[]拷贝,形成性能损失和额外的内存消耗),极尽大要操纵底子典范和数组。
先界说方式婚配器MethodMatcher关连的类:
[code]public interface MethodMatcher {    /**     * 查找一个婚配度最高的方式信息     *     * @param input input     * @return output     */    MethodMatchOutput selectOneBestMatchMethod(MethodMatchInput input);}// 输入值@EqualsAndHashCode@Datapublic class MethodMatchInput {    private String interfaceName;    private String methodName;    private List methodArgumentSignatures;    private int methodArgumentArraySize;}// 输出值@Datapublic class MethodMatchOutput {    /**     * 方针方式实例     */    private Method targetMethod;    /**     * 方针实现类 - 这个有大如果被Cglib增强过的典范,是宿主类的子类,假如没有被Cglib增强过,那末它就是宿主类     */    private Class targetClass;    /**     * 宿主类     */    private Class targetUserClass;    /**     * 宿主类Bean实例     */    private Object target;    /**     * 方式参数典范列表     */    private List hostClass;    private Class hostUserClass;    private Object hostTarget;}@Slf4jabstract class BaseMethodMatcher implements MethodMatcher {    private final ConcurrentMap cache = Maps.newConcurrentMap();    @Override    public MethodMatchOutput selectOneBestMatchMethod(MethodMatchInput input) {        return cache.computeIfAbsent(input, in -> {            try {                MethodMatchOutput output = new MethodMatchOutput();                Class interfaceClass = Class.forName(in.getInterfaceName());                // 获得宿主类信息                HostClassMethodInfo info = findHostClassMethodInfo(interfaceClass);                List targetMethods = Lists.newArrayList();                ReflectionUtils.doWithMethods(info.getHostUserClass(), targetMethods::add, method -> {                    String methodName = method.getName();                    Class declaringClass = method.getDeclaringClass();                    List> parameterTypes = Lists.newArrayList(method.getParameterTypes());                        return Objects.equals(methodName, in.getMethodName()) &&                                Objects.equals(info.getHostUserClass(), declaringClass) &&                                Objects.equals(parameterTypes, inputParameterTypes);                    }                    // 假如没有传入参数签名列表,那末操纵参数的数目举行婚配                    if (in.getMethodArgumentArraySize() > 0) {                        List
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 全椒百姓网-全椒知名**,发布及时新鲜的全椒新闻资讯 生活信息 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表