自定义基于netty的rpc框架(4)---zk和utils以及protocol的实现

本文介绍了一个基于ZooKeeper的服务发现与RPC通信系统。利用ZooKeeper进行服务注册和服务发现,实现客户端与服务端之间的负载均衡。同时,通过Netty实现高效的RPC通信,采用Protostuff进行序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、zk的实现

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <parent>
        <artifactId>rpc.demo</artifactId>
        <groupId>tj.cmcc.org</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>rpc-zk</artifactId>
    <packaging>jar</packaging>
    <name>rpc-zk Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <!-- SLF4J -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
        <!-- ZooKeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>rpc-zk</finalName>
    </build>
</project>

cn.tianjun.zk.Constant

package cn.tianjun.zk;

/**
 * 常量
 */
public class Constant {

    public static final int ZK_SESSION_TIMEOUT = 5000;//zk超时时间

    public static final String ZK_REGISTRY_PATH = "/registry";//注册节点
    public static final String ZK_DATA_PATH = ZK_REGISTRY_PATH + "/data";//节点
}

cn.tianjun.zk.ServiceDiscovery

package cn.tianjun.zk;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadLocalRandom;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 本类用于client发现server节点的变化 ,实现负载均衡
 *
 */
public class ServiceDiscovery {

    private static final Logger LOGGER = LoggerFactory
            .getLogger(ServiceDiscovery.class);

    private CountDownLatch latch = new CountDownLatch(1);

    private volatile List<String> dataList = new ArrayList<String>();

    private String registryAddress;

    /**
     * zk链接
     *
     * @param registryAddress
     */
    public ServiceDiscovery(String registryAddress) {
        this.registryAddress = registryAddress;

        ZooKeeper zk = connectServer();
        if (zk != null) {
            watchNode(zk);
        }
    }

    /**
     * 发现新节点
     *
     * @return
     */
    public String discover() {
        String data = null;
        int size = dataList.size();
        // 存在新节点,使用即可
        if (size > 0) {
            if (size == 1) {
                data = dataList.get(0);
                LOGGER.debug("using only data: {}", data);
            } else {
                data = dataList.get(ThreadLocalRandom.current().nextInt(size));
                LOGGER.debug("using random data: {}", data);
            }
        }
        return data;
    }

    /**
     * 链接
     *
     * @return
     */
    private ZooKeeper connectServer() {
        ZooKeeper zk = null;
        try {
            zk = new ZooKeeper(registryAddress, Constant.ZK_SESSION_TIMEOUT,
                    new Watcher() {
                        public void process(WatchedEvent event) {
                            if (event.getState() == Event.KeeperState.SyncConnected) {
                                latch.countDown();
                            }
                        }
                    });
            latch.await();
        } catch (Exception e) {
            LOGGER.error("", e);
        }
        return zk;
    }

    /**
     * 监听
     *
     * @param zk
     */
    private void watchNode(final ZooKeeper zk) {
        try {
            // 获取所有子节点
            List<String> nodeList = zk.getChildren(Constant.ZK_REGISTRY_PATH,
                    new Watcher() {
                        public void process(WatchedEvent event) {
                            // 节点改变
                            if (event.getType() == Event.EventType.NodeChildrenChanged) {
                                watchNode(zk);
                            }
                        }
                    });
            List<String> dataList = new ArrayList<String>();
            // 循环子节点
            for (String node : nodeList) {
                // 获取节点中的服务器地址
                byte[] bytes = zk.getData(Constant.ZK_REGISTRY_PATH + "/"
                        + node, false, null);
                // 存储到list中
                dataList.add(new String(bytes));
            }
            LOGGER.debug("node data: {}", dataList);
            // 将节点信息记录在成员变量
            this.dataList = dataList;
        } catch (Exception e) {
            LOGGER.error("", e);
        }
    }
}

cn.tianjun.zk.ServiceRegistry

package cn.tianjun.zk;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 服务注册 ,ZK 在该架构中扮演了“服务注册表”的角色,用于注册所有服务器的地�?与端口,并对客户端提供服务发现的功能
 * 
 */
public class ServiceRegistry {

    private static final Logger LOGGER = LoggerFactory
            .getLogger(ServiceRegistry.class);

