当前位置: 首页 > news >正文

php商城网站建设中国小康建设网是骗子网站吗?

php商城网站建设,中国小康建设网是骗子网站吗?,国外扁平化网站,集团公司网站方案注册中心 RPC#xff08;Remote Procedure Call#xff09;翻译成中文就是 {远程过程调用}。RPC 框架起到的作用就是为了实现#xff0c;调用远程方法时#xff0c;能够做到和调用本地方法一样#xff0c;让开发人员更专注于业务开发#xff0c;不用去考虑网络编程等细节… 注册中心 RPCRemote Procedure Call翻译成中文就是 {远程过程调用}。RPC 框架起到的作用就是为了实现调用远程方法时能够做到和调用本地方法一样让开发人员更专注于业务开发不用去考虑网络编程等细节。 RPC 框架怎么就实现不让开发人员关注网络编程等细节呢 首先我们区分两个角色一个服务提供方一个是服务调用方。服务调用方其实是通过动态代理、负载均衡、网络调用等机制去服务提供方的机器上去执行对应的方法。服务提供方将方法执行完成后将执行结果再通过网络传输返回到服务提供方。 大致过程如下 但是现在的服务都是集群部署那么服务调用方怎么能够实时的知道服务提供方的集群中的变化例如服务提供方的 IP 地址变了或者是服务重启时怎么能够及时的切换流量呢 这就需要{注册中心} 起作用了我们可以把注册中心看作服务端然后每个服务都看成客户端每个客户端都需要将自己注册到注册中心然后一个服务调用方要调用另一个服务时需要从注册中心获取服务提供方的信息主要是获取服务提供方的服务器 IP 地址列表和端口信息。 服务调用方获取到这些信息后缓存到自己本地并且跟注册中心保持一个长连接当服务提供方有任何变化时注册中心能够实时的通知给服务调用方调用方能够及时更新自己本地缓存的信息也可以采用定时轮询的方式。 服务调用方获取到服务器 IP 地址信息后根据自己的负载均衡策略选择一个 IP 地址然后发起网络调用的请求。 那么网络客户端是通过什么发起的网络调用呢 可以自己使用 JDK 原生的 BIO 或者 NIO 来实现一套网络通信模块但是这里我们建议直接使用强大的网络通信框架 Netty。它是基于 NIO 的网络通信框架支持高并发封装完善而且性能好传输快。 Netty 不是我们本文的主要内容这里就不展开说了。 客户端调用过程 因为我们知道数据在网络中传输的时候都是以二进制的形式的所以在调用方将调用的参数进行传递的时候是需要进行序列化的。服务提供方在接收到参数时也是需要进行反序列化的。 网络协议 调用方既然需要序列化服务提供方又要进行反序列化这样双方就要确定好一个协议调用方传输什么参数服务提供方就按照这个协议去进行解析而且在返回结果的时候也是按照这个协议进行结果解析。 那么这个协议应该是怎么样的结构都是什么样子的呢 因为这个协议可以自定义我们为了方便就以 JSON 的形式给举个例子 {interfaces: interfacecom.jimoer.rpc.test.producer.TestService;methodprintTest;parametercom.jiomer.rpc.test.producer.TestArgs,requestId: 3,parameter: {com.jiomer.rpc.test.producer.TestArgs: {age: 20,name: Jimoer}} } 首先第一个参数interfaces是我们要让服务提供方知道调用方要调用哪个接口以及接口中的哪个方法并且方法的参数是什么类型的。 第二个参数是当前一次请求的一个唯一标识在多个线程同时请求一个方法时用这个 id 来进行区分以后无论是做链路追踪还是日志管理都可以以此 id 为依据。 第三个参数就是 实际的调用方法中的参数值。具体是什么类型的每个属性值都是什么。 调用 下面也是举一个简单的例子来说明一下调用的过程。我们一部分采用代码的形式一部分采用文字的形式来将整个调用过程串起来。 // 定义请求的URL String tcpURL tcp://testProducer/TestServiceImpl; // 定义接口请求 TestService testService ProxyFactory.create(TestService.class, tcpURL); // 组装请求参数 TestArgs testArgs new TestArgs(20,Jimoer); // 通过动态代理执行请求 String result testService.printTest(testArgs); 通过查看上面的代码我们可以看到整个调用过程最核心的地方在 ProxyFactory.create() 方法里这个方法里面主要的过程是动态代理生成接口的实际代理对象然后使用 Netty 的接口发起网络请求。 Proxy.newProxyInstance(getClass().getClassLoader(), interfaces.getClass().getInterfaces(), new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 第一步获取调用服务的地址列表ListregistryInfos interfacesMethodRegistryList.get(clazz);if (registryInfos null) {throw new RuntimeException(无法找到服务提供者);}// 第二步 通过自身的负载均衡策略选择一个地址RegistryInfo registryInfo loadBalancer.choose(registryInfos);// 第三步Netty的网络请求处理ChannelHandlerContext ctx channels.get(registryInfo);// 第四步根据接口类的全路径名和方法生成唯一标识String identify InvokeUtils.buildInterfaceMethodIdentify(clazz, method);String requestId;// 第五步通过加锁的方式保证生成的requestId的唯一性synchronized (ApplicationContext.this) {requestIdWorker.increment();requestId String.valueOf(requestIdWorker.longValue());}// 第六步 组织参数JSONObject jsonObject new JSONObject();jsonObject.put(interfaces, identify);jsonObject.put(parameter, param);jsonObject.put(requestId, requestId);System.out.println(发送给服务端JSON为 jsonObject.toJSONString());// $$ 多条消息之间的分隔符String msg jsonObject.toJSONString() $$;ByteBuf byteBuf Unpooled.buffer(msg.getBytes().length);byteBuf.writeBytes(msg.getBytes());// 第七步这里发起调用ctx.writeAndFlush(byteBuf);// 这里会将线程进行阻塞知道服务提供方将请求处理好之后返回结果再唤醒。waitForResult();return result;}}); 执行过程大致分为这几步 获取调用服务的地址列表。通过自身的负载均衡策略选择一个地址。Netty 的网络请求处理选择一个渠道 Channel。根据接口类的全路径名和方法生成唯一标识。通过加锁的方式保证生成的 requestId 的唯一性。组织请求参数。发起调用。线程阻塞直到服务提供方返回结果。填充返回结果返回到调用方。 服务端处理过程 上面也说了服务调用方发起网络请求后会阻塞住直到服务提供方返回数据所以服务提供方处理完调用方法的逻辑后还是要唤醒阻塞的调用线程的。 服务提供方在处理请求时也是先通过 Netty 获取到数据然后再进行反序列化然后再根据协议获取到需要调用的方法然后通过反射去进行调用。 Netty 的返回入口在下面这部分逻辑里 Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {try {String message (String) msg;if (messageCallback ! null) {// 将接收到的消息放到回调方法中messageCallback.onMessage(message);}} finally {ReferenceCountUtil.release(msg);} } Netty 的 client 接收到响应的消息后先将结果返回到调用方处理完成之后再去释放之前的阻塞调用线程。 client.setMessageCallback(message - {// 这里收单服务端返回的消息先压入队列RpcResponse response JSONObject.parseObject(message, RpcResponse.class);System.out.println(收到一个响应 response);String interfaceMethodIdentify response.getInterfaceMethodIdentify();String requestId response.getRequestId();// 设定唯一标识String key interfaceMethodIdentify # requestId;Invoker invoker inProgressInvoker.remove(key);// 将结果设置到代理对象中invoker.setResult(response.getResult());// 加锁再释放之前的阻塞线程。synchronized (ApplicationContext.this) {ApplicationContext.this.notifyAll();} }); setResult() 方法 Override public void setResult(String result) {synchronized (this) {this.result JSONObject.parseObject(result, returnType);notifyAll();} } 上面的步骤就是这样按照之前请求的唯一标识放入到返回的信息中然后将结果设置到代理对象中再通过返回结果然后唤醒之前的调用阻塞线程。 总结 其实整个 RPC 的请求过程就是如下不含异步调用 做一个总结用大白话把一个 RPC 请求流程描述出来 首先无论是调用方还是服务提供方都要注册到注册中心 服务调用方把请求参数对象序列化成二进制数据通过动态代理生成代理对象通过代理对象使用 Netty 选择一个从注册中心拉取到的服务提供方的地址然后发起网络请求。服务提供方从 TCP 通道中接收到二进制数据根据定义的 RPC 网络协议从二进制数据中反序列化后分割出接口地址和参数对象再通过反射找到接口执行调用。然后服务提供方再把调用执行结果序列化后回传到 TCP 通道中。服务调用方获取到应答二进制数据后再反序列化成结果对象。 这样就完成了一次 RPC 网络调用其实后面框架扩展后还要考虑限流、熔断、服务降级、序列化多样性扩展服务监控、链路追踪等等功能。
http://www.w-s-a.com/news/120324/

