├── .gitignore
├── .travis.yml
├── Dockerfile-krpc
├── LICENSE
├── README.md
├── com.krpc.client
├── pom.xml
└── src
│ ├── main
│ └── java
│ │ └── com
│ │ └── krpc
│ │ └── client
│ │ ├── KRPC.java
│ │ ├── core
│ │ ├── LoadBalance.java
│ │ ├── RequestHandler.java
│ │ └── ZkRegisterCenter.java
│ │ ├── entity
│ │ ├── Address.java
│ │ └── ServiceParams.java
│ │ ├── net
│ │ ├── ReceiverData.java
│ │ ├── TCPClient.java
│ │ └── TcpClientHandler.java
│ │ └── proxy
│ │ ├── ProxyFactory.java
│ │ └── ProxyHandler.java
│ └── test
│ └── java
│ └── com
│ └── krpc
│ └── client
│ ├── CDLTest.java
│ ├── Function.java
│ ├── KRPCTest.java
│ ├── TCP.java
│ └── pool
│ ├── DataReceiverHandler.java
│ ├── KRPCSocket.java
│ ├── PoolTest.java
│ └── ReceiverData.java
├── com.krpc.common
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── krpc
│ └── common
│ ├── entity
│ ├── Request.java
│ ├── Response.java
│ └── ZookeeperInfo.java
│ ├── protocal
│ └── ProtocalConst.java
│ ├── serializer
│ ├── HessianUtil.java
│ ├── ObjectInputStreamWithLoader.java
│ └── SerializeUtil.java
│ └── util
│ ├── CompressUtil.java
│ ├── ContextUtil.java
│ └── FileUtil.java
├── com.krpc.server
├── conf
│ └── log4j.xml
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── krpc
│ │ │ └── server
│ │ │ ├── BootStrap.java
│ │ │ ├── core
│ │ │ ├── LoadConfigure.java
│ │ │ ├── RequestHandler.java
│ │ │ └── ServiceInvoke.java
│ │ │ ├── entity
│ │ │ └── Global.java
│ │ │ ├── netty
│ │ │ └── ServerHandler.java
│ │ │ └── register
│ │ │ └── ZkRegisterCenter.java
│ └── resources
│ │ └── META-INF
│ │ └── MANIFEST.MF
│ └── test
│ └── java
│ └── com
│ └── krpc
│ └── server
│ ├── BootStrapTest.java
│ ├── core
│ ├── ClassLoaderTest.java
│ ├── MyClassLoader.java
│ └── ZKTest.java
│ ├── entity
│ └── User1.java
│ ├── netty
│ ├── MyServerHandler.java
│ ├── Server.java
│ ├── TCPClient.java
│ ├── TcpClientHandler.java
│ ├── TcpServer.java
│ ├── TcpServerHandler.java
│ ├── TimeClient.java
│ ├── TimeClientHandler.java
│ └── TimeServerHandler.java
│ ├── serializer
│ └── SerializerTest.java
│ └── util
│ └── Dom4JTest.java
├── demo
├── com.a123.call
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── com
│ │ │ └── a123
│ │ │ └── com
│ │ │ └── a123
│ │ │ └── call
│ │ │ └── App.java
│ │ ├── resources
│ │ └── client.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── a123
│ │ └── com
│ │ └── a123
│ │ └── call
│ │ └── AppTest.java
├── com.a123.service.user.impl
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── com
│ │ │ └── a123
│ │ │ └── service
│ │ │ └── user
│ │ │ └── impl
│ │ │ └── UserServiceImpl.java
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── a123
│ │ └── service
│ │ └── user
│ │ └── impl
│ │ └── AppTest.java
├── com.a123.service.user
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── com
│ │ │ └── a123
│ │ │ └── service
│ │ │ └── user
│ │ │ ├── contract
│ │ │ └── UserService.java
│ │ │ └── entity
│ │ │ └── User.java
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── a123
│ │ └── service
│ │ └── user
│ │ └── AppTest.java
└── config_file_template
│ ├── client
│ └── client.xml
│ └── server
│ ├── log4j.xml
│ └── service.xml
├── docker
├── README.md
├── krpc
│ └── Dockerfile
└── user-server
│ ├── Dockerfile-template
│ └── user.tar.gz
├── logo.png
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 |
3 | # Package Files #
4 | *.jar
5 | *.war
6 | *.ear
7 | *.classpath
8 | *.project
9 | *.prefs
10 | pom.properties
11 | */target/
12 | */.idea/
13 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: java
2 |
3 | jdk:
4 | - oraclejdk8
--------------------------------------------------------------------------------
/Dockerfile-krpc:
--------------------------------------------------------------------------------
1 | from java:8
2 |
3 | maintainer yasin 1334036616@qq.com
4 |
5 | add krpc.tar.gz /opt/
6 |
7 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Yasin
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 | [](https://hub.docker.com/r/yangzhenkun/krpc/)
3 | [](https://www.travis-ci.org/yangzhenkun/krpc)
4 |
5 |
6 | 
7 |
8 | ### 如何使用
9 |
10 | 编译好的服务端环境 [release](https://github.com/yangzhenkun/krpc/releases/tag/1.0)
11 |
12 | #### 1.服务端
13 | 解压后server文件夹中就是服务端环境,如demo所示,server/service中有一个user文件,就是我们部署的user服务,下面有两个必须的文件夹conf(配置文件)
14 |
15 | log4j.xml是该服务日志的标准的log4j配置文件,如果想修改日志路径
16 | ```xml
17 |
18 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | ```
29 | 修改值即可
30 |
31 | server.xml文件为服务的配置文件
32 |
33 | ```xml
34 |
35 |
36 |
37 |
38 | 127.0.0.1:2181,127.0.0.1:3333
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | ```
60 | 一个服务中所有对外的接口必须在services中配置,规则如上注释所示。
61 |
62 | 编写服务端代码会需要一个接口包和一个实现包,将源码生成jar包后,放在server/service/user/lib中,这里以user服务为例,你可以自己定义这个文件名的名字来标识这个服务。
63 |
64 | **启动**
65 | 启动在server/bin里面,执行
66 | ```
67 | java -jar com.krpc.server-0.0.1.jar 服务名
68 | ```
69 | 命令,查看日志,如果看到 启动成功,监听端口*** 的日志,恭喜你,服务端启动成功。
70 |
71 | #### docker 启动服务
72 |
73 | https://github.com/yangzhenkun/krpc/tree/master/docker
74 |
75 | krpc提供了服务端镜像,所以每个服务都可以在krpc提供的dockerfile模版中进行修改构建自己的服务镜像
76 |
77 | #### 2.客户端
78 | 需要引入KRPC客户端,由于项目还没有发布到maven中央仓库,用户可以将client包发布到自己本地,或者直接将该com.krpc.client-0.0.1.jar包加入项目。
79 |
80 | 使用需要先调用KRPC.init("client配置文件")进行初始化
81 | 配置在client/client.xml中
82 |
83 | ```xml
84 |
85 |
86 |
87 | 127.0.0.1:2181,127.0.0.1:3333
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 | ```
102 |
103 | sercie的name的值必须
104 | ```java
105 |
106 | UserService service = ProxyFactory.create(UserService.class, "user", "userService");
107 |
108 | ```
109 | 跟create中第二个参数一直。第三个参数为服务端实现的名字,需要跟服务端的配置文件一直。
110 |
111 |
112 |
113 | #### 3.要注意的事情
114 |
115 | krpc.rar中的krpc相关包均为上面源码中生成
116 |
117 | 配置文件模板:https://github.com/yangzhenkun/krpc/tree/master/demo/config_file_template
118 |
119 |
120 | **这个RPC框架是我自己造轮子学习的,并没有真实在生产环境中使用,所以看到这个项目,希望大家可以交流学习技术,提交pr,issue,完善其性能及功能,争取让它可以用于生产环境**
121 |
122 | 我个人博客中关于RPC及这个KRPC的源码原理解析会在这个专栏中写道
123 | https://blog.csdn.net/column/details/22012.html
124 |
--------------------------------------------------------------------------------
/com.krpc.client/pom.xml:
--------------------------------------------------------------------------------
1 |
3 | 4.0.0
4 |
5 | com.krpc
6 | com.krpc.client
7 | 0.0.2
8 | jar
9 |
10 | com.krpc.client
11 | http://maven.apache.org
12 |
13 |
14 | UTF-8
15 |
16 |
17 |
18 |
19 |
20 | org.apache.commons
21 | commons-pool2
22 | 2.4.3
23 |
24 |
25 |
26 | com.krpc
27 | com.krpc.common
28 | 0.0.2
29 |
30 |
31 | junit
32 | junit
33 | 4.11
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | org.apache.maven.plugins
44 | maven-surefire-plugin
45 | 2.18.1
46 |
47 | true
48 |
49 |
50 |
51 | org.apache.maven.plugins
52 | maven-compiler-plugin
53 | 3.1
54 |
55 | 1.8
56 | 1.8
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/KRPC.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client;
2 |
3 | import com.krpc.client.core.ZkRegisterCenter;
4 | import com.krpc.client.entity.Address;
5 | import com.krpc.client.entity.ServiceParams;
6 | import com.krpc.common.entity.ZookeeperInfo;
7 | import org.dom4j.Document;
8 | import org.dom4j.Element;
9 | import org.dom4j.io.SAXReader;
10 |
11 | import java.io.File;
12 | import java.util.ArrayList;
13 | import java.util.List;
14 |
15 | /**
16 | * _ _______ _____ _____
17 | * | |/ | __ \| __ \ / ____|
18 | * | ' /| |__) | |__) | |
19 | * | < | _ /| ___/| |
20 | * | . \| | \ \| | | |____
21 | * |_|\_|_| \_|_| \_____|
22 | *
23 | * @author yangzhenkun
24 | */
25 |
26 |
27 | public class KRPC {
28 |
29 | /**
30 | * 初始化客户端配置文件
31 | *
32 | * @param clientPath
33 | * @throws Exception
34 | */
35 | public static void init(String clientPath) throws Exception {
36 |
37 | // 读取该服务的配置文件
38 | SAXReader reader = new SAXReader();
39 | Document document = reader.read(new File(clientPath));
40 | Element root = document.getRootElement();
41 |
42 | List serviceNodes = root.elements("Service");
43 |
44 | ZookeeperInfo zookeeperInfo = ZookeeperInfo.createByElement(root);
45 | if (zookeeperInfo != null) {
46 | ZkRegisterCenter.init(zookeeperInfo);
47 | }
48 |
49 | /**
50 | * 解析所有服务配置信息
51 | */
52 | for (Element serviceNode : serviceNodes) {
53 | String serverName = serviceNode.attributeValue("name");
54 | ServiceParams serviceParams = new ServiceParams(serverName);
55 | serviceParams.setServiceName(serverName);
56 | serviceParams.setTimeout(Integer.valueOf(serviceNode.attributeValue("timeout")));
57 |
58 | /**
59 | * 如果配置了注册中心,直接获取
60 | */
61 | if (zookeeperInfo != null) {
62 | serviceParams.setAddresses(ZkRegisterCenter.getServerAddr(serverName));
63 | }
64 |
65 | /**
66 | * 解析直连ip,如果使用注册中心会覆盖zk中的配置信息
67 | */
68 | Element loadBalanceNode = serviceNode.element("Loadbalance");
69 | if (loadBalanceNode != null) {
70 |
71 | Element serverNode = loadBalanceNode.element("Server");
72 | List addrNodes = serverNode.elements("addr");
73 | List addresses = serviceParams.getAddresses();
74 | if (addresses != null && addresses.size() > 0) {
75 | addresses.clear();
76 | } else {
77 | addresses = new ArrayList<>();
78 | }
79 | for (Element addrNode : addrNodes) {
80 | Address addr = new Address();
81 | addr.setName(addrNode.attributeValue("name"));
82 | addr.setHost(addrNode.attributeValue("host"));
83 | addr.setPort(Integer.parseInt(addrNode.attributeValue("port")));
84 | addresses.add(addr);
85 | }
86 |
87 | serviceParams.setAddresses(addresses);
88 | }
89 |
90 | }
91 |
92 | }
93 |
94 | }
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/core/LoadBalance.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.core;
2 |
3 | import java.util.concurrent.atomic.AtomicInteger;
4 |
5 | import com.krpc.client.KRPC;
6 | import com.krpc.client.entity.Address;
7 | import com.krpc.client.entity.ServiceParams;
8 |
9 | /**
10 | * 负载均衡相关
11 | * @author yangzhenkun
12 | *
13 | */
14 | public class LoadBalance {
15 |
16 | /**
17 | * 获取一个服务地址
18 | * 策略:随机
19 | * @param serviceName
20 | * @return
21 | */
22 | public static Address loadbalanceRandom(String serviceName){
23 | ServiceParams serviceParams = ServiceParams.getService(serviceName);
24 | int total = serviceParams.getAddresses().size();
25 | int index = (int) (System.currentTimeMillis()%total);
26 |
27 | return serviceParams.getAddresses().get(index);
28 | }
29 |
30 | private static AtomicInteger count = new AtomicInteger(0);
31 |
32 |
33 | public static Address loadbalanceUniformity(String serviceName) {
34 | ServiceParams serviceParams = ServiceParams.getService(serviceName);
35 | int total = serviceParams.getAddresses().size();
36 | count.weakCompareAndSet(Integer.MAX_VALUE,0);
37 | return serviceParams.getAddresses().get(count.getAndIncrement()%total);
38 |
39 |
40 | }
41 |
42 |
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/core/RequestHandler.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.core;
2 |
3 | import com.krpc.client.entity.Address;
4 | import com.krpc.client.entity.ServiceParams;
5 | import com.krpc.client.net.TCPClient;
6 | import com.krpc.common.entity.Request;
7 | import com.krpc.common.serializer.HessianUtil;
8 | import com.krpc.common.util.CompressUtil;
9 | import org.slf4j.Logger;
10 | import org.slf4j.LoggerFactory;
11 |
12 | import java.io.IOException;
13 | import java.util.Map;
14 | import java.util.Objects;
15 | import java.util.concurrent.ConcurrentHashMap;
16 |
17 | /**
18 | * 选择服务,进行tcp请求
19 | *
20 | * @author yangzhenkun
21 | */
22 | public class RequestHandler {
23 |
24 | private static Logger log = LoggerFactory.getLogger(RequestHandler.class);
25 |
26 | private static Map tcpClientCache = new ConcurrentHashMap();
27 |
28 | private static Object lockHelper = new Object();
29 |
30 | public static Object request(String serviceName, Request request, Class returnType) throws Exception {
31 |
32 | Address addr = LoadBalance.loadbalanceRandom(serviceName);
33 |
34 | byte[] requestBytes = CompressUtil.compress(HessianUtil.serialize(request));
35 |
36 | TCPClient tcpClient = getTCPClient(addr, ServiceParams.getService(serviceName).getTimeout());
37 |
38 | log.debug("客户端发送数据:{}", requestBytes.length);
39 | Integer sessionID = tcpClient.sendMsg(requestBytes);
40 | if (Objects.isNull(sessionID)) {
41 | throw new Exception("send data error!");
42 | }
43 |
44 | byte[] responseBytessrc = tcpClient.getData(sessionID);
45 | return HessianUtil.deserialize(CompressUtil.uncompress(responseBytessrc), null);
46 | }
47 |
48 | private static TCPClient getTCPClient(Address address, Integer timeout) throws IOException {
49 | TCPClient tcpClient = tcpClientCache.get(address);
50 | if (Objects.isNull(tcpClient)) {
51 |
52 | synchronized (lockHelper) {
53 | tcpClient = tcpClientCache.get(address);
54 | if (Objects.isNull(tcpClient)) {
55 | tcpClient = new TCPClient(address.getHost(), address.getPort(), timeout);
56 | tcpClientCache.put(address, tcpClient);
57 | }
58 |
59 | }
60 |
61 | }
62 |
63 | return tcpClient;
64 | }
65 |
66 | }
67 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/core/ZkRegisterCenter.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.core;
2 |
3 | import com.krpc.client.entity.Address;
4 | import com.krpc.client.entity.ServiceParams;
5 | import com.krpc.common.entity.ZookeeperInfo;
6 | import org.I0Itec.zkclient.IZkChildListener;
7 | import org.I0Itec.zkclient.ZkClient;
8 | import org.slf4j.Logger;
9 | import org.slf4j.LoggerFactory;
10 |
11 | import java.util.ArrayList;
12 | import java.util.List;
13 |
14 | /**
15 | * @author yangzhenkun
16 | * @create 2018-11-26 14:12
17 | */
18 | public class ZkRegisterCenter {
19 |
20 | private static Logger log = LoggerFactory.getLogger(ZkRegisterCenter.class);
21 | private static ZkClient zc = null;
22 |
23 | public static void init(ZookeeperInfo zookeeperInfo) {
24 | if (zc != null) {
25 | return;
26 | }
27 |
28 | try {
29 | zc = new ZkClient(zookeeperInfo.getAddr(), zookeeperInfo.getSessionTimeOut(), zookeeperInfo.getConnectionTimeOut());
30 | } catch (Exception e) {
31 | e.printStackTrace();
32 | log.error("zk init error!", e);
33 | }
34 | }
35 |
36 | public static List getServerAddr(String serverName) {
37 |
38 |
39 | List addresses = new ArrayList<>();
40 | try {
41 | StringBuffer path = new StringBuffer("/krpc/");
42 | path.append(serverName);
43 |
44 | List serverlist = zc.getChildren(path.toString());
45 |
46 | if (serverlist != null && serverlist.size() > 0) {
47 | for (String ipport : serverlist) {
48 | String[] content = ipport.split(":");
49 | Address address = new Address();
50 | address.setHost(content[0]);
51 | address.setPort(Integer.valueOf(content[1]));
52 | addresses.add(address);
53 | }
54 |
55 | }
56 |
57 | subscribe(serverName);
58 | } catch (Exception e) {
59 | log.error("get server config from zk error!", e);
60 | } finally {
61 |
62 | return addresses;
63 | }
64 | }
65 |
66 | /**
67 | * 订阅
68 | *
69 | * @param serverName
70 | */
71 | public static void subscribe(String serverName) {
72 |
73 | ServiceParams serviceParams = ServiceParams.getService(serverName);
74 | StringBuffer path = new StringBuffer("/krpc/");
75 | path.append(serverName);
76 | zc.subscribeChildChanges(path.toString(), new IZkChildListener() {
77 | @Override
78 | public void handleChildChange(String s, List list) throws Exception {
79 |
80 | System.out.println("server change===" + list);
81 | if (list != null && list.size() > 0) {
82 | List newAddr = new ArrayList<>(list.size());
83 | for (String ipport : list) {
84 | String[] content = ipport.split(":");
85 | Address address = new Address();
86 | address.setHost(content[0]);
87 | address.setPort(Integer.valueOf(content[1]));
88 |
89 | newAddr.add(address);
90 | }
91 |
92 | serviceParams.setAddresses(newAddr);
93 | log.info("{} server change,content={}", serverName, list.toString());
94 | } else {
95 | serviceParams.getAddresses().clear();
96 | log.info("{} server change,no able server!", serverName);
97 | }
98 |
99 | }
100 | });
101 |
102 | }
103 |
104 |
105 | }
106 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/entity/Address.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.entity;
2 |
3 | /**
4 | * 连接参数
5 | * @author yangzhenkun
6 | *
7 | */
8 | public class Address {
9 |
10 | private String name;
11 | private String host;
12 | private Integer port;
13 |
14 |
15 | public String getName() {
16 | return name;
17 | }
18 | public String getHost() {
19 | return host;
20 | }
21 | public Integer getPort() {
22 | return port;
23 | }
24 | public void setName(String name) {
25 | this.name = name;
26 | }
27 | public void setHost(String host) {
28 | this.host = host;
29 | }
30 | public void setPort(Integer port) {
31 | this.port = port;
32 | }
33 |
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/entity/ServiceParams.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.entity;
2 |
3 | import java.util.ArrayList;
4 | import java.util.HashMap;
5 | import java.util.List;
6 | import java.util.Map;
7 |
8 | /**
9 | * 服务参数
10 | *
11 | * @author yangzhenkun
12 | */
13 | public class ServiceParams {
14 |
15 | private static Map serviceCache = new HashMap();
16 |
17 | private int timeout;
18 | private List addresses;
19 | private String serviceName;
20 |
21 | public ServiceParams(String serverName){
22 | this.serviceName=serverName;
23 | }
24 |
25 | public List getAddresses() {
26 | return addresses;
27 | }
28 |
29 | public String getServiceName() {
30 | return serviceName;
31 | }
32 |
33 | public void setAddresses(List addresses) {
34 | this.addresses = addresses;
35 | serviceCache.put(serviceName,this);
36 | }
37 |
38 | public void setServiceName(String serviceName) {
39 | this.serviceName = serviceName;
40 | serviceCache.put(serviceName,this);
41 | }
42 |
43 |
44 | public int getTimeout() {
45 | return timeout;
46 | }
47 |
48 | public void setTimeout(int timeout) {
49 | this.timeout = timeout;
50 | serviceCache.put(serviceName,this);
51 | }
52 |
53 | public static ServiceParams getService(String serviceName){
54 | return serviceCache.get(serviceName);
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/net/ReceiverData.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.net;
2 |
3 | import java.util.concurrent.CountDownLatch;
4 | import java.util.concurrent.TimeUnit;
5 |
6 | /**
7 | * @author: yangzhenkun01
8 | * @Date: 2018/6/19
9 | */
10 | public class ReceiverData {
11 |
12 | /**
13 | * 服务端返回来的数据
14 | */
15 | private byte[] data;
16 |
17 | /**
18 | * 用于阻塞查询数据的
19 | */
20 | private CountDownLatch countDownLatch;
21 |
22 | public ReceiverData() {
23 | countDownLatch = new CountDownLatch(1);
24 | }
25 |
26 | public byte[] getData(long waitTime) throws InterruptedException {
27 |
28 | countDownLatch.await(waitTime,TimeUnit.MILLISECONDS);
29 |
30 | return data;
31 | }
32 |
33 | public void setData(byte[] data) {
34 | this.data = data;
35 | countDownLatch.countDown();
36 | }
37 |
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/net/TCPClient.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.net;
2 |
3 | import java.util.Map;
4 | import java.util.Objects;
5 | import java.util.concurrent.ConcurrentHashMap;
6 | import java.util.concurrent.atomic.AtomicInteger;
7 |
8 | import org.slf4j.Logger;
9 | import org.slf4j.LoggerFactory;
10 |
11 | import com.krpc.client.core.RequestHandler;
12 | import com.krpc.common.util.ContextUtil;
13 |
14 | import io.netty.bootstrap.Bootstrap;
15 | import io.netty.channel.Channel;
16 | import io.netty.channel.ChannelInitializer;
17 | import io.netty.channel.ChannelPipeline;
18 | import io.netty.channel.EventLoopGroup;
19 | import io.netty.channel.nio.NioEventLoopGroup;
20 | import io.netty.channel.socket.nio.NioSocketChannel;
21 | import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
22 | import io.netty.handler.codec.LengthFieldPrepender;
23 | import io.netty.handler.codec.bytes.ByteArrayDecoder;
24 | import io.netty.handler.codec.bytes.ByteArrayEncoder;
25 |
26 | public class TCPClient {
27 |
28 | private Logger log = LoggerFactory.getLogger(this.getClass());
29 | private AtomicInteger sessionId = new AtomicInteger(0);
30 |
31 | private Map receiverDataWindow = new ConcurrentHashMap();
32 |
33 | private Bootstrap bootstrap;
34 |
35 | private Channel channel;
36 |
37 | private Integer timeout;
38 |
39 | /**
40 | * 初始化Bootstrap
41 | *
42 | * @return
43 | */
44 | public Bootstrap getBootstrap() {
45 | EventLoopGroup group = new NioEventLoopGroup();
46 | Bootstrap b = new Bootstrap();
47 | b.group(group).channel(NioSocketChannel.class);
48 | TcpClientHandler tcpClientHandler = new TcpClientHandler(TCPClient.this);
49 | b.handler(new ChannelInitializer() {
50 | @Override
51 | protected void initChannel(Channel ch) throws Exception {
52 | ChannelPipeline pipeline = ch.pipeline();
53 | pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
54 | pipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
55 | pipeline.addLast("decoder", new ByteArrayDecoder());
56 | pipeline.addLast("encoder", new ByteArrayEncoder());
57 | pipeline.addLast("handler", tcpClientHandler);
58 | }
59 | });
60 | return b;
61 | }
62 |
63 |
64 | public TCPClient(String host,Integer port,Integer timeout){
65 | this.channel = getChannel(host, port);
66 | this.timeout=timeout;
67 |
68 | }
69 |
70 | private Channel getChannel(String host, int port) {
71 | try {
72 | bootstrap = getBootstrap();
73 | channel = bootstrap.connect(host, port).sync().channel();
74 | } catch (Exception e) {
75 | log.error("连接Server(IP{},PORT{})失败", host, port);
76 | return null;
77 | }
78 | return channel;
79 | }
80 |
81 | public Integer sendMsg(byte[] msg) throws Exception {
82 | if (channel != null) {
83 | Integer sessionID = createSessionID();
84 | byte[] sendData = ContextUtil.mergeSessionID(sessionID, msg);
85 | ReceiverData receiverData = new ReceiverData();
86 | receiverDataWindow.put(sessionID, receiverData);
87 | channel.writeAndFlush(sendData).sync();
88 | return sessionID;
89 | } else {
90 | log.error("消息发送失败,连接尚未建立!");
91 | return null;
92 | }
93 | }
94 |
95 | /**
96 | * 获取返回数据接口
97 | *
98 | * @return
99 | */
100 | public byte[] getData(int sessionId) throws Exception {
101 |
102 | ReceiverData receiverData = receiverDataWindow.get(sessionId);
103 | if (Objects.isNull(receiverData)) {
104 | throw new Exception("get data waitwindow no revice data!id:"+sessionId) ;
105 | }
106 | byte[] respData = receiverData.getData(this.timeout);
107 | if (Objects.isNull(respData)) {
108 | throw new Exception("");
109 | }
110 | receiverDataWindow.remove(sessionId);
111 |
112 | return respData;
113 | }
114 |
115 | protected void receiver(byte[] data) {
116 |
117 | try {
118 | int currentSessionID = ContextUtil.getSessionID(data);
119 | ReceiverData receiverData = receiverDataWindow.get(currentSessionID);
120 | if(Objects.isNull(receiverData)) {
121 | log.error("revice data waitwindow no reciever data!id:{}",currentSessionID);
122 | }
123 | receiverData.setData(ContextUtil.getBody(data));
124 |
125 | } catch (Exception e) {
126 | log.error("receiver data error!",e);
127 | }
128 |
129 | }
130 |
131 | private Integer createSessionID() {
132 |
133 | if (sessionId.get() == 1073741824) {// 1024^3
134 | sessionId.compareAndSet(1073741824, 0);
135 | }
136 |
137 | return sessionId.getAndIncrement();
138 | }
139 |
140 | }
141 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/net/TcpClientHandler.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.net;
2 |
3 | import java.util.Map;
4 | import java.util.concurrent.ConcurrentHashMap;
5 | import java.util.concurrent.atomic.AtomicInteger;
6 |
7 | import org.slf4j.Logger;
8 | import org.slf4j.LoggerFactory;
9 |
10 | import io.netty.channel.Channel;
11 | import io.netty.channel.ChannelHandlerContext;
12 | import io.netty.channel.ChannelInboundHandlerAdapter;
13 | import io.netty.channel.ChannelInitializer;
14 |
15 | public class TcpClientHandler extends ChannelInboundHandlerAdapter {
16 |
17 | private Logger log = LoggerFactory.getLogger(this.getClass());
18 |
19 | private TCPClient tcpClient;
20 |
21 |
22 | public TcpClientHandler(TCPClient tcpClient ) {
23 | this.tcpClient=tcpClient;
24 | }
25 |
26 |
27 | /**
28 | * 链路链接成功
29 | */
30 | public void channelActive(ChannelHandlerContext ctx) throws Exception {
31 | log.debug("连接成功!");
32 | }
33 |
34 | public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
35 |
36 | tcpClient.receiver((byte[]) msg);
37 |
38 | }
39 |
40 | public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
41 | ctx.flush();
42 | }
43 |
44 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
45 | cause.printStackTrace();
46 | ctx.close();
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/proxy/ProxyFactory.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.proxy;
2 |
3 | public class ProxyFactory {
4 |
5 | /**
6 | * @param type
7 | * @param serviceName
8 | * @param serviceImpleName
9 | * @return
10 | */
11 | public static T create(Class> type, String serviceName,String serviceImpleName) {// T返回任意类型的数据? 返回代理的实例 泛型
12 |
13 |
14 | ProxyHandler handler = new ProxyHandler(serviceName,serviceImpleName);
15 |
16 |
17 | return (T) handler.bind(new Class>[]{type});
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/com.krpc.client/src/main/java/com/krpc/client/proxy/ProxyHandler.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.proxy;
2 |
3 | import java.lang.reflect.InvocationHandler;
4 | import java.lang.reflect.Method;
5 | import java.lang.reflect.Proxy;
6 | import java.util.ArrayList;
7 | import java.util.Arrays;
8 | import java.util.List;
9 | import java.util.Map;
10 | import java.util.Map.Entry;
11 | import java.util.regex.Pattern;
12 |
13 | import com.krpc.client.core.RequestHandler;
14 | import com.krpc.common.entity.Request;
15 |
16 | public class ProxyHandler implements InvocationHandler {
17 |
18 | private final String LIST_PATTERN = "java.util.*List";
19 | private final String MAP_PATTERN = "java.util.*Map";
20 |
21 | private String serviceName;
22 | private String serviceImplName;
23 |
24 | public ProxyHandler(String serviceName, String serviceImplName) {
25 | this.serviceName = serviceName;
26 | this.serviceImplName = serviceImplName;
27 | }
28 |
29 | public Object bind(Class>[] interfaces) {
30 |
31 | return Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), interfaces, this);
32 | }
33 |
34 | @Override
35 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
36 |
37 | // 构造请求request
38 | Request request = new Request();
39 | request.setMethodName(method.getName());
40 | request.setServiceImplName(serviceImplName);
41 | request.setParamsValues(Arrays.asList(args));
42 | Class[] sourceTypes = method.getParameterTypes();
43 | List paramsTypeName = new ArrayList();
44 |
45 | for (int i = 0; i < args.length; i++) {
46 | paramsTypeName.add(sourceTypes[i].getName());
47 | }
48 | request.setParamsTypesName(paramsTypeName);
49 |
50 | Class returnClass = method.getReturnType();
51 |
52 | return RequestHandler.request(serviceName, request, returnClass);
53 | }
54 |
55 |
56 | /**
57 | * 获取该对象值得类路径,支持扫描集合类型的泛型类型
58 | * @param type
59 | * @param value
60 | * @return
61 | */
62 | @Deprecated
63 | private StringBuilder getClassName(Class type,Object value){
64 |
65 | StringBuilder sb = new StringBuilder();
66 | String typeName = type.getName();
67 | sb.append(typeName).append(";");
68 |
69 | if(value!=null){
70 | if(Pattern.matches(LIST_PATTERN, typeName)){//list
71 | if(((List)value).size()>0){
72 | sb.append((getClassName(((List)value).get(0).getClass(),((List)value).get(0))));
73 | }
74 | }else if(Pattern.matches(MAP_PATTERN, typeName)){//map
75 | if(((Map)value).size()>0){
76 | Object k = ((Entry)((Map)value).entrySet().iterator().next()).getKey();
77 | Object v = ((Entry)((Map)value).entrySet().iterator().next()).getValue();
78 | sb.append(getClassName(k.getClass(),k));
79 | sb.append(getClassName(v.getClass(),v));
80 | }
81 |
82 |
83 | }
84 |
85 | }
86 |
87 | return sb;
88 | }
89 |
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/com.krpc.client/src/test/java/com/krpc/client/CDLTest.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client;
2 |
3 | import org.junit.Test;
4 |
5 | import java.util.concurrent.ConcurrentHashMap;
6 | import java.util.concurrent.CountDownLatch;
7 | import java.util.concurrent.Executor;
8 | import java.util.concurrent.Executors;
9 | import java.util.concurrent.atomic.AtomicInteger;
10 |
11 | /**
12 | * @author: yangzhenkun01
13 | * @Date: 2018/6/19
14 | */
15 | public class CDLTest {
16 |
17 | AtomicInteger atomicInteger = new AtomicInteger(0);
18 | int i = 0;
19 |
20 | @Test
21 | public void testCDL() throws InterruptedException {
22 | ConcurrentHashMap map = new ConcurrentHashMap<>();
23 | Executor pool = Executors.newFixedThreadPool(20);
24 | CountDownLatch countDownLatch = new CountDownLatch(2000);
25 |
26 | for (int i = 0; i < 2000; i++) {
27 | pool.execute(new Runnable() {
28 | @Override
29 | public void run() {
30 |
31 | map.put(incr(), 0);
32 | countDownLatch.countDown();
33 | }
34 | });
35 |
36 | }
37 |
38 |
39 | countDownLatch.await();
40 | // countDownLatch.await(10,TimeUnit.DAYS);
41 | System.out.println("执行完毕");
42 | System.out.println(map.size());
43 | }
44 |
45 |
46 | private int incr() {
47 |
48 |
49 | return atomicInteger.incrementAndGet();
50 | // return i++;
51 |
52 | }
53 |
54 |
55 | @Test
56 | public void testIND() {
57 |
58 | atomicInteger.compareAndSet(0, 2);
59 |
60 | System.out.println(atomicInteger.incrementAndGet());
61 |
62 | }
63 |
64 |
65 | }
66 |
--------------------------------------------------------------------------------
/com.krpc.client/src/test/java/com/krpc/client/Function.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client;
2 |
3 | public class Function {
4 |
5 |
6 | public int testInt(byte b,short s,int i,long l,float f,double d,boolean bo,char c){
7 |
8 | return i;
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/com.krpc.client/src/test/java/com/krpc/client/KRPCTest.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client;
2 |
3 | import java.util.ArrayList;
4 | import java.util.HashMap;
5 | import java.util.List;
6 | import java.util.Map;
7 | import java.util.Map.Entry;
8 | import java.util.regex.Pattern;
9 |
10 | import org.junit.Test;
11 |
12 | public class KRPCTest {
13 |
14 | public void testInit() {
15 |
16 | try {
17 | KRPC.init("D://krpc//service//demo//conf//client.xml");
18 | } catch (Exception e) {
19 | e.printStackTrace();
20 | }
21 |
22 | }
23 |
24 | public void testGetName() {
25 |
26 |
27 | }
28 |
29 |
30 | public void test() {
31 |
32 | String list = "java.util.*List";
33 | String map = "java.util.*Map";
34 |
35 | Object[] args = new Object[3];
36 |
37 | }
38 |
39 | String list = "java.util.*List";
40 | String map = "java.util.*Map";
41 |
42 | public List getClass(Object object, List classes) {
43 |
44 | String typeName = object.getClass().getName();
45 |
46 | if (Pattern.matches(list, typeName)) {
47 | classes.add(typeName);
48 | getClass(((List) object).get(0), classes);
49 | } else if (Pattern.matches(map, typeName)) {
50 |
51 | } else {
52 |
53 | }
54 |
55 | return classes;
56 | }
57 |
58 | @Test
59 | public void match() {
60 |
61 | String src1 = "java.util.ArrayList";
62 | String src2 = "java.util.HashMap";
63 |
64 | String list = "java.util.*List";
65 | String map = "java.util.*Map";
66 |
67 | System.out.println(Pattern.matches(list, src2));
68 |
69 | }
70 |
71 | @Test
72 | public void map() {
73 |
74 | Map, Map> testMap1 = new HashMap<>();
75 | Map testMap = new HashMap();
76 | testMap.put("1", "one");
77 |
78 | List klist = new ArrayList<>();
79 | klist.add("一");
80 |
81 | testMap1.put(klist, testMap);
82 |
83 | Object t = testMap1;
84 |
85 | // StringBuilder pnames = getClassName(t.getClass(), t);
86 | // System.out.println(pnames.toString());
87 |
88 | // byte[] requestBytes = JSON.toJSONBytes(testMap1);
89 |
90 | // Map request = JSON.parseObject(requestBytes,Map.class,null);
91 |
92 | // request.forEach((k,v)->{
93 | // System.out.println(((List)k).get(0));
94 | // System.out.println( ((Map)v).get("1") );
95 | // });
96 |
97 |
98 | // Object k = ((Entry) ((Map) t).entrySet().iterator().next()).getKey();
99 | // Object v = ((Entry) ((Map)
100 | // t).entrySet().iterator().next()).getValue();
101 | //
102 | // System.out.println(k.getClass().getName());
103 | // System.out.println(v.getClass().getName());
104 |
105 | }
106 |
107 | private StringBuilder getClassName(Class type, Object value) {
108 |
109 | StringBuilder sb = new StringBuilder();
110 | String typeName = type.getName();
111 | sb.append(typeName).append(";");
112 |
113 | if (value != null) {
114 | if (Pattern.matches("java.util.*List", typeName)) {// list
115 | if (((List) value).size() > 0) {
116 | sb.append((getClassName(((List) value).get(0).getClass(), ((List) value).get(0))));
117 | }
118 | } else if (Pattern.matches("java.util.*Map", typeName)) {// map
119 | if (((Map) value).size() > 0) {
120 | Object k = ((Entry) ((Map) value).entrySet().iterator().next()).getKey();
121 | Object v = ((Entry) ((Map) value).entrySet().iterator().next()).getValue();
122 | sb.append(getClassName(k.getClass(), k));
123 | sb.append(getClassName(v.getClass(), v));
124 | }
125 |
126 | }
127 |
128 | }
129 |
130 | return sb;
131 | }
132 |
133 | }
134 |
--------------------------------------------------------------------------------
/com.krpc.client/src/test/java/com/krpc/client/TCP.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client;
2 |
3 | import java.io.IOException;
4 | import java.io.InputStream;
5 | import java.io.OutputStream;
6 | import java.io.PrintWriter;
7 | import java.net.Socket;
8 | import java.net.UnknownHostException;
9 |
10 | import org.apache.commons.io.IOUtils;
11 | import org.junit.Test;
12 |
13 | import com.krpc.client.net.TCPClient;
14 |
15 | public class TCP {
16 |
17 |
18 | @Test
19 | public void testSend() {
20 |
21 | try {
22 | // 1.创建 socket 指定服务器地址和端
23 | Socket client = new Socket("127.0.0.1", 17999);
24 | // 2.客户端向服务器发送登录信息
25 | OutputStream os = client.getOutputStream();// 字节输出流
26 | PrintWriter pw = new PrintWriter(os);
27 | pw.write("hello");
28 | pw.flush();
29 | client.shutdownOutput();// 关闭输出流
30 |
31 | // 3. 获取输入流
32 | InputStream is = client.getInputStream();
33 | // InputStreamReader isr = new InputStreamReader(is);
34 | // BufferedReader br = new BufferedReader(isr);
35 | // String info = null;
36 | // while ((info = br.readLine()) != null) {
37 | // System.out.println("服务器发来消息说:" + info);
38 | // }
39 | byte[] res = IOUtils.toByteArray(is);
40 | System.out.println(new String(res));
41 |
42 |
43 | // 3.关闭其他资源
44 | pw.close();
45 | os.close();
46 | client.close();
47 | } catch (UnknownHostException e) {
48 | // TODO Auto-generated catch block
49 | e.printStackTrace();
50 | } catch (IOException e) {
51 | // TODO Auto-generated catch block
52 | e.printStackTrace();
53 | }
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/com.krpc.client/src/test/java/com/krpc/client/pool/DataReceiverHandler.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.pool;
2 |
3 | import java.io.IOException;
4 | import java.net.Socket;
5 |
6 | public class DataReceiverHandler {
7 |
8 | private KRPCSocket socket;
9 |
10 | public DataReceiverHandler(KRPCSocket socket){
11 | this.socket=socket;
12 |
13 | ReceiverTask task = new ReceiverTask(socket);
14 | Thread thread = new Thread(task);
15 | thread.setDaemon(true);
16 | thread.setName("socket数据接受线程");
17 | thread.start();
18 | }
19 |
20 |
21 | class ReceiverTask implements Runnable{
22 |
23 | private KRPCSocket socket;
24 |
25 | public ReceiverTask(KRPCSocket socket) {
26 | this.socket=socket;
27 | }
28 |
29 | @Override
30 | public void run() {
31 |
32 | while(true){
33 |
34 | try {
35 | socket.receiver();
36 | } catch (IOException e) {
37 | e.printStackTrace();
38 | }
39 |
40 | }
41 |
42 | }
43 |
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/com.krpc.client/src/test/java/com/krpc/client/pool/KRPCSocket.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.pool;
2 |
3 | import java.io.IOException;
4 | import java.net.InetSocketAddress;
5 | import java.net.Socket;
6 | import java.nio.ByteBuffer;
7 | import java.nio.channels.SocketChannel;
8 | import java.util.concurrent.ConcurrentHashMap;
9 | import java.util.concurrent.atomic.AtomicInteger;
10 |
11 | /**
12 | * KRPC客户端用于通信的Socket
13 | *
14 | * @author yangzhenkun
15 | *
16 | */
17 | public class KRPCSocket {
18 |
19 | private Socket socket;
20 | private SocketChannel channel;
21 | private ByteBuffer sendBuffer;
22 | private ByteBuffer receiverBuffer;
23 |
24 | private DataReceiverHandler dataReceiverHandler;
25 |
26 | private Object sendLockHelper = new Object();
27 | private Object receiverLockHelper = new Object();
28 |
29 | private AtomicInteger sessionId = new AtomicInteger(0);
30 |
31 | private ConcurrentHashMap receiverDataWindow = new ConcurrentHashMap();
32 |
33 | public KRPCSocket(String host, int port) throws IOException {
34 | channel = SocketChannel.open(new InetSocketAddress(host, port));
35 | socket = channel.socket();
36 | socket.setSendBufferSize(1024);
37 | socket.setReceiveBufferSize(1024);
38 |
39 | socket.setTcpNoDelay(true);
40 |
41 | sendBuffer = ByteBuffer.allocate(1024);
42 | receiverBuffer = ByteBuffer.allocate(1024);
43 |
44 | dataReceiverHandler = new DataReceiverHandler(this);
45 | }
46 |
47 | public int send(byte[] data) throws IOException {
48 |
49 | synchronized (sendLockHelper) {
50 | int count = 0;
51 | sendBuffer.clear();
52 | sendBuffer.put(data);
53 | sendBuffer.flip();
54 | while (sendBuffer.hasRemaining()) {
55 | count += channel.write(sendBuffer);
56 | }
57 |
58 | return count;
59 | }
60 |
61 | }
62 |
63 | protected void receiver() throws IOException {
64 |
65 | synchronized (receiverLockHelper) {
66 |
67 | receiverBuffer.clear();
68 | int count = channel.read(receiverBuffer);
69 | byte[] responseBytes = new byte[count];
70 |
71 | receiverBuffer.get(responseBytes, 0, count);
72 |
73 | System.out.println("客户端接受:"+responseBytes.length);
74 | }
75 |
76 | }
77 |
78 | private int createSessionID(){
79 |
80 | if(sessionId.get()==1073741824){//1024^3
81 | sessionId.compareAndSet(1073741824, 0);
82 | }
83 |
84 | return sessionId.getAndIncrement();
85 | }
86 |
87 | }
88 |
--------------------------------------------------------------------------------
/com.krpc.client/src/test/java/com/krpc/client/pool/PoolTest.java:
--------------------------------------------------------------------------------
1 | package com.krpc.client.pool;
2 |
3 | import java.io.IOException;
4 | import java.io.InputStream;
5 | import java.io.OutputStream;
6 | import java.net.InetSocketAddress;
7 | import java.net.Socket;
8 | import java.nio.ByteBuffer;
9 | import java.nio.channels.SocketChannel;
10 |
11 | import com.krpc.common.entity.Request;
12 | import com.krpc.common.serializer.SerializeUtil;
13 | import com.krpc.common.util.CompressUtil;
14 | import com.krpc.common.util.FileUtil;
15 |
16 | import org.apache.commons.io.IOUtils;
17 |
18 | import com.krpc.common.serializer.HessianUtil;
19 | import org.junit.Test;
20 |
21 | public class PoolTest {
22 |
23 | @Test
24 | public void receiverTest(){
25 |
26 | try {
27 | byte[] data = FileUtil.read("D:/byte.txt");
28 | byte[] sumData = new byte[data.length*2];
29 | int length = data.length;
30 |
31 | for(int i=0;i
3 | 4.0.0
4 |
5 | com.krpc
6 | com.krpc.common
7 | 0.0.2
8 | jar
9 |
10 | com.krpc.common
11 | http://maven.apache.org
12 |
13 |
14 | UTF-8
15 |
16 |
17 |
18 |
19 |
20 | io.netty
21 | netty-all
22 | 4.1.24.Final
23 |
24 |
25 | com.caucho
26 | hessian
27 | 4.0.51
28 |
29 |
30 |
31 | org.apache.commons
32 | commons-io
33 | 1.3.2
34 |
35 |
36 |
37 | dom4j
38 | dom4j
39 | 1.6.1
40 |
41 |
42 |
43 | org.slf4j
44 | slf4j-api
45 | 1.7.25
46 |
47 |
48 |
49 | junit
50 | junit
51 | 3.8.1
52 | test
53 |
54 |
55 | com.101tec
56 | zkclient
57 | 0.11
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 | org.apache.maven.plugins
66 | maven-surefire-plugin
67 | 2.18.1
68 |
69 | true
70 |
71 |
72 |
73 | org.apache.maven.plugins
74 | maven-compiler-plugin
75 | 3.1
76 |
77 | 1.8
78 | 1.8
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/com.krpc.common/src/main/java/com/krpc/common/entity/Request.java:
--------------------------------------------------------------------------------
1 | package com.krpc.common.entity;
2 |
3 | import java.io.Serializable;
4 | import java.util.List;
5 |
6 | /**
7 | * RPC调用请求
8 | *
9 | * @author yangzhenkun
10 | *
11 | */
12 | public class Request implements Serializable {
13 | private static final long serialVersionUID = -6060365745498911171L;
14 | // 服务名实现类名字
15 | private String serviceImplName;
16 | // 方法名
17 | private String methodName;
18 | // 调用方法参数的 Class路径
19 | private List paramsTypesName;
20 |
21 | // 调用方法参数的 实例,顺序与上面的Class保持一致
22 | private List