    private CountDownLatch latch = new CountDownLatch(1);

    private String registryAddress;

    public ServiceRegistry(String registryAddress) {
        //zookeeper的地�?
        this.registryAddress = registryAddress;
    }

    /**
     * 创建zookeeper链接
     * 
     * @param data
     */
    public void register(String data) {
        if (data != null) {
            ZooKeeper zk = connectServer();
            if (zk != null) {
                createNode(zk, data);
            }
        }
    }

    /**
     * 创建zookeeper链接,监�?
     * 
     * @return
     */
    private ZooKeeper connectServer() {
        ZooKeeper zk = null;
        try {
            zk = new ZooKeeper(registryAddress, Constant.ZK_SESSION_TIMEOUT,
                    new Watcher() {
                        public void process(WatchedEvent event) {
                            if (event.getState() == Event.KeeperState.SyncConnected) {
                                latch.countDown();
                            }
                        }
                    });
            latch.await();
        } catch (Exception e) {
            LOGGER.error("", e);
        }
        return zk;
    }

    /**
     * 创建节点
     * 
     * @param zk
     * @param data
     */
    private void createNode(ZooKeeper zk, String data) {
        try {
            byte[] bytes = data.getBytes();
            if (zk.exists(Constant.ZK_REGISTRY_PATH, null) == null) {
                zk.create(Constant.ZK_REGISTRY_PATH, null, Ids.OPEN_ACL_UNSAFE,
                        CreateMode.PERSISTENT);
            }

            String path = zk.create(Constant.ZK_DATA_PATH, bytes,
                    Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
            LOGGER.debug("create zookeeper node ({} => {})", path, data);
        } catch (Exception e) {
            LOGGER.error("", e);
        }
    }
}

2、utils的实现

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <parent>
        <artifactId>rpc.demo</artifactId>
        <groupId>tj.cmcc.org</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>rpc-utils</artifactId>
    <packaging>jar</packaging>
    <name>rpc-utils Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <!-- SLF4J -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
        <!-- Netty -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
        </dependency>
        <!-- Protostuff -->
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
        </dependency>
        <!-- Objenesis -->
        <dependency>
            <groupId>org.objenesis</groupId>
            <artifactId>objenesis</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>rpc-utils</finalName>
    </build>
</project>

cn.tianjun.rpc.utils.RpcDecoder

package cn.tianjun.rpc.utils;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import java.util.List;

/**
 * RPC 解码器
 *
 */
public class RpcDecoder extends ByteToMessageDecoder {

    private Class<?> genericClass;

    // 构造函数传入向反序列化的class
    public RpcDecoder(Class<?> genericClass) {
        this.genericClass = genericClass;
    }

    @Override
    public final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        if (in.readableBytes() < 4) {
            return;
        }
        in.markReaderIndex();
        int dataLength = in.readInt();
        if (dataLength < 0) {
            ctx.close();
        }
        if (in.readableBytes() < dataLength) {
            in.resetReaderIndex();
        }
        //将ByteBuf转换为byte[]
        byte[] data = new byte[dataLength];
        in.readBytes(data);
        //将data转换成object
        Object obj = SerializationUtil.deserialize(data, genericClass);
        out.add(obj);
    }
}

cn.tianjun.rpc.utils.RpcEncoder

package cn.tianjun.rpc.utils;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * RPC 编码器
 *
 */
public class RpcEncoder extends MessageToByteEncoder<Object> {

    private Class<?> genericClass;

    // 构造函数传入向反序列化的class
    public RpcEncoder(Class<?> genericClass) {
        this.genericClass = genericClass;
    }

    @Override
    public void encode(ChannelHandlerContext ctx, Object inob, ByteBuf out)
            throws Exception {
        //序列化
        if (genericClass.isInstance(inob)) {
            byte[] data = SerializationUtil.serialize(inob);
            out.writeInt(data.length);
            out.writeBytes(data);
        }
    }
}

cn.tianjun.rpc.utils.RpcRequest

package cn.tianjun.rpc.utils;

/**
 * 封装 RPC 请求
 *  封装发送的object的反射属性
 */
public class RpcRequest {

