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

什么是网站建设公司shopify建站最全教程

什么是网站建设公司,shopify建站最全教程,wordpress 更新用户名,贵州微信网站建设最近在学习gRPC相关的知识,为啥要学呢?因为一直在用,古人云,“工欲善其事,必先利其器”。为此,花了不少时间阅读gRPC-Go的源码,收货甚多,比如透过服务发现和负载均衡这俩组件来学习复…

        最近在学习gRPC相关的知识,为啥要学呢?因为一直在用,古人云,“工欲善其事,必先利其器”。为此,花了不少时间阅读gRPC-Go的源码,收货甚多,比如透过服务发现和负载均衡这俩组件来学习复杂模块之间低耦合高内聚的设计方法,透过bdp采样与http2流量窗口自动伸缩学习网络性能优化等等。

        RPC是Remote Procedure Call的缩写,中文直译为远程过程调用,与之相对的则是本地过程调用,即本地的函数调用。我们日常在同一个服务下相互调用的函数即为本地的函数调用。与本地函数调用相比,RPC的接口提供方与请求方往往不在同一台机器上或者不在同一个进程,因此双方需要通过网络传输来通信。而网络的不可靠又带来了一定的复杂性。

        如果让我们自己来设计RPC,需要怎么做呢?先来看一个简单请求的整个过程。假设Client通过网络将请求发送到Server端,Server接收并处理完成之后,通过网络再将响应发送回来,Client接收响应则整个流程结束。在此过程中,需要完成哪些操作呢?

        首先,网络传输的是比特流,对于结构化的请求和响应数据,需要一个模块来完成序列化和反序列化的功能。

        其次,需要建立一个可靠的传输链接来通信,比如说TCP连接,为了提升性能,我们还需要对链路进行管理,如建立连接池、链接复用等等,因此还需要构建一个传输层组件。

        在微服务的背景下,应用程序往往由很多功能不同的服务组成,比如说一个购物程序,可能包括搜索、推荐、订单管理服务等等。在这种情况下,Client如何知道每个服务的具体地址呢?总不能直接写死对应服务端口吧?为此,我们需要一个新的组件来提供服务发现功能,告知我们服务的地址。现在假定我们知道了服务端地址,还有一个问题。为了服务海量用户,一般的服务都会分布式部署多个节点,为了避免单一节点负载过高,我们还需要一个组件来提供负载均衡功能,策略可以是轮询、也可以是随机、也可以是一致性哈希等等。

        通过上述讨论我们知道,一个完善的RPC框架需要包含多个组件,分别负责不同的功能。如果全部自己开发,耗时费力不说且性能如何也无定论。可喜的是gRPC提供了上述所有功能。它由Google开发,目前已开源。它默认使用protobuf序列化数据,基于http2传输。另外通过插件式的设计支持多种不同的服务发现机制和负载均衡机制。

        下文的分析基于gRPC-Go 1.54.0-dev 版本grpc-go/examples/helloworld/greeter_client/main.go

        先来看下helloworld目录下的helloworld.proto协议定义:

package helloworld;// The greeting service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {string name = 1;
}
// The response message containing the greetings
message HelloReply {string message = 1;
}

该文件定义了Greeter服务,对外提供一个方法SayHello,请求和响应中都只包含了一个字符串。

下面贴出Client的关键代码:

var (addr = flag.String("addr", "localhost:50051", "the address to connect to")name = flag.String("name", defaultName, "Name to greet")
)func main() {// 解析参数flag.Parse()// 创建链接conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf("did not connect: %v", err)}// 退出前关闭链接defer conn.Close()// 创建客户端c := pb.NewGreeterClient(conn)ctx, cancel := context.WithTimeout(context.Background(), time.Hour)defer cancel()// 发送请求_, err := c.SayHello(ctx, &pb.HelloRequest{Name: strconv.Itoa(i)})if err != nil {log.Fatalf("could not greet: %v", err)}
}

        代码很简单,就是创建链接、构造Client、发送请求。这几行代码究竟做了啥呢,下面给出的流程图详细的画出了整个过程:

图1 Client请求调用流程

 

        图中红色的部分表示主流程,即上述的那几行代码。橙色部分表示负载均衡组件处理流程,绿色表示服务发现组件处理流程。默认情况下,gRPC的服务发现插件使用的是passthrough,这个插件基本上啥都没做,传进来的地址是啥结果就是啥,默认的负载均衡插件是pickfirst,即使用第一个可用的地址。除此之外,gRPC还提供了其它的负载均衡插件,如round_robin、weighted_target_experimental等等,具体选择哪一个可以在Dial的时候通过参数传递进去。

        主程序启动后,先后初始化负载均衡、服务发现组件。服务发现解析地址后则将地址传递给负载均衡组件,负载均衡组件则通知具体的负载均衡插件来建立连接,此外负载均衡组件还负责连接的维护与管理工作。

        底层链接即基于TCP的http2连接,限于篇幅,这里仅简单描述了下http2Client的功能,详情可以参考之前一篇描述传输层的博客。链接建立OK后,Client就可以通过负载均衡插件选择一个建立好的传输层开始收发信息。流程图看着很复杂,主要模块就3个:服务发现、负载均衡、网络传输层。具体的代码就不贴了,流程图中已经给出了关键节点的函数。不过还是建议下载源码深入学习下。

参考资料:

1. 深入理解grpc(二):grpc原理-CSDN博客

2.grpc/doc at master · grpc/grpc · GitHub

http://www.yayakq.cn/news/345501/

相关文章:

  • 深圳网站建设黄浦网络 骗钱wordpress 注册邮件设置密码
  • 中国建设网官方网站硅灰百度竞价关键词价格查询工具
  • 南宁网站建设哪家公司实力怎么根据视频链接找到网址
  • 青岛建立网站电话如何建wap网站
  • 在国内的服务器上建设国外网站公司网站修改方案
  • 苏州建网站制作费用多少钱秦皇岛房管局备案查询网
  • 山东川畅科技做网站多少钱成都龙泉工程建设有限公司网站
  • 创业网站模板免费下载酒店小程序定制开发
  • 网站正在建设中页面动漫网站html
  • 宝山手机网站制作公司上海企业服务
  • 无锡便宜做网站淘宝上做网站行吗
  • 百度收录最快网站网页设计制作网站总结
  • 做服务器的网站都有哪些如何做装修网站
  • 公司建个网站要多少钱网站建设中的功能模块描述
  • 企业网站建设备案都需要什么小程序代理模板
  • 怎么样做淘宝优惠券网站网站开发开始阶段的主要任务包括( )。
  • 移动网站建设制作seo服务外包报价
  • wordpress资讯站模板潍坊企业做网站
  • 建站行业前景公司域名邮箱怎么注册
  • 深圳制作网站专业怎么搭建视频网站
  • 常州中环互联网网站建设网站地图 格式
  • 购物网站排名榜农产品的网站建设方案书范文
  • 专业网站设计立找亿企邦wordpress标签使用
  • 怎样做网站上更改文字龙华网站建设哪家公司好
  • 申请免费网站公司宣威网站建设公司
  • 公司网站建设要求书wordpress用户中心
  • 律师微网站建设ie6 网站模板
  • 北京网络公司建站广州推广网站
  • 小白自己做网站网业怎么保存到桌面
  • 如何开发公司的网站自己制作简易网页