相关文章:

  • 自己做网站怎么推广网站建设应该考虑哪些方面
  • 我做的网站手机上不了wordpress插件整站搬家
  • 河南省和建设厅网站首页西安找建网站公司
  • 网页设计基础代码网站进出成都最新通知
  • 如何创建网站乐清网络科技有限公司
  • 沈阳市网站制作艺术字体logo设计生成器
  • 网站设计常用软件都有哪些中国建设银行官方招聘网站
  • 证券投资网站建设视频直播怎么赚钱的
  • 建设酒店网站ppt模板下载郑州小程序设计外包
  • 网站建设自我总结google推广公司
  • 安全网站建设情况wordpress 评论表单
  • 网站建设发言材料个人网站推广软件
  • php建站软件哪个好南京哪家做网站好
  • 排名好的手机网站建设番禺网站建设专家
  • 番禺怎么读百度有专做优化的没
  • 网站开发中应注意哪些问题网络营销的主要特点
  • 网站定制案例北京网站制作招聘网
  • 网站建设与推广实训小结网站建设专业英文
  • 郑州网站建设动态凡科网站建设是免费的吗
  • 湖北手机网站建设wordpress转emlog博客
  • 北京东站设计网名的花样符号
  • 安徽建设厅网站首页网站开发aichengkeji
  • 自贡网站制作荣茂网站建设
  • 什么做的网站吗正规的机械外包加工订单网
  • 网络工程公司的业务邵阳seo快速排名
  • 博主怎么赚钱网站seo找准隐迅推
  • 营销号经典废话北京网站建设公司网站优化资讯
  • 一六八互联网站建设怎么做套版网站
  • wordpress 书站建筑公司简介范文大全
  • 建设官方网站多少鲜花网站建设的主要工作流程