`
zhangyu84849467
  • 浏览: 15405 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自己写了一个RPC框架

    博客分类:
  • rpc
 
阅读更多

项目只依赖asm-all.jar 和zookeeper.jar.

 

项目的配置文是 default.conf.properties

 

配置ip地址, default是本机 socket.bind.address

 

端口 socket.bind.port=47048

 

服务端注解的路径扫描 rpc.service.path.scan=org.fantasy.example

 

客户端端注解的路径扫描 rpc.reference.path.scan=org.fantasy.example

 

zookeeper路径的配置 service.registry.address=192.168.241.130:2181,192.168.241.130:2182

 

使用方法

服务端接口如下:

package org.fantasy.example;

import org.fantasy.bean.annotation.Consumer;
import org.fantasy.bean.annotation.Provider;
import org.fantasy.bean.annotation.RpcMethod;

@Provider(id="user", refClass="org.fantasy.example.UserServiceImpl")
@Consumer(id="user")
public interface UserService {
	@RpcMethod
	public User getUserById(int userId);
	@RpcMethod
	public void addUser(User user);
	@RpcMethod
	public boolean deleteUser(User user);
	
}

 

package org.fantasy.example;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class UserServiceImpl implements UserService {

	private List<User> userList = new ArrayList<User>();
	public User getUserById(int userId) {
		UserProfile profile = new UserProfile();
		profile.setSex((byte)1);
		profile.setAge((short)33);
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try {
			profile.setBirthday(format.parse("1983-02-26"));
		} catch (ParseException e) {
			
		}
		User user = new User(1, "fantasy", "123456");
		user.setUserProfile(profile);
		return user;
	}

	public void addUser(User user) {
		userList.add(user);
	}

	public boolean deleteUser(User user) {
		userList.remove(user);
		return true;
	}

}

 几个实体类如下

package org.fantasy.example;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = -1037883824526548605L;

	private int userId;
	private String userName;
	private String password;
	private UserProfile userProfile;
	
	public User() {
		
	}
	
	public User(int userId, String userName, String password) {
		this.userName = userName;
		this.password = password;
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public String getPassword() {
		return password;
	}

	public UserProfile getUserProfile() {
		return userProfile;
	}

	public void setUserProfile(UserProfile userProfile) {
		this.userProfile = userProfile;
	}

	public int getUserId() {
		return userId;
	}

}

 

package org.fantasy.example;

import java.io.Serializable;
import java.util.Date;

public class UserProfile implements Serializable {
	private static final long serialVersionUID = 1L;
	private short age;
	private String phone;
	private byte sex;
	private Date birthday;
	private String address;
	public UserProfile() {
		
	}
	public short getAge() {
		return age;
	}
	public void setAge(short age) {
		this.age = age;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public byte getSex() {
		return sex;
	}
	public void setSex(byte sex) {
		this.sex = sex;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}

 服务端启动

package org.fantasy.example;

import java.io.IOException;

import org.fantasy.bean.bootstrap.server.ServerBootstrap;

public class ServerStarter {

	public static void main(String[] args) {
		ServerBootstrap bootstrap = new ServerBootstrap();
		bootstrap.start();
		try {
			System.in.read();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

客户端启动( 客户端需要服务端的接口定义)

package org.fantasy.example;

import java.io.IOException;

import org.fantasy.bean.bootstrap.client.ClientBootstrap;

public class ClientStarter {

	public static void main(String[] args) {
		ClientBootstrap bootstrap = new ClientBootstrap();
		bootstrap.start();
		UserService userService = (UserService)bootstrap.getBeanFactory().getBeanInstance("user");
		User user = userService.getUserById(1);
		userService.deleteUser(user);
		userService.addUser(user);
//		Foo foo = (Foo)bootstrap.getBeanFactory().getBeanInstance("foo");
//		foo.hello();
//		foo.bar("hello");
		try {
			System.in.read();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 项目中的序列化是自己实现的,也可以使用JDK 的序列化,代码如下

package org.fantasy.net.io.unsafe;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.fantasy.example.User;

public class UseJdkObjectStream {

	public static void main(String[] args)  {
		User user = new User(1, "fantasy", "123456");
		UnsafeOutputStream uout = null;
		ObjectOutputStream out = null;
		UnsafeInputStream uin = null;
		ObjectInputStream in = null;
		try {
			uout = new UnsafeOutputStream();
			out = new ObjectOutputStream(uout);
			out.writeObject(user);
			uin = new UnsafeInputStream(uout.getBuffer());
			in = new ObjectInputStream(uin);
			user = (User)in.readObject();
		} catch (Exception e) {
			System.err.println(e.getMessage());
		} finally {
			try {
				if(out != null) {
					out.close();
					out = null;
				}
				if(in != null) {
					in.close();
					in = null;
				}
			} catch (IOException e) {
			}
		}
	}
}

 

分享到:
评论

相关推荐

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

    本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码加说明实战方式来讲解,请尽可能下载源码学习。 - 手写RPC框架第一章《自定义配置xml》 - 手写RPC框架第二章...

    实现一个简单的RPC框架

    本篇将详细讲解如何使用socket、反射和序列化等技术来实现一个简单的RPC框架。 首先,让我们了解RPC的基本原理。在RPC模型中,客户端(Client)发起一个函数调用请求,这个请求包含了目标函数的名称和参数。RPC框架...

    基于netty的手写rpc框架

    在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...

    如何用Netty写一个自己的RPC框架

    3. RPC框架的工作机制:RPC框架允许一个应用调用另一个地址空间(通常是远程)中的方法。它主要依赖于网络通信、数据序列化和反序列化、动态代理、服务注册与发现等机制。 4. Java NIO(New I/O):NIO是Java提供的...

    如何实现一个简单的RPC框架

    实现一个简单的RPC框架主要涉及以下几个关键点: 1. **网络通信库**:Netty是一个高性能、异步事件驱动的网络应用框架,常用于构建高并发、低延迟的服务器。在RPC框架中,Netty可以处理客户端与服务端之间的网络...

    Hadoop自己的Rpc框架使用Demo

    本教程将通过一个简单的Demo来讲解如何在自己的项目中利用Hadoop的RPC框架。 首先,理解RPC的基本概念是非常必要的。RPC允许一个程序调用另一个远程程序,就像调用本地函数一样,无需关心远程调用的细节。Hadoop的...

    Java使用传统socket手写的远程RPC框架调用框架

    RPC允许一个程序在不关心远程系统具体实现的情况下,调用另一个远程系统的功能,就像是调用本地方法一样。本框架是基于Java的,利用了Socket作为底层通信机制,结合动态代理和反射技术,使得远程服务调用更加便捷、...

    jsonrpc是一个基于Java的高性能开源RPC框架

    在Java世界中,JSON-RPC作为一个高性能的开源RPC框架,为分布式系统中的服务调用提供了便利。这个框架允许应用程序通过网络在不同的进程之间传递方法调用,仿佛这些方法是在本地对象上调用一样。 JSON-RPC的核心...

    JAVA实现简单RPC框架

    RPC(Remote Procedure Call)框架是分布式系统中广泛使用的通信机制,允许一个进程调用另一个进程中定义的方法,就像调用本地方法一样。在这个“JAVA实现简单RPC框架”的项目中,我们将探讨如何利用Java的核心特性...

    如何用Netty写一个自己的RPC框架.pdf

    如何用Netty写一个自己的RPC框架.pdf 在这篇文章中,我们将讨论如何使用Netty框架来构建一个自己的RPC(Remote Procedure Call)框架。Netty是一个高性能的IO框架,能够帮助我们快速构建高性能的网络应用程序。 ...

    RPC框架的实现原理,及RPC架构组件详解.pdf

    详细讲解RPC

    RPC框架底层模拟

    RPC(Remote Procedure Call)框架是分布式系统中广泛使用的通信机制,它允许一个程序在不关心远程服务器具体实现的情况下调用其方法,就像调用本地对象一样。本篇将深入探讨RPC框架的底层模拟,主要围绕以下几个...

    基于 C++ 的 RPC 框架.zip

    基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++ 的 RPC 框架.zip基于 C++...

    java 手写rpc框架 rpc-server and rpc-client

    总的来说,Java手写RPC框架涉及了网络编程、序列化、多线程、服务治理等多个领域的知识,是一个很好的学习和实践分布式系统设计的平台。通过这个项目,开发者不仅可以提升技术水平,还能对分布式系统的运行机制有更...

    40_如何设计一个类似dubbo的rpc框架?架构上该如何考虑?.zip

    RPC框架使得分布式系统中的不同服务能够透明地调用彼此的功能,仿佛它们都在同一个进程中运行。以下是一些关于如何设计这样一个框架的关键知识点,以及相关的架构考虑。 1. **理解RPC原理**:首先,要构建RPC框架,...

    高性能RPC框架 nfs-rpc.7z

    在本场景中,我们关注的是一个名为“nfs-rpc”的高性能RPC框架。NFS(Network File System)最初是UNIX系统间用于文件共享的协议,而这里的“nfs-rpc”可能是指将NFS协议与RPC概念相结合的一种实现,旨在提供高效的...

    一款基于Netty+Zookeeper+Spring实现的轻量级Java RPC框架。提供服务注册,发现,负载均衡,.zip

    综上所述,这个Java RPC框架利用了Netty的高性能网络通信能力,Zookeeper的分布式协调服务,以及Spring的依赖管理和企业级功能,构建了一个高效、灵活的服务治理解决方案。开发者可以利用这个框架轻松地实现服务间的...

    手写RPC框架V1.zip

    本资源“手写RPC框架V1.zip”提供了作者手动实现的一个RPC框架的源代码,包括`rpc-server`和`rpc-client`两个部分,便于学习者深入理解RPC的工作原理。 ### RPC框架概述 RPC框架的核心目标是简化分布式系统间的通信...

    可参考的自定义实现rpc框架

    标题中的“可参考的自定义实现rpc框架”指的是一个关于如何设计和实现远程过程调用(RPC)框架的教程或示例项目。RPC允许不同计算机系统间的程序进行通信,仿佛它们是在同一台机器上直接调用函数一样。下面将详细...

Global site tag (gtag.js) - Google Analytics