0
点赞
收藏
分享

微信扫一扫

手写RPC框架

高子歌 2022-01-26 阅读 63

目录

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 条评论