}
// 先从缓存里找
if (cache.containsKey(serverName)) {
System.out.println("在缓存中找到" + serverName + "节点");
}
// 如果该节点在zookeeper中不存在,直接返回空
if (!zkClient.exists("/" + serverName)) {
return null;
}
zkClient.subscribeChildChanges("/" + serverName, new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
// 一旦进入此方法,证明有节点改变
cache.put(serverName, currentChilds);
System.out.println(serverName + "节点有变化-----" + "缓存完成更新");
}
});
return zkClient.getChildren("/" + serverName);
}
}
写提供者代码创建AddServiceImpl
注意类名最好是AddService+Impl,并且类全路径也要对应com.chenlei.service.impl.AddServiceImpl,否则代码需要调整
package com.chenlei.service.impl;
import com.chenlei.service.AddService;
public class AddServiceImpl implements AddService {
@Override
public int add(Integer a, Integer b) {
return a + b;
}
}
创建ProviderApp(重点)
public class ProviderApp {
public static void main(String[] args) {
Integer port = 7777;
ServerSocket serverSocket = bind(port);
// 向zookeeper注册
ZkUtils.register(AddService.class.getName(), "127.0.0.1" + ":" + port);
// 监听+处理请求
listener(serverSocket);
}
/**
* 监听和处理请求
*
* @param serverSocket
*/
private static void listener(ServerSocket serverSocket) {
//此处死循环是为了让次提供者一直处于工作状态
while (true) {
Socket socket = null;
InputStream inputStream = null;
ObjectInputStream objectInputStream = null;
OutputStream outputStream = null;
ObjectOutputStream objectOutputStream = null;
try {
socket = serverSocket.accept();
inputStream = socket.getInputStream();
objectInputStream = new ObjectInputStream(inputStream);
Request request = (Request) objectInputStream.readObject();
Object answer = invoker(request);
outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(answer);
} catch (Exception e) {
e.printStackTrace();
} finally {
ProxyUtils.closeResources(objectOutputStream, outputStream, objectInputStream, inputStream, socket);
}
}
}
/**
* 处理请求返回结果
*
* @param request
* @return
*/
private static Object invoker(Request request) {
// 获得从消费者传过来的信息
String interfaceName = request.getInterfaceName();
String methodName = request.getMethodName();
Object[] args = request.getArgs();
// 获得对应实现类全名
String className = getClassNameByInterfaceName(interfaceName);
Object answer = null;
try {
// 找到该类
Class<?> clazz = Class.forName(className);
// 创建一个对象
Object object = clazz.newInstance();
Class<?>[] argsType = new Class<?>[args.length];
if (null != args || 0 != args.length) {
for (int i = 0; i < args.length; i++) {
argsType[i] = args[i].getClass();
}
}
Method method = clazz.getMethod(methodName, argsType);
answer = method.invoke(object, args);
} catch (Exception e) {
e.printStackTrace();
}
return answer;
}
/**
* 通过请求者传来的类信息,获得对应实现类的所有信息,并返回实现类的全名
*
* @param interfaceName
* @return
*/
private static String getClassNameByInterfaceName(String interfaceName) {
// 传过来的接口名为com.chenlei.service.AddService
int index = interfaceName.lastIndexOf(".");
StringBuilder sb = new StringBuilder();
// com.chenlei.service
sb.append(interfaceName.subSequence(0, index));
// com.chenlei.service.impl.
sb.append(".impl.");
// com.chenlei.service.impl.AddService
sb.append(interfaceName.substring(index + 1)).append("Impl");
return sb.toString();
}
/**
* 绑定一个端口
*
* @param port
* @return
*/
private static ServerSocket bind(Integer port) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
return serverSocket;
}
/**
* 测试代码
*/
//public static void main(String[] args) {
// String interfaceName = "com.chenlei.service.AddService";
推荐阅读
- 农村远程教育服务茶产业 为百万茶农致富导航
- 安溪,远程教育4+2学用模式助推茶业发展
- java多线程,静态方法加锁后,调用该方法会影响其它方法吗?
- CVE-2019-0193 Apache Solr远程代码执行漏洞 复现操作
- Windows 远程控制 Ubuntu 系统
- Linux Kernel 5.5 最终删除 SYSCTL 系统调用
- 空调清洗主要清洗哪里,空调清洗有必要吗
- 三步排查彻底解决远程桌面连接内部错误问题
- 苹果电脑MAC系统登录远程桌面 如何能够实现?
- 远程访问电脑设置教程
