本身動手實現RPC

1、需求:用戶管理系統(UMS),倉庫管理系統(WMS),訂單管理系統(OMS)api

如今OMS有一張訂單表:【訂單id,用戶id,商品id,訂單狀態,訂單時間】,須要在客戶端展現此訂單對應的用戶詳情和商品詳情網絡

2、接口API整理:在OMS中,須要根據用戶id在UMS中查詢用戶詳情和根據商品id在WMS中查詢商品詳情架構

1.User selectUserById(long id)socket

2.Product selectProductById(long id)ide

3、接口調用架構圖:this

4、代碼實現spa

 1.工程結構3d

2.代碼實現code

// OMS系統代碼
public
class Order { private Long id; // 商品id private Long productId; // 用戶id private Long userId; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getProductId() { return productId; } public void setProductId(Long productId) { this.productId = productId; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } @Override public String toString() { return "Order{" + "id=" + id + ", productId=" + productId + ", userId=" + userId + '}'; } } public class OrderService { public Order selectOrderById(long id){ Order order = new Order(); order.setId(id); order.setUserId(1l); order.setProductId(1L); return order; } } public class Main { public static void main(String[] args) { // 獲取訂單詳情 OrderService orderService = new OrderService(); Order order = orderService.selectOrderById(1L); System.out.println("訂單信息:" + order); // 根據商品id獲取商品 ProductService productService = (ProductService) rpcHandle(ProductService.class, "127.0.0.1", 8888); Product product = productService.selectProductById(order.getProductId()); System.out.println("商品信息:" + product); // 根據用戶id獲取用戶 UserService userService = (UserService) rpcHandle(UserService.class, "127.0.0.1", 9999); User user = userService.selectUserById(order.getUserId()); System.out.println("用戶信息:" + user); } /** * RPC遠程調用實現 */ public static Object rpcHandle(final Class clazz, final String host, final int port) { return Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Socket socket = new Socket(host, port); // 想要調用遠程類的某個方法,必需要知道類名稱,方法名稱,參數類型,參數 String apiClassName = clazz.getName(); String methodName = method.getName(); Class[] parameterTypes = method.getParameterTypes(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); objectOutputStream.writeUTF(apiClassName); objectOutputStream.writeUTF(methodName); objectOutputStream.writeObject(parameterTypes); objectOutputStream.writeObject(args); objectOutputStream.flush(); ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); Object object = objectInputStream.readObject(); if (null != objectInputStream ){ objectInputStream.close(); } if (null != objectOutputStream){ objectOutputStream.close(); } if (null != socket){ socket.close(); } return object; } } ); } }
// WMS代碼
public class Product implements Serializable {
    private Long id;
    private String name;
    private Double price;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

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

public interface ProductService {

    /**
     * 根據商品ID查詢商品信息
     *
     * @param id:商品id
     * @return
     */
    Product selectProductById(long id);
}

public class ProductServiceImpl implements ProductService {
    public Product selectProductById(long id) {
        Product product = new Product();
        product.setId(id);
        product.setName("CAMEL運動鞋");
        product.setPrice(299.0);
        return product;
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            while (true) {
                Socket socket = serverSocket.accept();
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
                // 讀取網絡協議
                String apiClassName = objectInputStream.readUTF();
                String methodName = objectInputStream.readUTF();
                Class[] parameterTypes = (Class[]) objectInputStream.readObject();
                Object[] argsMethod = (Object[]) objectInputStream.readObject();

                Class clazz = null;
                // 服務註冊:API到具體實現的映射關係
                if (apiClassName.equals(ProductService.class.getName())) {
                    clazz = ProductServiceImpl.class;
                }
                ObjectOutputStream objectOutputStream = null;
                if (null != clazz) {
                    Method method = clazz.getMethod(methodName, parameterTypes);
                    Object invoke = method.invoke(clazz.newInstance(), argsMethod);
                    objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                    objectOutputStream.writeObject(invoke);
                    objectOutputStream.flush();
                }
                // 關閉資源
                if (null != objectInputStream) {
                    objectInputStream.close();
                }
                if (null != objectOutputStream) {
                    objectOutputStream.close();
                }
                if (null != socket) {
                    socket.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
// UUMS代碼
public class User implements Serializable {
    private Long id;
    private String name;
    private Integer age;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

public interface UserService {

    /**
     * 根據用戶id,查詢用戶
     * @param id:用戶id
     * @return
     */
    User selectUserById(Long id);
}

public class UserServiceImpl implements UserService {
    public User selectUserById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("Jack Tang");
        user.setAge(20);
        return user;
    }
}

public class UserServiceImpl implements UserService {
    public User selectUserById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("Jack Tang");
        user.setAge(20);
        return user;
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(9999);
            while (true) {
                Socket socket = serverSocket.accept();
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
                String apiClassName = objectInputStream.readUTF();
                String methodName = objectInputStream.readUTF();
                Class[] parameterTypes = (Class[]) objectInputStream.readObject();
                Object[] argsMethod = (Object[]) objectInputStream.readObject();

                Class clazz = null;
                if (apiClassName.equals(UserService.class.getName())){
                    clazz = UserServiceImpl.class;
                }
                ObjectOutputStream objectOutputStream = null;
                if (null != clazz) {
                    Method method = clazz.getMethod(methodName, parameterTypes);
                    Object invoke = method.invoke(clazz.newInstance(), argsMethod);
                    objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                    objectOutputStream.writeObject(invoke);
                    objectOutputStream.flush();
                }
                // 關閉資源
                if (null != objectInputStream) {
                    objectInputStream.close();
                }
                if (null != objectOutputStream) {
                    objectOutputStream.close();
                }
                if (null != socket) {
                    socket.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索