目录
(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>









