一、需求:用户管理系统(UMS),仓库管理系统(WMS),订单管理系统(OMS)

现在OMS有一张订单表:【订单id,用户id,商品id,订单状态,订单时间】,需要在客户端展示此订单对应的用户详情和商品详情

二、接口API整理:在OMS中,需要根据用户id在UMS中查询用户详情和根据商品id在WMS中查询商品详情

1.User selectUserById(long id)

2.Product selectProductById(long id)

三、接口调用架构图:

aaarticlea/png;base64,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9NhjjzW7v1deeUUhISF64oknFBUVpQ8++EAjRoxosQ6PPfaYrrrqKklSaGio9u/frz//+c967bXXZDabNWfOHKWkpCg2NlbR0dG27Wpra7V582aZTCYlJyfrnHPOkbe3t7Zu3apPP/1Uo0aN0iuvvCKTyaRu3bo5fKbJZFJtba1+/PFH3XDDDQ7rGvaIIdAF4CrLly/XqlWrJElLly7VqFGjHNbbX6+MRqNiYmI0ZswYzZgxQ/7+/o3KSD9f0/761786LK+qqtKOHTskSc8884wCAgJs6yIiIhQTE6Nt27Y5bNOzZ0+lpqaewRHiTBHYAgA8ztatW22Nll27dmnevHny8vKS5Bi8LVy40Bbs/vWvf9V///tflZWVacGCBTrvvPMkSe+++6769u3rsO+HH35YktS3b19NnTpVr776qtasWaOePXs61OP48eMym8225cHBwZIcG1/Z2dmNGmOfffaZfvWrX6lnz55au3atEhISdOutt+rll1/WF198oZ07d6q6ulq+vr766quvtG3bNmVkZCg5OVlvvPGGfvnLX6pnz57aunWrJCk1NVXBwcF66623JNUH8idOnLC9l+TQsAOA9rZp0yYFBgaqoqJCmzdvbhTYWk2aNEkmk0lbt27VmjVrVF5ervnz59vWvf3225KkadOm2bZ55ZVXmv1c++ugVB/Avvnmm3rrrbd00003afjw4frd736n2bNnS3L8DbH2fkH7ILD1UHSxAODJDh06pE2bNkmS0tPTlZ6ernHjxkmS3nnnHVu5I0eO2F7v2LHDdg3csGGDLbBt+JSzodtvv11RUVGaMGGC7rjjDod1Y8eOVUFBQZPX0IiICE2ZMkWStHr1ahUWFmrmzJm29S+88IJD+d/+9rf69a9/re7duzsEwuvXr7e93r17t3bv3q0pU6aooqJC27dvl1T/tHr27Nnat2+fwz5vuukm2+sbbrjBFrADQHvat2+fMjIyNHbsWO3cuVOff/65ysvLFRQU1Kjs9OnTFR4errFjx+ruu+/W9u3bbYHt9OnTbYGt/fVUqg9Y//rXv+q1117TXXfdpcjISN15552KiorSkiVLJP180zE4ONg2pCM0NNRheIfFYtEll1yiPn36nPS4TCaT6urquHHYSghsOxC6WABA+5gxY4aGDRumu+66yzbGduHChZKkp556qslt3n33XS1YsEBf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+RBVtWpV5syZY/ze8uXLVZxEROQB69+/PykpKXkGtVnZ2NgQFBREr169eP/993N90SkPngJbERGRv2DXrl1ERUXRqVMnEhMT2b9/P05OTvTt25fvv/+eiIgISpYsyVtvvcWrr75qnDdu3Djq1atH586d+eCDD0hOTubixYsAxv+zpij7+flx9OhRatWqRaNGjQA4dOgQJ0+evO+Ir4iI/DV+fn5/6Phq1arRqlUrtm/fznfffZfrurryYCmwfcQpbUJE5OHq1KkTlSpVonbt2vz8889MnjyZvXv3snfvXgBKlCjBsGHDaNy4McnJyTg7OzNt2jTi4+OB/y2ttnbtWqPNefPmAVgFrPXr1wfg1q1brFy5kq+++oq0tDQyMjJy7dfJkyc1z1ZEHjuW59pZs2axePFiEhISqFKlCh988AF16tQBwGw2s2jRIjZs2EB6ejoDBgwwRlVjYmJwcXHJs13L92azmeDgYMLCwkhNTc11Obj27duzfft2NmzYoMC2ACiwfcQpbUJE5OFavHgx4eHhXLx40QgyPTw8aNiwIfHx8SQlJVnNue3atStJSUkkJCQYbcTFxRETE8PYsWOpVKkS7777rvFd6dKladiwIQsXLsTGxoZmzZqRmJgIQN++fbl9+3aefdM8WxF5XM2bN48WLVqQlpbG8ePHmT59Op999hkAn332GSEhIbi5ueHr68tXX331h9tfsWIFn376Ka6urnTu3Jno6Ogcx9SrVw+Affv2/bWLkXxRYPuIU9qEiMjD1aBBA7Zt28YLL7zAs88+i7OzM19//TUNGzbkX//6FydOnODAgQMcO3aMM2fOEBAQQO3atZk2bRrr168HIDY21qh+f/r0aUaNGmW0X716ddauXUt8fDxlypTh9OnTQGZV5TZt2rBp0yajHYD58+ezc+dOBbUi8libOnUq9evX59ChQ/Tr148jR44Y34WHhwMwceJEWrVqRUJCAt26dftD7YeFhRlttG7dmsTERPz9/a2O8fDwAODatWvcunULR0fHv3JJch8KbB9xSpsQEXm4XFxcjHvlhQsX2LNnD7GxsaSmpnL27FnjOFtbW5o2bUrt2rWtzt+0aROTJ0+mSpUqvPzyyzRr1ownnniCdevW8cknnxhLo929e5fff/+d77//HoA1a9bQpEkTAEaMGGG0d+3atYd6vSIixYGnpyeQuewk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HXiATA0bNowAOhV2R+SR9tW+ffteoQi9nRIRERERedw9SkOaGefOnfuiQoUKiTY2NmUBJ8CxsDslj4RLwE8ZGRlT4+Pj/4mCWhERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER+ev+H3E5RTT5CDIiAAAAAElFTkSuQmCC" alt="" />

