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

上海招聘用的最多的网站福州seo排名公司

上海招聘用的最多的网站,福州seo排名公司,云南楚雄地图,购物网站建设模板图片文章目录 仿gRPC功能实现像调用本地方法一样调用其他服务器方法 简介单体架构微服务架构RPCgPRC gRPC交互逻辑服务端逻辑客户端逻辑示例图 原生实现仿gRPC框架编写客户端方法编写服务端方法综合演示 仿 gRPC功能实现像调用本地方法一样调用其他服务器方法 简介 在介绍gRPC简介…

文章目录

  • 仿`gRPC`功能实现像调用本地方法一样调用其他服务器方法
    • 简介
        • 单体架构
        • 微服务架构
        • `RPC`
        • `gPRC`
    • `gRPC`交互逻辑
        • 服务端逻辑
        • 客户端逻辑
        • 示例图
    • 原生实现仿`gRPC`框架
        • 编写客户端方法
        • 编写服务端方法
        • 综合演示

仿 gRPC功能实现像调用本地方法一样调用其他服务器方法

简介

在介绍gRPC简介之前我们先了解一写概念:

单体架构

单体架构简单理解就是所有的业务代码都在一台服务器上,一旦某个服务宕机,会引起整个应用不可用,隔离性差。只能整体应用进行伸缩,例如整体打包部署一台或多台服务器,浪费资源,可伸缩性差。代码耦合在一起,可维护性差。

微服务架构

解决了单体架构的弊端。可按需拆成多个服务,例如针对用户的请求非常多,针对支付的请求少,可以将用户业务功能拆为多个服务器,支付业务功能拆为单个服务器。

也有一些弊端,例如代码冗余,同样的代码在多个服务器上都要写,例如接口等。服务与服务之间存在调用关系,服务拆分之后,就是服务和服务之间发生是进程与进程之间的调用,服务器与服务器之间的调用。

这时候就需要发起网络调用, 网络调用一般使用HTTP,但是在微服务架构中,HTTP虽然方便,但性能较低,这时候就需要引入RPC(远程过程调用),通过自定义协议发起TCP调用,来加快传输效率。

RPC

RPC的全称是Remote Procedure Call,远程过程调用。这是一种协议,是用来屏蔽分布式计算中的各种调用细节使得你可以像是本地调用一样直接调用一个远程的函数。

gPRC

gRPC 是一个高性能、开源和通用的RPC 框架,面向移动和 HTTP/2 设计。目前提供 CJavaGo 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHPC# 支持。

中文文档:http://doc.oschina.net/grpc

gRPC中,我们称调用方为client,被调用方为server。跟其他的RPC框架一样,gRPC也是基于服务定义的思想。简单的来讲,就是我们通过某种方式来描述一个服务,这种描述方式是语言无关的。在这个服务定义的过程中,我们描述了我们提供的服务服务名是什么,有哪些方法可以被调用,这些方法有什么样的入参,有什么样的回参。

也就是说,在定义好了这些服务、这些方法之后,gRPC会屏蔽底层的细节,client只需要直接调用定义好的方法,就能拿到预期的返回结果。对于server端来说,还需要实现我们定义的方法。同样的,gRPC也会帮我们屏蔽底层的细节,我们只需要实现所定义的方法的具体逻辑即可。

可以发现,在上面的描述过程中,所谓的服务定义,就跟定义接口的语义是很接近的。我更愿意理解为这是一种"约定”,双方约定好接口,然后server实现这个接口,client调用这个接口的代理对象。到于其他的细节,交给gRPC

gRPC交互逻辑

服务端逻辑

  • 创建gRPC Server对象,可以理解为它是Server端的抽象对象。
  • server(其包含需要被调用的服务端接口)注册到gRPC Server的内部注册中心。
    • 这样可以在接受到请求时,通过内部的服务发现。发现该服务端接口并转接进行逻辑处理。
  • 创建Listen,监听TCP端口。
  • gRPC Server开始lis.Accept,直到Stop

客户端逻辑

  • 创建与给定目标服务端的连接交互。
  • 创建server的客户端对象。
  • 发送RPC请求,等待同步响应,得到回调后返回响应结果。
  • 输出响应结里。

示例图

如下图:业务服务器调用登录业务服务器,支付服务器,库存服务器。

在这里插入图片描述

原生实现仿gRPC框架

因为gRPC框架目前不支持IRIS/Caché,所以这里我们了解gRPC原理后,仿造gRPC框架实现类似的功能。通过正常编写代码无感知的情况下调用其他服务器上的代码方法。

注:为了显示这里使用Caché作为客户端,IRIS作为服务端。

编写客户端方法

  1. 首先在客户端也就是调用端创建客户端类Util.RPC.Client,代码如下:
    • %DispatchClassMethod - 动态派发方法是实现无感知的关键。
    • SERVERIP - 目标服务端的IP地址。
    • PORT - 目标服务端的端口号。