    private String requestId;
    private String className;
    private String methodName;
    private Class<?>[] parameterTypes;
    private Object[] parameters;

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getMethodName() {
        return methodName;
    }

    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }

    public Class<?>[] getParameterTypes() {
        return parameterTypes;
    }

    public void setParameterTypes(Class<?>[] parameterTypes) {
        this.parameterTypes = parameterTypes;
    }

    public Object[] getParameters() {
        return parameters;
    }

    public void setParameters(Object[] parameters) {
        this.parameters = parameters;
    }
}

cn.tianjun.rpc.utils.RpcResponse

package cn.tianjun.rpc.utils;

/**
 * 封装 RPC 响应
 * 封装相应object
 */
public class RpcResponse {

    private String requestId;
    private Throwable error;
    private Object result;

    public boolean isError() {
        return error != null;
    }

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public Throwable getError() {
        return error;
    }

    public void setError(Throwable error) {
        this.error = error;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }
}

cn.tianjun.rpc.utils.SerializationUtil

package cn.tianjun.rpc.utils;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.objenesis.Objenesis;
import org.objenesis.ObjenesisStd;

/**
 * 序列化工具类(基于 Protostuff 实现)
 *
 */
public class SerializationUtil {

    private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();

    private static Objenesis objenesis = new ObjenesisStd(true);

    private SerializationUtil() {
    }
    /**
     * 获取类的schema
     * @param cls
     * @return
     */
    @SuppressWarnings("unchecked")
    private static <T> Schema<T> getSchema(Class<T> cls) {
        Schema<T> schema = (Schema<T>) cachedSchema.get(cls);
        if (schema == null) {
            schema = RuntimeSchema.createFrom(cls);
            if (schema != null) {
                cachedSchema.put(cls, schema);
            }
        }
        return schema;
    }

    /**
     * 序列化(对象 -> 字节数组)
     */
    @SuppressWarnings("unchecked")
    public static <T> byte[] serialize(T obj) {
        Class<T> cls = (Class<T>) obj.getClass();
        LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
        try {
            Schema<T> schema = getSchema(cls);
            return ProtostuffIOUtil.toByteArray(obj, schema, buffer);//序列�?
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        } finally {
            buffer.clear();
        }
    }

    /**
     * 反序列化(字节数组 -> 对象)
     */
    public static <T> T deserialize(byte[] data, Class<T> cls) {
        try {
            /*
             * 如果一个类没有参数为空的构造方法时候,那么你直接调用newInstance方法试图得到一个实例对象的时候是会抛出异常的
             * 通过ObjenesisStd可以完美的避开这个问题
             * */
            T message = (T) objenesis.newInstance(cls);//实例化
            Schema<T> schema = getSchema(cls);//获取类的schema
            ProtostuffIOUtil.mergeFrom(data, message, schema);
            return message;
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }
}

3、protocol的实现

这个只是接口的定义,pom.xml里面为空。

cn.tianjun.rpc.protocol.HelloService

package cn.tianjun.rpc.protocol;

public interface HelloService {

    String hello(String name);

    String hello(Person person);
}

cn.tianjun.rpc.protocol.Person

package cn.tianjun.rpc.protocol;

public class Person {

    private String firstName;
    private String lastName;