四、代码实现

1.工程结构

2.代码实现

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

自己动手实现RPC的更多相关文章

  1. 自己动手写RPC

    接下来2个月 给自己定个目标 年前  自己动手做个RPC 框架 暂时技术选型  是 dotcore + netty + zookeeper/Consul

  2. 【原创】自己动手实现RPC服务调用框架

    自己动手实现rpc服务调用框架 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者).battercake- ...

  3. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成

    本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博文了,最近忙着两件事;    一:阅读刘墉先生的<说话的魅力>,以一种微妙的,你我大家都会经常遇见 ...

  4. 自己动手实现RPC服务调用框架

    转自:http://www.cnblogs.com/rjzheng/p/8971629.html#3977269 担心后面忘了,先转了,后面借鉴实现一下RPC -------------------- ...

  5. 自己动手实现XXX系列

    前记: 最近看了rongjun的一片文章:自己动手实现jdk代理类.按照上面的例子敲完才发现,JDK动态代理 实现底层原来如此简单,只是大量的使用了反射,类编译,类加载一些常规的东西 而且本质也是如实 ...

  6. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

  7. TCP粘包/拆包 ByteBuf和channel 如果没有Netty? 传统的多线程服务器,这个也是Apache处理请求的模式

    通俗地讲,Netty 能做什么? - 知乎 https://www.zhihu.com/question/24322387 谢邀.netty是一套在java NIO的基础上封装的便于用户开发网络应用程 ...

  8. .NET Core微服务之路:不断更新中的目录 (v0.43)

    原文:.NET Core微服务之路:不断更新中的目录 (v0.43) 微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑, ...

  9. 动手实现一个简单的 rpc 框架到入门 grpc (上)

    rpc 全称 Remote Procedure Call 远程过程调用,即调用远程方法.我们调用当前进程中的方法时很简单,但是想要调用不同进程,甚至不同主机.不同语言中的方法时就需要借助 rpc 来实 ...

随机推荐

  1. Spring Boot使用Druid连接池基本配置

    以下为Spring Boot配置Druid 一.pom.xml配置 <dependency> <groupId>com.alibaba</groupId> < ...

  2. js文档节点关系

    这一节简单介绍一下文档节点方面的相关内容: 一:获得节点关系的属性 1.获得该元素父节点的引用:obj.parentNode: <div class="content"> ...

  3. 【分治-前缀积后缀积】JS Window @2018acm徐州邀请赛G

    问题 G: JS Window 时间限制: 2 Sec  内存限制: 512 MB 题目描述 JSZKC has an array A of N integers. More over, he has ...

  4. Drools(BRMS) 速成教程(上)

    大家在日常开发中,肯定遇到过一些业务规则变来变去的需求,比如:会员积分系统(今天要新注册会员送10积分,明天要改成注册送优惠券,后天搞活动要改成注册自动变成高级会员...),此类需求,一般都是通过写i ...

  5. SQL批量更新数据

    SQL批量更新数据 step1:导入Excel数据, 具体见百度.注意点:一列中含有float型数据和文本数据的时候,导入要将Excel中的表格属性改成文本,或在数字项目前加个单引号.   step2 ...

  6. 在图像上增加文字 C#

    using (Image i = Image.FromFile(inputPath)) { using (Graphics g = Graphics.FromImage(i)) { g.DrawStr ...

  7. 关闭windows10更新

    除了能够禁用Windows自动更新外,还能一键禁用Windows安全中心.Windows Defender.Windows防火墙. 下载地址 https://files.cnblogs.com/fil ...

  8. Mongo 常用操作

    1.查询 [基本形式]db.col.find().pretty():pretty() 方法以格式化的方式来显示所有文档. [获取记录条数]:db.users.find().count(); [读取指定 ...

  9. JavaScript单独的模块中传递数据

    首先我们来看看这张图,让我们来思考一下! 下买我给出我的完整思路代码 html代码: <!DOCTYPE html> <html lang="zh-CN"> ...

  10. html5使用canvas实现毫秒级画心电图