一、前言
简单聊一下RPC(Remote Procedure Call) ,远程过程调用,底层基于TCP/IP通信,下图是简单的微服务架构,会员服务需要查询当前会员下面的订单信息,则会涉及会员服务调用订单服务:
1、用户终端访问主站首页;
2、用户登陆,调用会员的登陆验证服务;
3、用户查看我的订单,调用会员服务的订单列表查询-->这时涉及会员服务调用订单服务;
技术选型:
1)可以采用HTTP访问,https://域名/接口/参数
2)可以采用基于Socket通信的RPC协议,实现会员服务与订单服务的通信。
二、案例分享:
1、首先将订单服务接口打包,供会员服务引用:
package org.example;
/**
* @program: OrderService
* @description
* @author: 大龄程序猿
* @create: 2020-06-22 23:52
**/
public interface IOrderService {
String queryOrderList();
String orderById(String id);
}
系统间通信的数据结构:
package org.example;
import java.io.Serializable;
import java.util.Arrays;
/**
* @program: OrderService
* @description
* @author: 大龄程序猿
* @create: 2020-06-23 00:39
**/
public class RpcRequest implements Serializable {
private static final long serialVersionUID = 1502241954359378124L;
private String className;
private String methodName;
private Object[] args;
private Class[] types;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Object[] getArgs() {
return args;
}
public void setArgs(Object[] args) {
this.args = args;
}
public Class[] getTypes() {
return types;
}
public void setTypes(Class[] types) {
this.types = types;
}
@Override
public String toString() {
return "RpcRequest{" +
"className='" + className + '\'' +
", methodName='" + methodName + '\'' +
", args=" + Arrays.toString(args) +
", types=" + Arrays.toString(types) +
'}';
}
}
2、会员服务代码开发:
会员服务在本次的业务场景中,充当着客户端的角色,咱们需要知道服务端的SocketServer的监听端口,另外通过订单的接口,咱们可以通过动态代理,在h对象中,调用服务的服务接口,并将结果通过流,回写到客户端,整个流程看起来,就像在调用客户端本地的方法。
代码示例,代码骨架基于SpringBoot:
自定义注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @program: UserService
* @description
* @author: 大龄程序猿
* @create: 2020-06-23 23:36
**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JasonReference {
}
动态代理,实现接口的注入
package org.example;
import org.example.annotation.JasonReference;
import org.springframework.beans.