dubbo学习笔记 八 dubbo-common

来源:互联网 发布:网络机柜理线路图 编辑:程序博客网 时间:2024/06/07 03:25

前面学习了config container registry,为了后面的学习,今天开始学习下dubbo-common


beanutil 

这里面对class的一些定义和对反射的封装
public enum JavaBeanAccessor {    /** Field accessor. */    FIELD,    /** Method accessor.*/    METHOD,    /** Method prefer to field. */    ALL;    public static boolean isAccessByMethod(JavaBeanAccessor accessor) {        return METHOD.equals(accessor) || ALL.equals(accessor);    }    public static boolean isAccessByField(JavaBeanAccessor accessor) {        return FIELD.equals(accessor) || ALL.equals(accessor);    }}



bytecode

核心是proxy和wrapper  动态操作源代码  proxy 主要是javassist 的实现

wrapper 主要是invokeMethod

public Object invokeMethod(Object o, String n, Class[] p, Object[] v)throws java.lang.reflect.InvocationTargetException {com.alibaba.dubbo.demo.DemoService w;try {w = ((com.alibaba.dubbo.demo.DemoService) $1);} catch (Throwable e) {throw new IllegalArgumentException(e);}try {if ("sayHello".equals($2) && $3.length == 1) {return ($w) w.sayHello((java.lang.String) $4[0]);}} catch (Throwable e) {throw new java.lang.reflect.InvocationTargetException(e);}throw new com.alibaba.dubbo.common.bytecode.NoSuchMethodException("Not found method \"" + $2 + "\" in class com.alibaba.dubbo.demo.DemoService.");}


compiler

重点是实现编译,从源代码到 Class ,javacompilerjavassist

@SPI("javassist")public interface Compiler {/** * Compile java source code. *  * @param code Java source code * @param classLoader TODO * @return Compiled class */Class<?> compile(String code, ClassLoader classLoader);}

extension

这个包下面的东西是核心,如果通过配置扩展和动态加载实现类,就靠它来是实现,因为内容较多,单开一节

ExtensionLoader

   public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {        if (type == null)            throw new IllegalArgumentException("Extension type == null");        if(!type.isInterface()) {            throw new IllegalArgumentException("Extension type(" + type + ") is not interface!");        }        if(!withExtensionAnnotation(type)) {            throw new IllegalArgumentException("Extension type(" + type +                     ") is not extension, because WITHOUT @" + SPI.class.getSimpleName() + " Annotation!");        }                ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);        if (loader == null) {            EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));            loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);        }        return loader;    }


io

一些btye操作,和reader writer

json

一些对json的封装

logger

内部logger的封装,对其他日志框架留有适配

serialize

dubbo/hessian/java/json/nativejava 各种序列化框架的实现,主要就是 io流和对象的相互转化

public interface Serialization {    /**     * get content type id     *      * @return content type id     */    byte getContentTypeId();    /**     * get content type     *      * @return content type     */    String getContentType();    /**     * create serializer     * @param url      * @param output     * @return serializer     * @throws IOException     */    @Adaptive    ObjectOutput serialize(URL url, OutputStream output) throws IOException;    /**     * create deserializer     * @param url      * @param input     * @return deserializer     * @throws IOException     */    @Adaptive    ObjectInput deserialize(URL url, InputStream input) throws IOException;}

status

dubbo 内部运行状态的定义

public class Status {        /**     * Level     */    public static enum Level {        /**         * OK         */        OK,                 /**         * WARN         */        WARN,                 /**         * ERROR         */        ERROR,                 /**         * UNKNOWN         */        UNKNOWN    }

store

简单的map存储类,提供统一的工具类

@SPI("simple")public interface DataStore {    /**     * return a snapshot value of componentName     */    Map<String,Object> get(String componentName);    Object get(String componentName, String key);    void put(String componentName, String key, Object value);    void remove(String componentName, String key);}

threadpool

对java的线程池做了一层封装,提供出工具类来

@SPI("fixed")public interface ThreadPool {        /**     * 线程池     *      * @param url 线程参数     * @return 线程池     */    @Adaptive({Constants.THREADPOOL_KEY})    Executor getExecutor(URL url);}

util

提供一些工具类

URL

registry://192.168.1.7:9090/com.alibaba.service1?param1=value1&amp;param2=value2


URL 本来是用来远程寻址的,dubbo 用它来暴露服务

injvm://127.0.0.1/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=91627&side=provider&timestamp=1482029844843



public final class URL implements Serializable {    private static final long serialVersionUID = -1985165475234910535L;    private final String protocol;private final String username;private final String password;private final String host;private final int port;private final String path;    private final Map<String, String> parameters;


0 0
原创粉丝点击