目录
(2)service:com.example.service层
(3)provider:com.example. service层
(5)consumer:com.example.service层
(6)consumer:com.example.controller层
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>