精华内容
下载资源
问答
  • gRPC框架使用上节课已经学习了gRPC基本知识,对gRPC有了初步的认识。...gRPC框架默认使用protocol buffers作为接口定义语言,用于描述网络传输消息结构。除此之外,还可以使用protobuf定义服务接口。sy...

    gRPC框架使用

    上节课已经学习了gRPC基本知识,对gRPC有了初步的认识。本节课通过编程实现gRPC编程。

    定义服务

    我们想要实现的是通过gRPC框架进行远程服务调用,首先第一步应该是要有服务。利用之前所掌握的内容,gRPC框架支持对服务的定义和生成。gRPC框架默认使用protocol buffers作为接口定义语言,用于描述网络传输消息结构。除此之外,还可以使用protobuf定义服务接口。

    syntax = "proto3";
    package message;
    ​
    //订单请求参数
    message OrderRequest {
        string orderId = 1;
        int64 timeStamp = 2;
    }
    ​
    //订单信息
    message OrderInfo {
        string OrderId = 1;
        string OrderName = 2;
        string OrderStatus = 3;
    }
    ​
    //订单服务service定义
    service OrderService{
        rpc GetOrderInfo(OrderRequest) returns (OrderInfo);
    }

    我们通过proto文件定义了数据结构的同时,还定义了要实现的服务接口,GetOrderInfo即是具体服务接口的定义,在GetOrderInfo接口定义中,OrderRequest表示是请求传递的参数,OrderInfo表示处理结果返回数据参数。

    编译.proto文件

    环境准备

    定义的proto文件需要通过编译,生成go语言代码文件,供客户端程序和服务端程序使用。可以安装go语言环境中的关于proto的插件。

    go get -a github.com/golang/protobuf/protoc-gen-go

    -a 参数标示下载好后直接做 go install

    编译.proto文件

    基本用法

    可以通过基本编译命令完成对.proto文件的编译.基础编译命令如下:

    protoc --go_out=. *.proto

    gRPC编译支持

    如果定义的.proto文件,如本案例中所示,定义中包含了服务接口的定义,而我们想要使用gRPC框架实现RPC调用。开发者可以采用protocol-gen-go库提供的插件编译功能,生成兼容gRPC框架的golang语言代码。只需要在基本编译命令的基础上,指定插件的参数,告知protoc编译器即可。具体的编译生成兼容gRPC框架的服务代码的命令如下:

    protoc --go_out=plugins=grpc:. *.proto

    gRPC实现RPC编程

    服务接口实现

    在.proto定义好服务接口并生成对应的go语言文件后,需要对服务接口做具体的实现。定义服务接口具体由OrderServiceImpl进行实现,并实现GetOrderInfo详细内容,服务实现逻辑与前文所述内容相同。不同点是服务接口参数的变化。详细代码实现如下:

    type OrderServiceImpl struct {
    }
    ​
    //具体的方法实现
    func (os *OrderServiceImpl) GetOrderInfo(ctx context.Context, request *message.OrderRequest) (*message.OrderInfo, error) {
        orderMap := map[string]message.OrderInfo{
            "201907300001": message.OrderInfo{OrderId: "201907300001", OrderName: "衣服", OrderStatus: "已付款"},
            "201907310001": message.OrderInfo{OrderId: "201907310001", OrderName: "零食", OrderStatus: "已付款"},
            "201907310002": message.OrderInfo{OrderId: "201907310002", OrderName: "食品", OrderStatus: "未付款"},
        }
    ​
        var response *message.OrderInfo
        current := time.Now().Unix()
        if (request.TimeStamp > current) {
            *response = message.OrderInfo{OrderId: "0", OrderName: "", OrderStatus: "订单信息异常"}
        } else {
            result := orderMap[request.OrderId]
            if result.OrderId != "" {
                fmt.Println(result)
                return &result, nil
            } else {
                return nil, errors.New("server error")
            }
        }
        return response, nil
    }

    gRPC实现服务端

    使用gRPC框架,首先实现服务端的程序。既然使用gRPC框架来实现,就需要调用gRPC进行服务方法的注册以及监听的处理。服务注册和监听处理实现如下:

    func main() {
    ​
        server := grpc.NewServer()
    ​
        message.RegisterOrderServiceServer(server, new(OrderServiceImpl))
    ​
        lis, err := net.Listen("tcp", ":8090")
        if err != nil {
            panic(err.Error())
        }
        server.Serve(lis)
    }

    gRPC实现客户端

    实现完服务端以后,实现客户端程序。和服务端程序关系对应,调用gRPC框架的方法获取相应的客户端程序,并实现服务的调用,具体编程实现如下:

    func main() {
    ​
        //1、Dail连接
        conn, err := grpc.Dial("localhost:8090", grpc.WithInsecure())
        if err != nil {
            panic(err.Error())
        }
        defer conn.Close()
    ​
        orderServiceClient := message.NewOrderServiceClient(conn)
    ​
        orderRequest := &message.OrderRequest{OrderId: "201907300001", TimeStamp: time.Now().Unix()}
        orderInfo, err := orderServiceClient.GetOrderInfo(context.Background(), orderRequest)
        if orderInfo != nil {
            fmt.Println(orderInfo.GetOrderId())
            fmt.Println(orderInfo.GetOrderName())
            fmt.Println(orderInfo.GetOrderStatus())
        }
    }

    运行程序

    经过上述步骤后,程序及逻辑全部开发完成。程序运行,打印如下结果:

    201907300001
    衣服
    已付款
    展开全文
  • 点击上方蓝色“polarisxu”关注我,设个星标,不会让你失望用过或了解过 Micro 这个框架的人,可能有所耳闻,大家对其...前些天,有人问我有无其他 Go 微服务框架推荐,说 Micro 3.0.0 开始不能用了!!我听了一惊:...

    点击上方蓝色“polarisxu”关注我,设个星标,不会让你失望

    用过或了解过 Micro 这个框架的人,可能有所耳闻,大家对其抱怨比较多,典型的抱怨是升级后不兼容。比如网上有教程是基于 1.x,但新版本是 2.x,完全不一样了,而且似乎官方文档也没有及时更新,使用了它的人“痛苦不堪”。

    前些天,有人问我有无其他 Go 微服务框架推荐,说 Micro 3.0.0 开始不能用了!!

    我听了一惊:我只听说它不稳定,总是变来变去,兼容性不好,但没听说不能用。后来了解了下,原来 3.0 做了巨大的改变。主要有:

    • Micro 3.0 推荐叫做 M3O,微服务框架成为了云原生开发平台
    • 废弃了 Go-Micro
    • 开源 License 由 Apache 2.0 改为 Polyform Shield[1]

    说明一点,Micro 是一个公司:Micro Services, Inc。

    01 Micro 3.0 叫做 M3O,一个云原生开发平台

    在 11 月 05 日,官方宣布 Micro 3.0.0 发布。这不再是一个微服务框架,而是一个云原生平台。有什么不一样呢?

    官方在 3.0 版本对主要工具进行了重大重构,并将其整合到可以从开发人员的角度解决构建、运行、管理和使用这整个工作流的问题。

    为什么做这样的改变

    Micro 最初是作为微服务开发的工具包,它结合了 api 网关,Web dashboard 和 cli 与使用 Go RPC 框架构建的服务进行交互。因为考虑到那时让所有人重新购买 PaaS 感觉就像是一场失败的战斗。因此,官方选择围绕 RPC 框架编写单一用途的工具,以为它可以使人们逐步采用它,直到他们看到对平台的需求为止。

    虽然有一个简单的 Go 框架以及一些用于查询和与之交互的周围组件,但是就像任何长期存在的项目一样,随着试图解决瑞士军刀无法做到的那种平台体验,其复杂性也在增加,开发了许多独立的库。这对于用户而言,增加了认知上的负担。

    在 2019 年,官方对所有这些库进行了合并,这提供了极大的帮助,但始终仍然存在一个悬而未决的问题。micro 和 go-micro 有什么区别?一般我们将 go-micro 视为框架,将 micro 视为工具箱,但这样的划分似乎没有意义。

    过去 5 年,随着容器和容器编排成为焦点,“云原生”工具激增,世界爆炸了。更具体地说,Docker 和 Kubernetes 重新定义了技术领域,并更加有意识地转向在云中构建软件。

    Micro 甚至可以追溯到 2015 年,都具有前瞻性的观点。很明显,分布式系统和云原生将在未来几年内成为后端服务开发的主导模型,但是不清楚要花多长时间花折腾各种工具,例如 docker,kubernetes,grpc,istio 等。这感觉就像重新构建技术栈。Micro 希望解决整个工作流上的事情,而只是在微服务开发上。

    M3O 官方认为 PaaS 3.0 不仅是在运行容器甚至是源代码,而且还囊括了整个开发人员的经验,包括用于编写云代码的模型。因此它们打造了 Micro 3.0,或叫 M3O,这是用于云原生开发的平台。

    更多信息可以看 Micro 3.0.0 的发布公告[2]

    02 废弃 Go-Micro

    这个点上面已经做了一定说明。

    官方终止对 go-micro 的支持。这个项目自 2014 年创建至今,已经拥有 14.7k+ Star。作者认为尽管它为许多人解决了一些问题,但它并没有完成它的初衷。

    现在这个项目并没有直接放弃,而是转交到个人名下(Micro 公司的 CEO Asim),为了避免混淆,项目名也改了,叫 Nitro[3]。现在它是一个快速的分布式应用程序开发框架。

    虽然 go-micro 2.0 依然可以使用,但已经不维护。更多相信信息可以查看 Nitro 项目的 FAQ。

    03 Licence 改为 Polyform Shield

    Polyform Shield 这个 Licence 我是第一次见 ,相信很多人也是。官方的说法是:

    Micro 继续保持开源状态,但使用 Polyform Shield 进行了许可,这可以防止该软件被提取并作为服务运行。这是为了与 AWS 和其他运行开放源代码以谋取利益而不回馈的人抗衡。

    这个 Licence 是为了防止 AWS 这样的云服务部署 Micro 服务,和 Micro 公司进行直接竞争,其他情况下可以免费使用。因此不存在开头网友说的不让用的情况。

    值得一提的是,Nitro 项目的 Licence 也改为了 Polyform Shield。

    04 总结

    Micro 3.0 的出现,可能是顺应时代的产物。但从另一个角度,包括 Licence 的变更,一个靠开源项目活下去的公司不容易。M3O 是一个云原生(m3o.com)托管平台,有兴趣可以了解它的收费模式,这是开源项目公司进行商业化的一种方式。

    就像 Micro 的创始人 Asim 在 Nitro 项目的 FAQ 中说的:

    Go Micro 的维护,需要花费很多的时间精力,它属于 Micro Services,Inc. 公司,该公司现在专注于 Micro as a Service,并将此处的所有接口合并到该项目的服务库中。在大多数情况下,Go Micro 都没有资金支持,虽然得到过好评。因此,在坚持了 6 年后,在 3.0 版中,这个项目属于我个人(Asim),我做出了艰难的决定,要重新许可为非商业项目。对于任何商业应用程序,我正在寻找  github sponsorship[4],以便我可以将这些资金用于维护和支持工作。

    所以,如果你曾经喜欢 Micro 这个项目,建议你可以继续喜欢。当然也希望这次之后,版本能够更稳定。而我看了这些后,作为一个开源爱好者,我准备花时间研究研究 Micro,顺便写写笔记,希望为它的推广做一点贡献。

    参考资料

    [1]

    Polyform Shield: https://polyformproject.org/licenses/shield/1.0.0/

    [2]

    Micro 3.0.0 的发布公告: https://micro.mu/blog/2020/11/05/micro-v3-aka-m3o.html

    [3]

    Nitro: https://github.com/asim/nitro

    [4]

    github sponsorship: https://github.com/sponsors/asim


    往期推荐

    • I Have a Dream:写在 Go1.15.4 发布之计

    觉得不错,欢迎关注:

    005e58ab57b5f2801be02a1a323e2923.png

    点个赞、在看和转发是最大的支持

    展开全文
  • 在前面的课程《Go语言微服务理论与实践课程》课程中,我们已经学习了微服务的理论知识,了解了微服务实践中需要解决哪些问题。从本篇技术文档开始,我们进入新的微服务内容的学习。在本系列课程中,我们会着重讲框架...

    RPC简介及原理介绍

    @author:Davie

    版权所有:北京千锋互联科技有限公司

    背景

    在前面的课程《Go语言微服务理论与实践课程》课程中,我们已经学习了微服务的理论知识,了解了微服务实践中需要解决哪些问题。从本篇技术文档开始,我们进入新的微服务内容的学习。在本系列课程中,我们会着重讲框架的内容,主要包括两个:gRPC框架、go-micro框架。

    首先来学习gRPC框架相关的内容。

    本地过程调用

    让我们先来看看正常情况下程序的执行和调用情况。例如有如下go语言代码:

    func main() {
        var a, b int
        a = 1
        b = 2
        c := Add(a, b)
        fmt.Println("计算结果:", c)
    }
    func Add(a int, b int) int {
        return a + b
    }

    在上述的Go语言代码中,我们定义了一个Add方法用于实现两个数相加的功能,在main方法中通过调用Add方法实现了计算两个变量之和的操作。整个过程涉及到变量值入栈,出栈,赋值等操作,最后将出栈的计算结果返回并赋值给c变量。

    总结说来,本地程序调用的过程大致可以分为几个步骤和阶段:

    • 开发者开发好的程序,并进行编译,编译成机器认可的可执行文件。
    • 运行可执行文件,调用对应的功能方法,期间会读取可执行文件中国的机器指令,进行入栈,出栈赋值等操作。此时,计算机由可执行程序所在的进程控制。
    • 调用结束,所有的内存数据出栈,程序执行结束。计算机继续由操作系统进行控制。

    问题及解决方法

    上文我们已经说过,远程过程调用是在两台或者多台不同的物理机器上实现的调用,其间要跨越网络进行调用。因此,我们再想通过前文本地方法调用的形式完成功能调用,就无法实现了,因为编译器无法通过编译的可执行文件来调用远程机器上的程序方法。因此需要采用RPC的方式来实现远端服务器上的程序方法的调用。

    RPC技术内部原理是通过两种技术的组合来实现的:本地方法调用 和 网络通信技术。

    RPC简介

    在上述本地过程调用的例子中,我们是在一台计算机上执行了计算机上的程序,完成调用。随着计算机技术的发展和需求场景的变化,有时就需要从一台计算机上执行另外一台计算机上的程序的需求,因此后来又发展出来了RPC技术。特别是目前随着互联网技术的快速迭代和发展,用户和需求几乎都是以指数式的方式在高速增长,这个时候绝大多数情况下程序都是部署在多台机器上,就需要在调用其他物理机器上的程序的情况。

    RPC是Remote Procedure Call Protocol三个单词首字母的缩写,简称为:RPC,翻译成中文叫远程过程调用协议。所谓远程过程调用,通俗的理解就是可以在本地程序中调用运行在另外一台服务器上的程序的功能方法。这种调用的过程跨越了物理服务器的限制,是在网络中完成的,在调用远端服务器上程序的过程中,本地程序等待返回调用结果,直到远端程序执行完毕,将结果进行返回到本地,最终完成一次完整的调用。

    需要强调的是:远程过程调用指的是调用远端服务器上的程序的方法整个过程。

    RPC设计组成

    RPC技术在架构设计上有四部分组成,分别是:客户端、客户端存根、服务端、服务端存根。

    这里提到了客户端服务端的概念,其属于程序设计架构的一种方式,在现代的计算机软件程序架构设计上,大方向上分为两种方向,分别是:B/S架构C/S架构。B/S架构指的是浏览器到服务器交互的架构方式,另外一种是在计算机上安装一个单独的应用,称之为客户端,与服务器交互的模式。

    由于在服务的调用过程中,有一方是发起调用方,另一方是提供服务方。因此,我们把服务发起方称之为客户端,把服务提供方称之为服务端。以下是对RPC的四种角色的解释和说明:

    • 客户端(Client):服务调用发起方,也称为服务消费者。
    • 客户端存根(Client Stub):该程序运行在客户端所在的计算机机器上,主要用来存储要调用的服务器的地址,另外,该程序还负责将客户端请求远端服务器程序的数据信息打包成数据包,通过网络发送给服务端Stub程序;其次,还要接收服务端Stub程序发送的调用结果数据包,并解析返回给客户端。
    • 服务端(Server):远端的计算机机器上运行的程序,其中有客户端要调用的方法。
    • 服务端存根(Server Stub):接收客户Stub程序通过网络发送的请求消息数据包,并调用服务端中真正的程序功能方法,完成功能调用;其次,将服务端执行调用的结果进行数据处理打包发送给客户端Stub程序。

    RPC原理及调用步骤

    了解完了RPC技术的组成结构我们来看一下具体是如何实现客户端到服务端的调用的。实际上,如果我们想要在网络中的任意两台计算机上实现远程调用过程,要解决很多问题,比如:

    • 两台物理机器在网络中要建立稳定可靠的通信连接。
    • 两台服务器的通信协议的定义问题,即两台服务器上的程序如何识别对方的请求和返回结果。也就是说两台计算机必须都能够识别对方发来的信息,并且能够识别出其中的请求含义和返回含义,然后才能进行处理。这其实就是通信协议所要完成的工作。

    让我们来看看RPC具体是如何解决这些问题的,RPC具体的调用步骤图如下:

     

     

    在上述图中,通过1-10的步骤图解的形式,说明了RPC每一步的调用过程。具体描述为:

    • 1、客户端想要发起一个远程过程调用,首先通过调用本地客户端Stub程序的方式调用想要使用的功能方法名;
    • 2、客户端Stub程序接收到了客户端的功能调用请求,将客户端请求调用的方法名,携带的参数等信息做序列化操作,并打包成数据包。
    • 3、客户端Stub查找到远程服务器程序的IP地址,调用Socket通信协议,通过网络发送给服务端。
    • 4、服务端Stub程序接收到客户端发送的数据包信息,并通过约定好的协议将数据进行反序列化,得到请求的方法名和请求参数等信息。
    • 5、服务端Stub程序准备相关数据,调用本地Server对应的功能方法进行,并传入相应的参数,进行业务处理。
    • 6、服务端程序根据已有业务逻辑执行调用过程,待业务执行结束,将执行结果返回给服务端Stub程序。
    • 7、服务端Stub程序将程序调用结果按照约定的协议进行序列化,并通过网络发送回客户端Stub程序。
    • 8、客户端Stub程序接收到服务端Stub发送的返回数据,对数据进行反序列化操作,并将调用返回的数据传递给客户端请求发起者。
    • 9、客户端请求发起者得到调用结果,整个RPC调用过程结束。

    RPC涉及到的相关技术

    通过上文一系列的文字描述和讲解,我们已经了解了RPC的由来和RPC整个调用过程。我们可以看到RPC是一系列操作的集合,其中涉及到很多对数据的操作,以及网络通信。因此,我们对RPC中涉及到的技术做一个总结和分析:

    • 1、动态代理技术: 上文中我们提到的Client Stub和Sever Stub程序,在具体的编码和开发实践过程中,都是使用动态代理技术自动生成的一段程序。
    • 2、序列化和反序列化: 在RPC调用的过程中,我们可以看到数据需要在一台机器上传输到另外一台机器上。在互联网上,所有的数据都是以字节的形式进行传输的。而我们在编程的过程中,往往都是使用数据对象,因此想要在网络上将数据对象和相关变量进行传输,就需要对数据对象做序列化和反序列化的操作。
      • 序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。
      • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。

     

    我们常见的Json,XML等相关框架都可以对数据做序列化和反序列化编解码操作。同时,在之前的《Go语言微服务理论与实践》课程中,我们已经学习过Protobuf协议,这也是一种数据编解码的协议,在RPC框架中使用的更广泛。

    展开全文
  • 在前面的课程《Go语言微服务理论与实践课程》课程中,我们已经学习了微服务的理论知识,了解了微服务实践中需要解决哪些问题。从本篇技术文档开始,我们进入新的微服务内容的学习。在本系列课程中,我们会着重讲框架...

    RPC简介及原理介绍

    @author:Davie

    版权所有:北京千锋互联科技有限公司

    背景

    在前面的课程《Go语言微服务理论与实践课程》课程中,我们已经学习了微服务的理论知识,了解了微服务实践中需要解决哪些问题。从本篇技术文档开始,我们进入新的微服务内容的学习。在本系列课程中,我们会着重讲框架的内容,主要包括两个:gRPC框架、go-micro框架。

    首先来学习gRPC框架相关的内容。

    本地过程调用

    让我们先来看看正常情况下程序的执行和调用情况。例如有如下go语言代码:

    func main() {
        var a, b int
        a = 1
        b = 2
        c := Add(a, b)
        fmt.Println("计算结果:", c)
    }
    func Add(a int, b int) int {
        return a + b
    }

    在上述的Go语言代码中,我们定义了一个Add方法用于实现两个数相加的功能,在main方法中通过调用Add方法实现了计算两个变量之和的操作。整个过程涉及到变量值入栈,出栈,赋值等操作,最后将出栈的计算结果返回并赋值给c变量。

    总结说来,本地程序调用的过程大致可以分为几个步骤和阶段:

    • 开发者开发好的程序,并进行编译,编译成机器认可的可执行文件。
    • 运行可执行文件,调用对应的功能方法,期间会读取可执行文件中国的机器指令,进行入栈,出栈赋值等操作。此时,计算机由可执行程序所在的进程控制。
    • 调用结束,所有的内存数据出栈,程序执行结束。计算机继续由操作系统进行控制。

    问题及解决方法

    上文我们已经说过,远程过程调用是在两台或者多台不同的物理机器上实现的调用,其间要跨越网络进行调用。因此,我们再想通过前文本地方法调用的形式完成功能调用,就无法实现了,因为编译器无法通过编译的可执行文件来调用远程机器上的程序方法。因此需要采用RPC的方式来实现远端服务器上的程序方法的调用。

    RPC技术内部原理是通过两种技术的组合来实现的:本地方法调用 和 网络通信技术。

    RPC简介

    在上述本地过程调用的例子中,我们是在一台计算机上执行了计算机上的程序,完成调用。随着计算机技术的发展和需求场景的变化,有时就需要从一台计算机上执行另外一台计算机上的程序的需求,因此后来又发展出来了RPC技术。特别是目前随着互联网技术的快速迭代和发展,用户和需求几乎都是以指数式的方式在高速增长,这个时候绝大多数情况下程序都是部署在多台机器上,就需要在调用其他物理机器上的程序的情况。

    RPC是Remote Procedure Call Protocol三个单词首字母的缩写,简称为:RPC,翻译成中文叫远程过程调用协议。所谓远程过程调用,通俗的理解就是可以在本地程序中调用运行在另外一台服务器上的程序的功能方法。这种调用的过程跨越了物理服务器的限制,是在网络中完成的,在调用远端服务器上程序的过程中,本地程序等待返回调用结果,直到远端程序执行完毕,将结果进行返回到本地,最终完成一次完整的调用。

    需要强调的是:远程过程调用指的是调用远端服务器上的程序的方法整个过程。

    RPC设计组成

    RPC技术在架构设计上有四部分组成,分别是:客户端、客户端存根、服务端、服务端存根。

    这里提到了客户端服务端的概念,其属于程序设计架构的一种方式,在现代的计算机软件程序架构设计上,大方向上分为两种方向,分别是:B/S架构C/S架构。B/S架构指的是浏览器到服务器交互的架构方式,另外一种是在计算机上安装一个单独的应用,称之为客户端,与服务器交互的模式。

    由于在服务的调用过程中,有一方是发起调用方,另一方是提供服务方。因此,我们把服务发起方称之为客户端,把服务提供方称之为服务端。以下是对RPC的四种角色的解释和说明:

    • 客户端(Client):服务调用发起方,也称为服务消费者。
    • 客户端存根(Client Stub):该程序运行在客户端所在的计算机机器上,主要用来存储要调用的服务器的地址,另外,该程序还负责将客户端请求远端服务器程序的数据信息打包成数据包,通过网络发送给服务端Stub程序;其次,还要接收服务端Stub程序发送的调用结果数据包,并解析返回给客户端。
    • 服务端(Server):远端的计算机机器上运行的程序,其中有客户端要调用的方法。
    • 服务端存根(Server Stub):接收客户Stub程序通过网络发送的请求消息数据包,并调用服务端中真正的程序功能方法,完成功能调用;其次,将服务端执行调用的结果进行数据处理打包发送给客户端Stub程序。

    RPC原理及调用步骤

    了解完了RPC技术的组成结构我们来看一下具体是如何实现客户端到服务端的调用的。实际上,如果我们想要在网络中的任意两台计算机上实现远程调用过程,要解决很多问题,比如:

    • 两台物理机器在网络中要建立稳定可靠的通信连接。
    • 两台服务器的通信协议的定义问题,即两台服务器上的程序如何识别对方的请求和返回结果。也就是说两台计算机必须都能够识别对方发来的信息,并且能够识别出其中的请求含义和返回含义,然后才能进行处理。这其实就是通信协议所要完成的工作。

    让我们来看看RPC具体是如何解决这些问题的,RPC具体的调用步骤图如下:

     

     

    在上述图中,通过1-10的步骤图解的形式,说明了RPC每一步的调用过程。具体描述为:

    • 1、客户端想要发起一个远程过程调用,首先通过调用本地客户端Stub程序的方式调用想要使用的功能方法名;
    • 2、客户端Stub程序接收到了客户端的功能调用请求,将客户端请求调用的方法名,携带的参数等信息做序列化操作,并打包成数据包。
    • 3、客户端Stub查找到远程服务器程序的IP地址,调用Socket通信协议,通过网络发送给服务端。
    • 4、服务端Stub程序接收到客户端发送的数据包信息,并通过约定好的协议将数据进行反序列化,得到请求的方法名和请求参数等信息。
    • 5、服务端Stub程序准备相关数据,调用本地Server对应的功能方法进行,并传入相应的参数,进行业务处理。
    • 6、服务端程序根据已有业务逻辑执行调用过程,待业务执行结束,将执行结果返回给服务端Stub程序。
    • 7、服务端Stub程序将程序调用结果按照约定的协议进行序列化,并通过网络发送回客户端Stub程序。
    • 8、客户端Stub程序接收到服务端Stub发送的返回数据,对数据进行反序列化操作,并将调用返回的数据传递给客户端请求发起者。
    • 9、客户端请求发起者得到调用结果,整个RPC调用过程结束。

    RPC涉及到的相关技术

    通过上文一系列的文字描述和讲解,我们已经了解了RPC的由来和RPC整个调用过程。我们可以看到RPC是一系列操作的集合,其中涉及到很多对数据的操作,以及网络通信。因此,我们对RPC中涉及到的技术做一个总结和分析:

    • 1、动态代理技术: 上文中我们提到的Client Stub和Sever Stub程序,在具体的编码和开发实践过程中,都是使用动态代理技术自动生成的一段程序。
    • 2、序列化和反序列化: 在RPC调用的过程中,我们可以看到数据需要在一台机器上传输到另外一台机器上。在互联网上,所有的数据都是以字节的形式进行传输的。而我们在编程的过程中,往往都是使用数据对象,因此想要在网络上将数据对象和相关变量进行传输,就需要对数据对象做序列化和反序列化的操作。
      • 序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。
      • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。

     

    我们常见的Json,XML等相关框架都可以对数据做序列化和反序列化编解码操作。同时,在之前的《Go语言微服务理论与实践》课程中,我们已经学习过Protobuf协议,这也是一种数据编解码的协议,在RPC框架中使用的更广泛。

    展开全文
  • Go语言实现RPC编程 @author:Davie版权所有:北京千锋互联科技有限公司 上节课我们对RPC知识做了介绍,讲解了RPC的原理,通过图示方式讲解了RPC的内部执行过程。本节课,我们继续来学习RPC相关的内容。 RPC官方库...
  • gRPC框架使用 @author:Davie版权所有:北京千锋互联科技有限公司...gRPC框架默认使用protocol buffers作为接口定义语言,用于描述网络传输消息结构。除此之外,还可以使用protobuf定义服务接口。 syntax = "proto3
  • 在gRPC框架中,诸如上节课我们学习的在客户端与服务端之间通过消息结构体定义的方式来传递数据,我们称之为“单项RPC”,也称之为简单模式。除此之外,gRPC中还有数据流模式的RPC调用实现,这正是我们本节课要学习的...
  • RPC与Protobuf结合使用 @author:Davie版权所有:北京千锋互联科技有限公司 ...本节课继续来看一下RPC和之前所学的Protobuf在编程中的结合实现。 需求:假设在一个系统中,有订单模块(Order),...在《Go语言微服务
  • Go语言实现RPC编程@author:Davie 版权所有:北京千锋互联科技有限公司上节课我们对RPC知识做了介绍,讲解了RPC的原理,通过图示方式讲解了RPC的内部执行过程。本节课,我们继续来学习RPC相关的内容。RPC官方库在Go...
  • gRPC是由Google公司开源的一款高性能的远程过程调用(RPC)框架,可以在任何环境下运行。该框架提供了负载均衡,跟踪,智能监控,身份验证等功能,可以实现系统间的高效连接。另外,在分布式系统中,gRPC框架也有有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 418
精华内容 167
关键字:

go语言微服务框架