`
knight_black_bob
  • 浏览: 857934 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

手写 dubbo

阅读更多

手写 dubbo(2017 最后一篇博客,回家相亲...) 

 

下载demo

 

首先 介绍一下 dubbo大神的 博客地址  :   http://javatar.iteye.com/blog/1123915

 

test



 

 

constructor



 

 

 

refer

public class SocketConsumer implements RpcRefer {
	 
	 @Override
		public <T> T refer(Class<T> interfaceClass, String host, int port) { 
		 return  (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(),  new Class<?>[] {interfaceClass}, new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				Socket socket = null;  
				 ObjectInputStream input = null;
	            try {   
	                socket = new Socket(host, port);    
	                DataOutputStream out = new DataOutputStream(socket.getOutputStream());    
	                InvokeEnity entity = new InvokeEnity();
	                entity.setServiceName(interfaceClass.getName());
	                entity.setMethodName(method.getName());
	                ArrayList<String>  parameterTypes= new ArrayList<String>();
	                for (int i = 0; i < method.getParameterTypes().length; i++) {
	                	Class<?> class1 = method.getParameterTypes()[i];
	                	parameterTypes.add(class1.getName());
					}
	                entity.setParameterTypes(parameterTypes);
	                entity.setParameters(CollectionUtils.arrayToList(args));
	                
	                out.writeUTF(FastJsonUtils.toJSONString(entity).toString());  
	                input = new ObjectInputStream(socket.getInputStream());    
	                Object serviceInvoke = input.readObject(); 
	                return serviceInvoke;
	               
	            } catch (Exception e) {   
	            	e.printStackTrace();
	            } finally {  
	                if (socket != null) {  
	                    try {  
	                        socket.close();  
	                    } catch (IOException e) {  
	                        socket = null;      
	                    }  
	                }  
	                if (input != null) {  
	                    try {  
	                    	input.close();  
	                    } catch (IOException e) {  
	                    	input = null;      
	                    }  
	                }  
	            } 
				return null;
			}
		});  
		} 
}

 

 

export

public class SocketProducter implements RpcExport {
	
	@Override
	 public void export(Object service, int port ) {    
	        try {     
	            ServerSocket serverSocket = new ServerSocket(port);    
	            while (true) {    
	                Socket client = serverSocket.accept();    
	                new HandlerThread(client,service);    
	            }    
	        } catch (Exception e) {    
	        	e.printStackTrace();
	        }    
	    }    
	    
	    private class HandlerThread implements Runnable {    
	        private Socket socket;   
	        private Object service ;
	        public HandlerThread(Socket client,Object service) {    
	            socket = client;    
	            this.service = service;
	            new Thread(this).start();    
	        }    
	    
	        public void run() {    
	            try {    
	                DataInputStream input = new DataInputStream(socket.getInputStream());  
	                String request = input.readUTF(); 
	                Object execute = null;
	               if( FastJsonUtils.isJson(request)){ 
	            	   InvokeEnity entityEnity = InvokeEnity.transefer(request);
						String methodName = entityEnity.getMethodName();
						List<String> parameterTypeses = entityEnity.getParameterTypes();
						List<String> parameteres = entityEnity.getParameters();
						Class<?>[] parameterTypes = new Class<?>[parameterTypeses.size()];
						Object[] parameters = new Object[parameterTypeses.size()];
						for (int i = 0; i <parameterTypeses.size(); i++) {
							parameterTypes[i] = Class.forName(parameterTypeses.get(i));
							parameters[i] = parameteres.get(i);
						}  
						execute = CGLibUtils.execute(service, methodName, parameterTypes, parameters);
						
						/* Method method = service.getClass().getMethod(methodName, parameterTypes);  
						 execute = method.invoke(service, parameters);  */
                         
	               }
	               
					
					
	                ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());  
	                out.writeObject(execute);
	                out.close();    
	                input.close();    
	            } catch (Exception e) {    
	            	e.printStackTrace();
	            } finally {    
	                if (socket != null) {    
	                    try {    
	                        socket.close();    
	                    } catch (Exception e) {    
	                        socket = null;    
	                    }    
	                }    
	            }   
	        }    
	    }

		

	
}

 

 

 

public interface UserService {

	 public User getUser(String name);

}

 

public class UserServiceImpl implements UserService {

	@Override
	public User getUser(String name) { 
		User user = new User();
		user.setName(name);
		user.setPassword(name +"1213212");
		return user;
	}

	 

}

 

 

producter 提供者

public class ProducterTest {

	  public static void main(String[] args) {
			RpcFactory rpc = RpcFactory.getInstanceByStrategy("simpleIO");
			RpcExport rpcExport = rpc.getRpcExport();
			UserService service = new UserServiceImpl();
			rpcExport.export(service, Constants.PORT);
	}

}

 

 

consumer消费者

public class ConsumerTest {

	 public static void main(String[] args) {
		 RpcFactory rpc = RpcFactory.getInstanceByStrategy("simpleIO"); 
			RpcRefer rpcRefer = rpc.getRpcRefer();
			UserService userService = rpcRefer.refer(UserService.class, Constants.IP_ADDR, Constants.PORT);
			for (int i = 0; i < 10; i++) {
				User user = userService.getUser("baoyou");
				System.out.println(FastJsonUtils.toJSONString(user).toString());
			}
			 
	}

}

 

 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者 

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。

 

个人主页http://knight-black-bob.iteye.com/



 
 
 谢谢您的赞助,我会做的更好!

  • 大小: 59 KB
  • 大小: 76.3 KB
1
0
分享到:
评论

相关推荐

    基于Netty手写Dubbo框架

    基于Netty手写Dubbo,该资源包含 1、生产者向zk服务的注册,消费者发现服务。 2、RPC远程调用实现。 3、netty服务调用,对象序列化和反序列化。 4、负载均衡的简单实现 详情见博客:...

    netty手写dubbo源码分享

    本篇文章将深入探讨如何利用Netty手写Dubbo的部分核心功能,以此理解这两个技术的内在联系和工作原理。 一、Netty基础 Netty的核心在于其非阻塞I/O模型,基于NIO(非阻塞输入/输出)和EventLoop(事件循环)的概念...

    从零开始手写 dubbo rpc 框架-12-generic泛化调用.docx

    "从零开始手写 Dubbo RPC 框架-泛化调用" Dubbo 是一个基于 Java 实现的 RPC 框架,主要用于个人学习和理解 RPC 的底层实现原理。在这个文件中,我们将深入探讨 Dubbo 的泛化调用机制。 泛化调用 泛化调用是一种...

    从零开始手写 dubbo rpc 框架-12-generic泛化调用.pdf

    Dubbo RPC 框架 Generic 调用机制详解 Dubbo RPC 框架是一种基于 Netty 实现的 Java RPC 框架,主要用于个人学习和理解 RPC 底层实现原理。本文将详细介绍 Dubbo RPC 框架中的 Generic 调用机制。 Generic 调用...

    从零开始手写 dubbo rpc 框架-11-fail失败策略.docx

    Dubbo是一款由阿里巴巴开源的Java RPC框架,它提供了高性能、透明化的远程方法调用服务,使得服务就像调用本地方法一样简单。 在Dubbo的实现中,RPC调用可能会遇到各种失败情况,如网络延迟、服务器故障等。为了...

    分布式RPC服务框架Dubbo从入门到手写Dubbo框架教程

    Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring ...掌握Dubbo实战之后,通过手写Dubbo框架,加深对原理的掌握,轻松应对企业开发和面试。

    从零开始手写 dubbo rpc 框架-11-fail失败策略.pdf

    Dubbo 是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了丰富的功能,如服务注册与发现、负载均衡、容错机制等。本篇将介绍如何从零开始构建一个简单的RPC框架,并关注其中的失败策略。 首先,RPC框架的...

    手写模拟Dubbo代码demo.zip

    在这个"手写模拟Dubbo代码demo"中,我们可以深入理解Dubbo的核心概念和工作原理,以及如何在实际项目中模拟其功能。以下是基于提供的信息详细讲解Dubbo的相关知识点: 1. **服务提供者(Provider)与服务消费者...

    Dubbo与Zookeeper详细例子

    【使用介绍文档】:手写的TXT文档提供了详细的使用步骤和技巧,这可能是作者根据自己的实践经验总结出的宝贵知识。文档中可能涵盖了如何安装和配置Zookeeper,如何设置Dubbo的provider和consumer,以及如何调试和...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    ├─面试必问-大牛带你手写dubbo框架 │ 大牛带你手写Dubbo框架.mp4 │ ├─面试必问-实战分布式之手写分布式事务框架 │ 实战分布式之手写分布式事务框架.mp4 │ ├─面试必问-带你精通springAOP—面试无忧虑 │ 带...

    java高级软件工程师教程快速入门Zookeeper+dubbo视频教程

    手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 1、课程简介 Zookeeper是一个开源分布式应用程序协调...2.手写RPC 3.Dubbo高可用 4.Dubbo IO模型 5.Dubbo架构 6.源码解析

    dubbo_rpc.zip

    本资料包旨在帮助学习者深入理解并实践Dubbo框架,特别包含了手写示例代码,注释清晰,便于理解和应用。 1. **RPC原理与Dubbo的角色** RPC(Remote Procedure Call)是一种进程间通信方式,允许程序调用另一个地址...

    Netty4.1实战-手写RPC框架.pdf

    RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码...

    spring-dubbo 整合demo

    同时,项目还强调了是“手写亲测可用”,这意味着它经过实际验证,具备一定的可靠性和实用性,适合初学者和有经验的开发者用来学习和参考。项目中的代码注释清晰,有助于理解代码的实现逻辑。 标签“spring-dubbo”...

    dubbo_demo.7z

    "手写附件中含demo"可能意味着除了标准的代码示例,还包含了开发者自定义的组件或代码解释,以便更深入地理解其工作原理。"表"可能指的是数据库设计或者服务间交互的数据结构,这对于理解服务间的通信和数据流转至关...

    dubbo分布式系统Rpc调用框架

    首先,让我们从35-Dubbo框架介绍与手写模拟Dubbo开始。Dubbo由阿里巴巴开源,其设计目标是提供一个简单易用、高性能、高可用的服务治理平台。它支持基于接口的透明化调用,让服务调用像本地方法调用一样简单。通过...

    深入理解Dubbo框架:从基本原理到模拟实践的全面解析

    具体的手写模拟Dubbo的代码可以在以下地址找到: - 手写代码地址:https://gitee.com/archguide/rpc.git - Git clone地址:https://gitee.com/archguide/rpc.git 此外,了解其他开源RPC框架如Hessian、RMI、gRPC等...

    消息推送中台websocket部分 + netty 手写 RPC

    总结来说,这个项目涵盖了从WebSocket的实时通信实现到Netty手写RPC的底层细节,再到Dubbo的服务治理,涉及了现代互联网应用开发的多个重要技术领域。通过实践这样的项目,开发者不仅可以掌握消息推送系统的运作原理...

Global site tag (gtag.js) - Google Analytics