项目只依赖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 userList = new ArrayList();
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) {
}
}
}
}