0
点赞
收藏
分享

微信扫一扫

手写RPC框架

高子歌 2022-01-26 阅读 60

目录

1、项目构成

2、代码实现

(1)pojo:com.example.pojo层

(2)service:com.example.service层

(3)provider:com.example. service层

(4)provider:com.example层

(5)consumer:com.example.service层 

(6)consumer:com.example.controller层

(7)consumer:com.example层

(8)RPCDemo 


1、项目构成

  • ​ 创建父项目RPCDemo。
  • ​ 包含4个聚合子项目。
  • pojo:service中需要的实体类
  • service:包含被serviceimpl和provider实现的接口。
  • provider:包含 serviceimpl,provider提供的服务内容
  • consumer:消费者,调用服务内容。

2、代码实现

(1)pojo:com.example.pojo层

public class Person implements Serializable{

private Integer id ;
private String name ;

public Person() {
}

public Person(Integer id, String name) {
this.id = id;
this.name = name;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

(2)service:com.example.service层

public interface MyPersonService extends Remote {
public List<Person>findAll() throws RemoteException;
}

依赖: 

    <dependencies>
<dependency>
<artifactId>pojo</artifactId>
<groupId>com.example</groupId>
<version>1.0.0</version>
</dependency>
</dependencies>

(3)provider:com.example. service层

public class MyPersonServiceImpl extends UnicastRemoteObject implements MyPersonService {

public MyPersonServiceImpl() throws RemoteException {
}

@Override
public List<Person> findAll() throws RemoteException {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1,"嘻嘻嘻"));
personList.add(new Person(2,"哈哈哈"));
return personList;
}
}

(4)provider:com.example层

实现RMI服务的发布和Zookeeper消息的发布。

public class ProviderRun {
public static void main(String[] args) {

try {
MyPersonService myPersonService = new MyPersonServiceImpl();
LocateRegistry.createRegistry(8989);
String url ="rmi://localhost:8989/myPersonService";
Naming.bind(url,myPersonService);
System.out.println("RMI服务启动成功");

//创建zookeeper并发布信息
ZooKeeper zooKeeper = new ZooKeeper("192.168.1.128:2181", 100000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("获取连接");
}
});
zooKeeper.create("/rpc/provider",url.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("注册成功");

} catch (AlreadyBoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}

依赖:

   <dependencies>
<dependency>
<artifactId>service</artifactId>
<groupId>com.example</groupId>
<version>1.0.0</version>
</dependency>

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
</dependency>

</dependencies>

(5)consumer:com.example.service层 

public interface PersonService {
public List<Person>show();
}
@Service
public class PersonServiceImpl implements PersonService {
@Override
public List<Person> show() {
try {
ZooKeeper zooKeeper = new ZooKeeper("192.168.1.128", 100000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("连接成功!");
}
});
byte[] result = zooKeeper.getData("/rpc/provider",false,null);
MyPersonService myPersonService = (MyPersonService) Naming.lookup(new String(result));
return myPersonService.findAll();
} catch (IOException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
return null;
}
}

(6)consumer:com.example.controller层

consumer项目需要从zookeeper中获取RMI信息,并调用RMI服务。

@Controller
public class PersonController {

@Autowired
private PersonService personService;
@RequestMapping("/show")
@ResponseBody
public List<Person> show(){
return personService.show();
}
}

(7)consumer:com.example层

@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}

}

(8)RPCDemo 

   <modules>
<module>pojo</module>
<module>service</module>
<module>provider</module>
<module>consumer</module>
</modules>
举报

相关推荐

0 条评论