Class Util.RPC.Client Extends %RegisteredObject
{Parameter SERVERIP = "127.0.0.1";Parameter PORT = 7788;ClassMethod %DispatchClassMethod(class As %String, method As %String, args...) [ ServerOnly = 1 ]
{#; 客户端通信、客户端需要设置服务器IP与端口号#dim clientSocket As %IO.Socket = ##class(%IO.Socket).%New()s host = ..#SERVERIPs port = ..#PORTs clientSocket.TranslationTable = "UTF8"d clientSocket.Open(host, port, .sc)s obj = {}	//注释1s obj.class = classs obj.method = methods params = []s i = ""for {s i = $o(args(i))q:(i = "")d params.%Push(args(i))}s obj.params = paramsd clientSocket.WriteLine(obj.%ToJSON())	//注释2while (1) {s data = clientSocket.ReadLine() if (data '= "" ){	//注释3ret data}}q $$$OK
}}
  1. 创建空类M.LoginM.PayM.Stock分别继承Util.RPC.Client
    • 目的是模拟交互接口,因为要调用其他服务器方法,首先要确定要调用的服务器接口名称。

在这里插入图片描述

  1. 按照常规调用方法的模式,来编写方法。

    • 这里实际上是没有LoginPayStock方法的,因为上一步创建的类为空类。

    • 如果按照常规直接调用方法肯定会提示方法不存在的错误,这里实际上我们调用的是服务端的方法。

    • 可以观察到,这里是按照正常调用类方法的方式编写的代码,并没有其他额外的操作。

Class M.RPC Extends %RegisteredObject
{/// d ##class(M.RPC).Biz()
ClassMethod Biz()
{w ##class(M.Login).Login("yx","123456"),!w ##class(M.Pay).Pay(100),!w ##class(M.Stock).Stock(3),!
}}

编写服务端方法

  1. 创建服务端监听Util.RPC.Server类,这里模拟的是gRPC 创建Server对象,创建Listen,监听TCP端口。代码如下:
    • 参数PORT为服务端监听和开启的接口。
Class Util.RPC.Server Extends %RegisteredObject
{Parameter PORT = 7788;/// d ##class(Util.RPC.Server).ServerRPC()
ClassMethod ServerRPC()
{#; 服务端通信、服务端需要打开端口,等待客户端通信#dim severSocket As %IO.ServerSocket = ##class(%IO.ServerSocket).%New()s port = ..#PORTs severSocket.TranslationTable="UTF8"s severSocket.ConnectionQueueSize = 2d severSocket.Open(port, 10, .sc)q:($$$ISERR(sc)) "Open:" _ $System.Status.GetOneErrorText(sc)d severSocket.Listen(10, .sc)q:($$$ISERR(sc)) "Listen:" _ $System.Status.GetOneErrorText(sc)while (1) {s data =  severSocket.ReadLine()if (data '= "") {s obj = {}.%FromJSON(data)	//注释1s arg = obj.params.%Size()for i = 1 : 1 : arg{s arg(i) = obj.params.%Get(i - 1)}s ret = $classmethod(obj.class, obj.method, arg...)	//注释2d severSocket.WriteLine(ret)	//注释3}}q $$$OK
}}
  1. 编写服务端M.LoginLogin方法,M.PayPay方法,M.StockStock方法。

    • 这里使用IRIS当服务端,实现的方法都在服务端,客户端是没有该方法的。

    • 客户端调用的方法实际上是服务端的上的方法。

在这里插入图片描述

综合演示

  1. IRIS服务端开启监听方法。

  2. 客户端Caché调用无感知业务逻辑业务员Biz()方法。

    • 可观察到客户端直接调用到了服务端的方法,并且编码方式跟正常编写代码并无差别。

    • 客户端不需要了解底层的细节,client只需要直接调用定义好的方法。

在这里插入图片描述

通过这种方式我们就实现了类似gRPC的功能,像正常编写代码一样调用服务端的程序。

创造价值,分享学习,一起成长,相伴前行,欢迎大家提出意见,共同交流。

http://www.dt0577.cn/news/27924.html

相关文章:

  • 网站 简单广州四楚seo顾问
  • 海淀网站设计信息流优化师怎么入行
  • php网站开发linux班级优化大师下载安装最新版
  • 基于mysql的网站用什么做b2b网站大全免费推广
  • 推荐大良网站建设重庆网站建设技术外包
  • 企业网站建设 建立作用网站权重等级
  • 做asp网站教程找培训机构的网站
  • 建设银行网站修改密码全球最受欢迎的网站排名
  • 优秀网站设计要素关键词的选取原则有
  • 泰安受欢迎的网站建设电商怎么做如何从零开始
  • 博客网站做啥好软文时光发稿平台
  • 做网站推广见客户的话术宁德市安全教育平台
  • 网站建设海外推广 香港口碑营销的作用
  • 找人做网站需要什么百度seo优化技巧
  • wordpress怎么删除预建网站seo
  • 网站描述wordpress成都自然排名优化
  • intitle:律师网站建设的重要性关键词批量调词 软件
  • php和asp.net建立电商网站比较58和百度哪个推广效果好
  • 大气简约企业网站模板公司怎么推广网络营销
  • 代做通一样的网站元搜索引擎有哪些
  • 网站建设公司石家庄网络营销工程师前景
  • 收费底的网站有吗如何在百度提交自己的网站
  • 东莞网站的优化武汉网站快速排名提升
  • 政府机关网站建设的依据西安seo排名收费
  • 合肥知名建站公司优化大师win7官方免费下载
  • 南华大学城市建设学院网站网上营销培训课程
  • 网站 流量攻击软文发布推广平台
  • 网站的动效怎么做的百度账号个人中心
  • 域名指向另一个网站网站文章优化技巧
  • 网站建设公司经营湖南企业seo优化首选