    public Person() {
    }

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
"C:\Program Files\Java\jdk-23\bin\java.exe" "-javaagent:D:\Idea 2024\IntelliJ IDEA 2024.3.1.1\lib\idea_rt.jar=59742:D:\Idea 2024\IntelliJ IDEA 2024.3.1.1\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath "D:\code\FinalProject\Project\target\classes;D:\maven\local repository\org\apache\hbase\hbase-client\2.2.4\hbase-client-2.2.4.jar;D:\maven\local repository\org\apache\hbase\thirdparty\hbase-shaded-protobuf\2.2.1\hbase-shaded-protobuf-2.2.1.jar;D:\maven\local repository\org\apache\hbase\hbase-hadoop-compat\2.2.4\hbase-hadoop-compat-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-hadoop2-compat\2.2.4\hbase-hadoop2-compat-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-protocol-shaded\2.2.4\hbase-protocol-shaded-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-protocol\2.2.4\hbase-protocol-2.2.4.jar;D:\maven\local repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;D:\maven\local repository\commons-io\commons-io\2.5\commons-io-2.5.jar;D:\maven\local repository\org\apache\commons\commons-lang3\3.6\commons-lang3-3.6.jar;D:\maven\local repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\maven\local repository\org\apache\hbase\thirdparty\hbase-shaded-miscellaneous\2.2.1\hbase-shaded-miscellaneous-2.2.1.jar;D:\maven\local repository\com\google\errorprone\error_prone_annotations\2.3.3\error_prone_annotations-2.3.3.jar;D:\maven\local repository\com\google\protobuf\protobuf-java\2.5.0\protobuf-java-2.5.0.jar;D:\maven\local repository\org\apache\hbase\thirdparty\hbase-shaded-netty\2.2.1\hbase-shaded-netty-2.2.1.jar;D:\maven\local repository\org\apache\zookeeper\zookeeper\3.4.10\zookeeper-3.4.10.jar;D:\maven\local repository\org\apache\htrace\htrace-core4\4.2.0-incubating\htrace-core4-4.2.0-incubating.jar;D:\maven\local repository\org\jruby\jcodings\jcodings\1.0.18\jcodings-1.0.18.jar;D:\maven\local repository\org\jruby\joni\joni\2.1.11\joni-2.1.11.jar;D:\maven\local repository\io\dropwizard\metrics\metrics-core\3.2.6\metrics-core-3.2.6.jar;D:\maven\local repository\org\apache\commons\commons-crypto\1.0.0\commons-crypto-1.0.0.jar;D:\maven\local repository\org\apache\hadoop\hadoop-auth\2.8.5\hadoop-auth-2.8.5.jar;D:\maven\local repository\com\nimbusds\nimbus-jose-jwt\4.41.1\nimbus-jose-jwt-4.41.1.jar;D:\maven\local repository\com\github\stephenc\jcip\jcip-annotations\1.0-1\jcip-annotations-1.0-1.jar;D:\maven\local repository\org\apache\directory\server\apacheds-kerberos-codec\2.0.0-M15\apacheds-kerberos-codec-2.0.0-M15.jar;D:\maven\local repository\org\apache\directory\server\apacheds-i18n\2.0.0-M15\apacheds-i18n-2.0.0-M15.jar;D:\maven\local repository\org\apache\directory\api\api-asn1-api\1.0.0-M20\api-asn1-api-1.0.0-M20.jar;D:\maven\local repository\org\apache\directory\api\api-util\1.0.0-M20\api-util-1.0.0-M20.jar;D:\maven\local repository\org\apache\curator\curator-framework\2.7.1\curator-framework-2.7.1.jar;D:\maven\local repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;D:\maven\local repository\org\apache\hbase\hbase-common\2.2.4\hbase-common-2.2.4.jar;D:\maven\local repository\com\github\stephenc\findbugs\findbugs-annotations\1.3.9-1\findbugs-annotations-1.3.9-1.jar;D:\maven\local repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\maven\local repository\org\apache\hadoop\hadoop-common\2.8.5\hadoop-common-2.8.5.jar;D:\maven\local repository\org\apache\hadoop\hadoop-annotations\2.8.5\hadoop-annotations-2.8.5.jar;C:\Program Files\Java\jdk1.8.0_144\lib\tools.jar;D:\maven\local repository\com\google\guava\guava\11.0.2\guava-11.0.2.jar;D:\maven\local repository\commons-cli\commons-cli\1.2\commons-cli-1.2.jar;D:\maven\local repository\org\apache\commons\commons-math3\3.1.1\commons-math3-3.1.1.jar;D:\maven\local repository\xmlenc\xmlenc\0.52\xmlenc-0.52.jar;D:\maven\local repository\org\apache\httpcomponents\httpclient\4.5.2\httpclient-4.5.2.jar;D:\maven\local repository\org\apache\httpcomponents\httpcore\4.4.4\httpcore-4.4.4.jar;D:\maven\local repository\commons-net\commons-net\3.1\commons-net-3.1.jar;D:\maven\local repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\maven\local repository\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar;D:\maven\local repository\org\mortbay\jetty\jetty\6.1.26\jetty-6.1.26.jar;D:\maven\local repository\org\mortbay\jetty\jetty-util\6.1.26\jetty-util-6.1.26.jar;D:\maven\local repository\org\mortbay\jetty\jetty-sslengine\6.1.26\jetty-sslengine-6.1.26.jar;D:\maven\local repository\javax\servlet\jsp\jsp-api\2.1\jsp-api-2.1.jar;D:\maven\local repository\com\sun\jersey\jersey-core\1.9\jersey-core-1.9.jar;D:\maven\local repository\com\sun\jersey\jersey-json\1.9\jersey-json-1.9.jar;D:\maven\local repository\org\codehaus\jettison\jettison\1.1\jettison-1.1.jar;D:\maven\local repository\com\sun\xml\bind\jaxb-impl\2.2.3-1\jaxb-impl-2.2.3-1.jar;D:\maven\local repository\org\codehaus\jackson\jackson-jaxrs\1.8.3\jackson-jaxrs-1.8.3.jar;D:\maven\local repository\org\codehaus\jackson\jackson-xc\1.8.3\jackson-xc-1.8.3.jar;D:\maven\local repository\com\sun\jersey\jersey-server\1.9\jersey-server-1.9.jar;D:\maven\local repository\asm\asm\3.1\asm-3.1.jar;D:\maven\local repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;D:\maven\local repository\net\java\dev\jets3t\jets3t\0.9.0\jets3t-0.9.0.jar;D:\maven\local repository\com\jamesmurty\utils\java-xmlbuilder\0.4\java-xmlbuilder-0.4.jar;D:\maven\local repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\maven\local repository\commons-configuration\commons-configuration\1.6\commons-configuration-1.6.jar;D:\maven\local repository\commons-digester\commons-digester\1.8\commons-digester-1.8.jar;D:\maven\local repository\commons-beanutils\commons-beanutils\1.7.0\commons-beanutils-1.7.0.jar;D:\maven\local repository\commons-beanutils\commons-beanutils-core\1.8.0\commons-beanutils-core-1.8.0.jar;D:\maven\local repository\org\slf4j\slf4j-log4j12\1.7.10\slf4j-log4j12-1.7.10.jar;D:\maven\local repository\org\apache\avro\avro\1.7.4\avro-1.7.4.jar;D:\maven\local repository\com\thoughtworks\paranamer\paranamer\2.3\paranamer-2.3.jar;D:\maven\local repository\org\xerial\snappy\snappy-java\1.0.4.1\snappy-java-1.0.4.1.jar;D:\maven\local repository\com\jcraft\jsch\0.1.54\jsch-0.1.54.jar;D:\maven\local repository\org\apache\curator\curator-client\2.7.1\curator-client-2.7.1.jar;D:\maven\local repository\org\apache\curator\curator-recipes\2.7.1\curator-recipes-2.7.1.jar;D:\maven\local repository\com\google\code\findbugs\jsr305\3.0.0\jsr305-3.0.0.jar;D:\maven\local repository\org\apache\commons\commons-compress\1.4.1\commons-compress-1.4.1.jar;D:\maven\local repository\org\tukaani\xz\1.0\xz-1.0.jar;D:\maven\local repository\org\apache\maven\archetypes\maven-archetype-quickstart\1.1\maven-archetype-quickstart-1.1.jar;D:\maven\local repository\org\apache\hbase\hbase-mapreduce\2.2.4\hbase-mapreduce-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-zookeeper\2.2.4\hbase-zookeeper-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-metrics\2.2.4\hbase-metrics-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-metrics-api\2.2.4\hbase-metrics-api-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-server\2.2.4\hbase-server-2.2.4.jar;D:\maven\local repository\org\apache\hbase\hbase-http\2.2.4\hbase-http-2.2.4.jar;D:\maven\local repository\org\eclipse\jetty\jetty-util\9.3.27.v20190418\jetty-util-9.3.27.v20190418.jar;D:\maven\local repository\org\eclipse\jetty\jetty-util-ajax\9.3.27.v20190418\jetty-util-ajax-9.3.27.v20190418.jar;D:\maven\local repository\org\eclipse\jetty\jetty-http\9.3.27.v20190418\jetty-http-9.3.27.v20190418.jar;D:\maven\local repository\org\eclipse\jetty\jetty-security\9.3.27.v20190418\jetty-security-9.3.27.v20190418.jar;D:\maven\local repository\org\glassfish\jersey\core\jersey-server\2.25.1\jersey-server-2.25.1.jar;D:\maven\local repository\org\glassfish\jersey\core\jersey-common\2.25.1\jersey-common-2.25.1.jar;D:\maven\local repository\org\glassfish\jersey\bundles\repackaged\jersey-guava\2.25.1\jersey-guava-2.25.1.jar;D:\maven\local repository\org\glassfish\hk2\osgi-resource-locator\1.0.1\osgi-resource-locator-1.0.1.jar;D:\maven\local repository\org\glassfish\jersey\core\jersey-client\2.25.1\jersey-client-2.25.1.jar;D:\maven\local repository\org\glassfish\jersey\media\jersey-media-jaxb\2.25.1\jersey-media-jaxb-2.25.1.jar;D:\maven\local repository\javax\annotation\javax.annotation-api\1.2\javax.annotation-api-1.2.jar;D:\maven\local repository\org\glassfish\hk2\hk2-api\2.5.0-b32\hk2-api-2.5.0-b32.jar;D:\maven\local repository\org\glassfish\hk2\hk2-utils\2.5.0-b32\hk2-utils-2.5.0-b32.jar;D:\maven\local repository\org\glassfish\hk2\external\aopalliance-repackaged\2.5.0-b32\aopalliance-repackaged-2.5.0-b32.jar;D:\maven\local repository\org\glassfish\hk2\external\javax.inject\2.5.0-b32\javax.inject-2.5.0-b32.jar;D:\maven\local repository\org\glassfish\hk2\hk2-locator\2.5.0-b32\hk2-locator-2.5.0-b32.jar;D:\maven\local repository\org\javassist\javassist\3.20.0-GA\javassist-3.20.0-GA.jar;D:\maven\local repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\maven\local repository\org\glassfish\jersey\containers\jersey-container-servlet-core\2.25.1\jersey-container-servlet-core-2.25.1.jar;D:\maven\local repository\javax\ws\rs\javax.ws.rs-api\2.0.1\javax.ws.rs-api-2.0.1.jar;D:\maven\local repository\org\apache\hbase\hbase-procedure\2.2.4\hbase-procedure-2.2.4.jar;D:\maven\local repository\org\eclipse\jetty\jetty-server\9.3.27.v20190418\jetty-server-9.3.27.v20190418.jar;D:\maven\local repository\org\eclipse\jetty\jetty-io\9.3.27.v20190418\jetty-io-9.3.27.v20190418.jar;D:\maven\local repository\org\eclipse\jetty\jetty-servlet\9.3.27.v20190418\jetty-servlet-9.3.27.v20190418.jar;D:\maven\local repository\org\eclipse\jetty\jetty-webapp\9.3.27.v20190418\jetty-webapp-9.3.27.v20190418.jar;D:\maven\local repository\org\eclipse\jetty\jetty-xml\9.3.27.v20190418\jetty-xml-9.3.27.v20190418.jar;D:\maven\local repository\org\glassfish\web\javax.servlet.jsp\2.3.2\javax.servlet.jsp-2.3.2.jar;D:\maven\local repository\org\glassfish\javax.el\3.0.1-b12\javax.el-3.0.1-b12.jar;D:\maven\local repository\javax\servlet\jsp\javax.servlet.jsp-api\2.3.1\javax.servlet.jsp-api-2.3.1.jar;D:\maven\local repository\org\jamon\jamon-runtime\2.4.1\jamon-runtime-2.4.1.jar;D:\maven\local repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;D:\maven\local repository\com\lmax\disruptor\3.3.6\disruptor-3.3.6.jar;D:\maven\local repository\org\apache\hadoop\hadoop-distcp\2.8.5\hadoop-distcp-2.8.5.jar;D:\maven\local repository\org\apache\hbase\hbase-replication\2.2.4\hbase-replication-2.2.4.jar;D:\maven\local repository\org\apache\hadoop\hadoop-hdfs\2.8.5\hadoop-hdfs-2.8.5.jar;D:\maven\local repository\org\apache\hadoop\hadoop-hdfs-client\2.8.5\hadoop-hdfs-client-2.8.5.jar;D:\maven\local repository\com\squareup\okhttp\okhttp\2.4.0\okhttp-2.4.0.jar;D:\maven\local repository\com\squareup\okio\okio\1.4.0\okio-1.4.0.jar;D:\maven\local repository\commons-daemon\commons-daemon\1.0.13\commons-daemon-1.0.13.jar;D:\maven\local repository\io\netty\netty-all\4.0.23.Final\netty-all-4.0.23.Final.jar;D:\maven\local repository\org\fusesource\leveldbjni\leveldbjni-all\1.8\leveldbjni-all-1.8.jar;D:\maven\local repository\org\apache\hadoop\hadoop-mapreduce-client-core\2.8.5\hadoop-mapreduce-client-core-2.8.5.jar;D:\maven\local repository\com\google\inject\extensions\guice-servlet\3.0\guice-servlet-3.0.jar;D:\maven\local repository\io\netty\netty\3.6.2.Final\netty-3.6.2.Final.jar;D:\maven\local repository\org\apache\hadoop\hadoop-yarn-client\2.8.1\hadoop-yarn-client-2.8.1.jar;D:\maven\local repository\org\apache\hadoop\hadoop-yarn-api\2.8.1\hadoop-yarn-api-2.8.1.jar;D:\maven\local repository\org\apache\hadoop\hadoop-yarn-common\2.8.1\hadoop-yarn-common-2.8.1.jar;D:\maven\local repository\javax\xml\bind\jaxb-api\2.2.2\jaxb-api-2.2.2.jar;D:\maven\local repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;D:\maven\local repository\javax\activation\activation\1.1\activation-1.1.jar;D:\maven\local repository\com\sun\jersey\jersey-client\1.9\jersey-client-1.9.jar;D:\maven\local repository\com\google\inject\guice\3.0\guice-3.0.jar;D:\maven\local repository\javax\inject\javax.inject\1\javax.inject-1.jar;D:\maven\local repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;D:\maven\local repository\com\sun\jersey\contribs\jersey-guice\1.9\jersey-guice-1.9.jar;D:\maven\local repository\org\codehaus\jackson\jackson-core-asl\1.9.13\jackson-core-asl-1.9.13.jar;D:\maven\local repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar;D:\maven\local repository\com\alibaba\fastjson2\fastjson2-extension\2.0.23\fastjson2-extension-2.0.23.jar;D:\maven\local repository\com\alibaba\fastjson2\fastjson2\2.0.23\fastjson2-2.0.23.jar;D:\maven\local repository\com\google\code\gson\gson\2.10.1\gson-2.10.1.jar;D:\maven\local repository\taglibs\standard\1.1.2\standard-1.1.2.jar;D:\maven\local repository\jakarta\servlet\jsp\jakarta.servlet.jsp-api\3.1.0\jakarta.servlet.jsp-api-3.1.0.jar" org.example.controller.BrandAmountServlet log4j:WARN No appenders could be found for logger (org.apache.hadoop.security.Groups). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. java.lang.UnsupportedOperationException: getSubject is supported only if a security manager is allowed at java.base/javax.security.auth.Subject.getSubject(Subject.java:347) at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:678) at org.apache.hadoop.hbase.security.User$SecureHadoopUser.<init>(User.java:300) at org.apache.hadoop.hbase.security.User.getCurrent(User.java:173) at org.apache.hadoop.hbase.security.UserProvider.getCurrent(UserProvider.java:187) at org.apache.hadoop.hbase.AuthUtil.loginClient(AuthUtil.java:107) at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:128) at org.example.util.HBaseUtils.getConnection(HBaseUtils.java:30) at org.example.util.HBaseUtils.scanData(HBaseUtils.java:83) at org.example.dao.BrandAmountImpl.SelectBrandAmount(BrandAmountImpl.java:14) at org.example.controller.BrandAmountServlet.main(BrandAmountServlet.java:36) null Process finished with exit code 0
06-08
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值