1.修改服务提供者
public class RpcServer {
private Integer port;
private List<String> classNames=new ArrayList<String>();
private Boolean flag=true;
private void scanPackage(String packageName){
URL url = this.getClass().getClassLoader().getResource(replaceTo(packageName));
String urlFile = url.getFile();
File file = new File(urlFile);
String[] list = file.list();
for (String path : list) {
File eachFile = new File(urlFile + File.separator + path);
if (eachFile.isDirectory())
scanPackage(packageName+"."+eachFile.getName());
if (eachFile.getName().endsWith(".class"))
classNames.add(packageName+"."+eachFile.getName().replace(".class",""));
}
}
private String replaceTo(String packageName) {
return packageName.replaceAll("\\.","/");
}
public Map<String,Object> getService(){
String packageNames="com.MyRpc.service";
try{
Map<String,Object> map=new ConcurrentHashMap<String, Object>();
String[] packageName = packageNames.split(",");
for (String path : packageName) {
scanPackage(path);
}
if (classNames!=null)
for (String className : classNames) {
Class clazz = null;
clazz = Class.forName(className);
if (clazz.isAnnotationPresent(Rpc.class)){
Class[] interfaces = clazz.getInterfaces();
Object o = clazz.newInstance();
map.put(interfaces[0].getName(),o);
}
}
return map;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("服务器初始化失败");
}
}
public void start(int port){
setPort(port);
ServerSocket serverSocket=null;
ThreadPoolExecutor executor=null;
try{
Map<String, Object> service = getService();
serverSocket = new ServerSocket(port);
register();
executor=new ThreadPoolExecutor(5,10,60, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10));
while (flag){
Socket accept = serverSocket.accept();
RpcServiceRunnable server = new RpcServiceRunnable(accept, service);
executor.execute(server);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
CloseUtils.close(serverSocket,executor,null,null, null,null);
}
}
private void stop(){
this.flag=false;
}
private void register(){
ZkClient client=new ZkClient("127.0.0.1:2181",30000,1000);
String s = "/dubbo";
if (!client.exists(s))
client.createPersistent(s);
InetAddress localHost=null;
try {
localHost = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
throw new RuntimeException("获取本机ip地址失败");
}
String ip = localHost.getHostAddress();
String service = ip + ":" + getPort();
System.out.println("service = " + service);
String path = s + "/" + service;
if (client.exists(path))
client.delete(path);
client.createEphemeral(path,service);
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
}
2.修改服务调用者
public class RpcClientProxy implements InvocationHandler {
private List<String> list=new LinkedList<String>();
public RpcClientProxy() {
}
public <T> T getProxyObject(Class<T> clazz){
return (T) Proxy.newProxyInstance(clazz.getClassLoader(),new Class<?>[]{clazz},this);
}
public void initServer(){
final ZkClient client=new ZkClient("127.0.0.1:2181",30000,1000);
final String path="/dubbo";
if (!client.exists(path))
throw new RuntimeException("没有对应的服务器提供服务");
list.clear();
final List<String> children = client.getChildren(path);
for (String child : children) {
list.add(client.readData(path+"/"+child).toString());
}
client.subscribeChildChanges(path, new IZkChildListener() {
public void handleChildChange(String s, List<String> ChildrenList) throws Exception {
list.clear();
for (String child : ChildrenList) {
list.add(client.readData(path+"/"+child).toString());
}
System.out.println("-----------------server change---------------"+list);
}
});
}
private int count=0;
public String getServer(){
initServer();
System.out.println(list.size());
int index= count%list.size();
count++;
System.out.println("index = " + index);
return list.get(index);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
RpcRequest request=new RpcRequest();
request.setClassName(method.getDeclaringClass().getName());
request.setMethodName(method.getName());
request.setParamsType(method.getParameterTypes());
request.setParams(args);
String server = getServer();
String[] split = server.split(":");
RpcClient rpc=new RpcClient();
return rpc.start(request,split[0], Integer.valueOf(split[1]));
}
}
3.测试服务端
public class ServiceClient {
public static void main(String[] args) {
RpcServer server=new RpcServer();
server.start(8888);
System.out.println();
}
@Test
public void test1(){
RpcServer server=new RpcServer();
server.start(8900);
System.out.println();
}
@Test
public void test2(){
RpcServer server=new RpcServer();
server.start(8888);
System.out.println();
}
@Test
public void test3(){
RpcServer server=new RpcServer();
server.start(9000);
System.out.println();
}
}
4.测试客户端
public class ClientTest {
public static void main(String[] args) {
RpcClientProxy proxy=new RpcClientProxy();
TestServer proxyObject = proxy.getProxyObject(TestServer.class);
System.out.println(proxyObject.hello(3L));
System.out.println(proxyObject.hello(3L));
System.out.println(proxyObject.hello(3L));
}
}
接手写RPC1