一个最简单的RPC服务流程(二)

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 一个最简单的RPC服务流程(二)

客户端调用用服务端的实现



  1. 在客户端调用我们主要用到的技术是:代理+反射+socket通信+zookeeper
  2. 代理主要是动态代理,这里用来进行通信流程处理的。
  3. 反射主要用来在服务端处理那个服务类,那个方法,请求的参数信息进行发请求数据封装的。
  4. socket通信我们这里使用的netty搭建的,网上很多的,下篇服务端做点简单说明
  5. zookeeper这里主要放的是服务端提供服务暴漏的IP:端口。


节点名称主要是请求类的全路径(也就是服务名这里采用了类的全路径)。

数据格式如下:


request:: '/PINGPANG_REGIST_SERVER/com.pingpang.test.Test,F  response:: v{'127.0.0.1:18868}

  1. zookeeper这里你可以剔除掉,用你的方式获取服务端暴露的服务


1. 本地的调用的时候我们是下面的方式


public int add(int a1,int a2){
 return a1+a2;
};
int sum=add(1,2);
复制代码


1. 远程调用的实现


首先我们声明一个接口


public interface Test {
  public int add(int a,int b);
  public UserInfo findUserByName(String userName,String password);
  public List<UserInfo> findUserList();
  public void TestTask();
  public void TestTask2();
}
复制代码


  1. 代理方法组装成请求的协议

服务地址这里是放在zookeeper上的数据格式为= ip:端口

这里采用的是系统的代理方式进行处理的


public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    return threadPool.submit(new Callable<Object>() {
      @Override
      public Object call() throws Exception {
        try {
          if(null==client) {
            client = new NettyClient();
          }
          //获取IP地址开始
          logger.info("【通过zookeeper获取服务端地址开始】");
          SeverRegistry sr=SeverRegistry.getServerRegistry();
          List<String> ipList=sr.getServerPath(method.getDeclaringClass().getName());
          for(String str:ipList) {
            logger.info("服务名称{},地址{}",method.getDeclaringClass().getName(),str);
            ip=str.split(":")[0];
            port=Integer.valueOf(str.split(":")[1]);
          }
          logger.info("【通过zookeeper获取服务端地址结束】");
          //对数据信息进行组装
          String requestID = UUID.randomUUID().toString().replace("-", "");
          RequestBean request = new RequestBean();
          request.setClassName(method.getDeclaringClass().getName());
          request.setMethodName(method.getName());
          request.setParameters(args);
          request.setParameterTypes(method.getParameterTypes());
          request.setId(requestID);
          request.setIp(ip);
          request.setPort(port);
                                        //远程调用服务端
          Object result = client.send(request);
          ResponseBean response = (ResponseBean) result;
          if(-1==response.getCode()) {
            throw new Exception(response.getErrorMsg());
          }
          return response.getData();
        } catch (Exception e) {
          logger.error("调用失败:" + e.getMessage(), e);
          throw new Exception(e.getMessage());
        } finally {
          //关闭channel 客户端还可以复用
            if(null!=client) { client.destroy(); client = null; }
        }
      }
    }).get();
  }
复制代码


  1. 客户端的调用实例

客户端调用接口的时候是通过代理调用的


RpcFactoryBean<Test>rb=new RpcFactoryBean<>(Test.class);
Test t=rb.getRpc();
System.out.println("结果"+t.add(1, 2));
复制代码


效果


网络异常,图片无法展示
|

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
Dubbo Cloud Native 网络协议
【Dubbo3技术专题】「服务架构体系」第一章之Dubbo3新特性要点之RPC协议分析介绍
【Dubbo3技术专题】「服务架构体系」第一章之Dubbo3新特性要点之RPC协议分析介绍
66 1
|
3月前
|
网络协议 JavaScript 前端开发
性能工具之Jmeter压测Hprose RPC服务
【5月更文挑战第19天】性能工具之Jmeter压测Hprose RPC服务
55 5
|
3月前
|
JSON JavaScript Java
性能工具之Jmeter压测Thrift RPC服务
【5月更文挑战第21天】性能工具之Jmeter压测Thrift RPC服务
57 1
|
3月前
|
负载均衡 Dubbo Java
最简最快了解RPC核心流程
本文主要以最简易最快速的方式介绍RPC调用核心流程,文中以Dubbo为例。同时,会写一个简易的RPC调用代码,方便理解和记忆核心组件和核心流程。
最简最快了解RPC核心流程
|
3月前
|
XML JSON 网络协议
RPC远程服务如何调用
【2月更文挑战第12天】一个完整的 RPC 调用框架包括:通信框架、通信协议、序列化和反序列化三部分。
|
3月前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
129 0
|
3月前
|
Go
Go语言RPC实战:打造自己的远程调用服务
Go语言RPC实战:打造自己的远程调用服务
101 0
|
12月前
|
Dubbo Java 应用服务中间件
为什么大厂用的都是RPC服务
在很久以前,笔者刚毕业开始工作那会儿,对于企业开发的模式一直以为HTTP接口开发,也就是我们常说的RESTful风格的服务接口。的确,对于在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。
165 1
|
网络协议 网络安全 虚拟化
在 Hyper-V 虚拟机中更新组策略时出现 RPC 服务不可用的错误
在 Hyper-V 虚拟机中更新组策略时出现 RPC 服务不可用的错误
243 3