项目只依赖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) { } } } }
相关推荐
本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码加说明实战方式来讲解,请尽可能下载源码学习。 - 手写RPC框架第一章《自定义配置xml》 - 手写RPC框架第二章...
本篇将详细讲解如何使用socket、反射和序列化等技术来实现一个简单的RPC框架。 首先,让我们了解RPC的基本原理。在RPC模型中,客户端(Client)发起一个函数调用请求,这个请求包含了目标函数的名称和参数。RPC框架...
在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...
3. RPC框架的工作机制:RPC框架允许一个应用调用另一个地址空间(通常是远程)中的方法。它主要依赖于网络通信、数据序列化和反序列化、动态代理、服务注册与发现等机制。 4. Java NIO(New I/O):NIO是Java提供的...
实现一个简单的RPC框架主要涉及以下几个关键点: 1. **网络通信库**:Netty是一个高性能、异步事件驱动的网络应用框架,常用于构建高并发、低延迟的服务器。在RPC框架中,Netty可以处理客户端与服务端之间的网络...
本教程将通过一个简单的Demo来讲解如何在自己的项目中利用Hadoop的RPC框架。 首先,理解RPC的基本概念是非常必要的。RPC允许一个程序调用另一个远程程序,就像调用本地函数一样,无需关心远程调用的细节。Hadoop的...
RPC允许一个程序在不关心远程系统具体实现的情况下,调用另一个远程系统的功能,就像是调用本地方法一样。本框架是基于Java的,利用了Socket作为底层通信机制,结合动态代理和反射技术,使得远程服务调用更加便捷、...
在Java世界中,JSON-RPC作为一个高性能的开源RPC框架,为分布式系统中的服务调用提供了便利。这个框架允许应用程序通过网络在不同的进程之间传递方法调用,仿佛这些方法是在本地对象上调用一样。 JSON-RPC的核心...
RPC(Remote Procedure Call)框架是分布式系统中广泛使用的通信机制,允许一个进程调用另一个进程中定义的方法,就像调用本地方法一样。在这个“JAVA实现简单RPC框架”的项目中,我们将探讨如何利用Java的核心特性...
如何用Netty写一个自己的RPC框架.pdf 在这篇文章中,我们将讨论如何使用Netty框架来构建一个自己的RPC(Remote Procedure Call)框架。Netty是一个高性能的IO框架,能够帮助我们快速构建高性能的网络应用程序。 ...
详细讲解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++...
总的来说,Java手写RPC框架涉及了网络编程、序列化、多线程、服务治理等多个领域的知识,是一个很好的学习和实践分布式系统设计的平台。通过这个项目,开发者不仅可以提升技术水平,还能对分布式系统的运行机制有更...
RPC框架使得分布式系统中的不同服务能够透明地调用彼此的功能,仿佛它们都在同一个进程中运行。以下是一些关于如何设计这样一个框架的关键知识点,以及相关的架构考虑。 1. **理解RPC原理**:首先,要构建RPC框架,...
在本场景中,我们关注的是一个名为“nfs-rpc”的高性能RPC框架。NFS(Network File System)最初是UNIX系统间用于文件共享的协议,而这里的“nfs-rpc”可能是指将NFS协议与RPC概念相结合的一种实现,旨在提供高效的...
综上所述,这个Java RPC框架利用了Netty的高性能网络通信能力,Zookeeper的分布式协调服务,以及Spring的依赖管理和企业级功能,构建了一个高效、灵活的服务治理解决方案。开发者可以利用这个框架轻松地实现服务间的...
本资源“手写RPC框架V1.zip”提供了作者手动实现的一个RPC框架的源代码,包括`rpc-server`和`rpc-client`两个部分,便于学习者深入理解RPC的工作原理。 ### RPC框架概述 RPC框架的核心目标是简化分布式系统间的通信...
标题中的“可参考的自定义实现rpc框架”指的是一个关于如何设计和实现远程过程调用(RPC)框架的教程或示例项目。RPC允许不同计算机系统间的程序进行通信,仿佛它们是在同一台机器上直接调用函数一样。下面将详细...