• RPC与微服务


     1、RPC的概念

            RPC,是远程过程调用的缩写,通俗的说就是调用远处的一个函数。与之相对应的本地函数调用。

            golang 已经内置了RPC服务

      2、RPC微服务化的好处

    1. 不限定服务的提供方使用什么技术选型,能够实现公司跨团队的技术解耦。

    2. 每个服务都被封装成进程,彼此独立

    3. 使用微服务可以跨进程通信

     RPC: 远程进程通信-------应用层协议(http协议同层),底层使用TCP实现。

            在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持,Go RPC可以利用tcp或http来传递数据,可以对要传递的数据使用多种类型的编解码方式。golang官方的net库使用encoding.gob进行编解码,支持TCP/HTTP数据传输方式,由于其他语言不支持gob的编解码方式,所以使用net/rpc库实现的RPC方法没办法进行跨语言调用。

            golang官方还提供了net/rpc/jsonrpc库实现RPC方法,json RPC采用JSON进行数据编解码,因而支持跨语言调用。

            除了golang官方提供的rpc库,还有许多第三方库在golang中实现RPC提供支持,大部分第三方rpc库的实现都是使用protobuf进行数据编解码,根据protobuf声明文件自动生成rpc方法定义与服务注册代码,在golang中可以很方便的进行rpc服务调用。

            服务端代码:

    1. package main
    2. import (
    3. "fmt"
    4. "net"
    5. "net/rpc"
    6. )
    7. type Hello struct{
    8. }
    9. /*
    10. 1. 方法只能有两个可序列化的参数,其中第二个参数是指针类型
    11. req 表示获取客户端传过来的数据
    12. res 表示给客户端返回的数据
    13. 2. 方法返回一个error,同时必须是公开的方法
    14. req和res的类型不能是:channel(通道)、complex(复数类型)、func(函数)
    15. */
    16. func (this Hello) SayHello(req string, res *string) {
    17. *res = "你好" + req
    18. return nil
    19. }
    20. func main(){
    21. //1,注册RPC服务
    22. err := rpc.RegisterName("hello", new(Hello))
    23. if err != nil {
    24. fmt.Println(err)
    25. }
    26. //2.监听端口
    27. listener,err1 := net.Listen("tcp", "127.0.0.1:8080")
    28. if err1 != nil {
    29. fmt.Println(err1)
    30. }
    31. //3.应用退出的时候关闭监听端口
    32. defer listener.Close()
    33. for {
    34. //4.建立连接
    35. conn, err2 := listener.Accept()
    36. if err2 != nil{
    37. fmt.Println(err2)
    38. }
    39. //5.绑定服务
    40. rpc.ServeConn(conn)
    41. }
    42. }

            客户端代码:

    1. package main
    2. import (
    3. "fmt"
    4. "net/rpc"
    5. )
    6. func main() {
    7. //1. 用rpc.Dial和rpc微服务建立连接
    8. conn, err := rpc.Dial("tcp","127.0.0.1:8080")
    9. if err != nil {
    10. fmt.Println(err1)
    11. }
    12. //2.函数退出时候要关闭连接
    13. defer conn.Close()
    14. //2.调用远程函数
    15. var reply string
    16. err = conn.Call("hello.Helloworld","张三",&reply)
    17. if err != nil {
    18. fmt.Println("Call:",err)
    19. return
    20. }
    21. fmt.Println(reply)
    22. }

    首选是通过rpc.Dial拨号RPC服务,然后通过client.Call调用具体的RPC方法。在调用client.Call时,第一个参数使用点好连接的PRC服务名字和方法名字,第二个和第三个参数分别我们定义RPC方法的两个参数。

  • 相关阅读:
    雷克萨斯品牌舆情监测-危机后,如何重新赢得消费者的认可?
    新的例子程序
    什么是SSRF攻击?该如何防御SSRF攻击?
    如何应对数字时代的网络安全新挑战?
    网络编程的学习初篇
    Spring入门
    RPC和HTTP的理解
    搭建Nacos集群
    GIS小技术分享(一):python中json数据转geojson或者shp
    LuatOS-SOC接口文档(air780E)-- i2s - 数字音频
  • 原文地址:https://blog.csdn.net/Xiao_qsn/article/details/127939790