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(); } } }