发表日期: 2021-04-10 11:13:44 浏览次数:92
唐山网站优化【唐山开通400电话】唐山网站搭建、唐山微信公众号推文外包、唐山开通京东拼多多设计、唐山淘宝装修
唐山,简称“唐”,河北省地级市,构建开放型经济新体制综合试点地区 [1] 。位于河北省东部、华北平原东北部,南临渤海,北依燕山,毗邻京津,地处华北与东北通道的咽喉要地,总面积为13472平方千米,是中国(唐山)跨境电子商务综合试验区 [2] 、中国(河北)自由贸易试验区组成部分。 [3-4]
唐山因唐太宗李世民东征高句丽驻跸而得名,素有“北方瓷都”之称。这里诞生了中国第一座机械化采煤矿井、第一条标准轨距铁路、第一台蒸汽机车、第一桶机制水泥。唐山是中国评剧的发源地,素有“冀东三支花”之称的皮影、评剧、乐亭大鼓,为国家级非物质文化遗产。
2019年,唐山市下辖7个市辖区、3个县级市、4个县 [5] ,常住人口796.4万人,地区生产总值6890.0亿元,其中,第一产业增加值531.2亿元,第二产业增加值3613.3亿元,第三产业增加值2745.5亿元,三次产业增加值结构为7.7:52.4:39.9。按常住人口计算,全年人均地区生产总值86667元(按年平均汇率折合12563美元)。
服务定义是在 ProductInfo.proto 文件中声明的,服务器端和客户端都会使用该文件来生成代码。这里假设 ProductInfo
服务使用 Go 语言来实现,消费者使用 Java 语言来实现,两者之间的通信则通过 HTTP/2 来进行。
接下来深入了解 gRPC 通信的细节。构建 gRPC 服务的第一步是创建服务接口定义,其中包括该服务暴露的方法及其输入参数和返回类型。下面介绍服务定义的细节。
gRPC 使用 protocol buffers 作为 IDL 来定义服务接口。protocol buffers 是语言中立、平台无关、实现结构化数据序列化的可扩展机制 5。服务接口定义在 proto 文件中指定,也就是在扩展名为“.proto”的普通文本文件中。我们要按照普通的 protocol buffers 格式来定义 gRPC 服务,并将 RPC 方法参数和返回类型指定为 protocol buffers 消息。因为服务定义是 protocol buffers 规范的扩展,所以可以借助特殊的 gRPC 插件来根据 proto 文件生成代码。
5第 4 章会详细介绍 protocol buffers 的基本原理,现在可将其看作一种数据序列化机制。
在示例场景中,ProductInfo
服务接口可以使用代码清单 1-1 中的 protocol buffers 来定义,其中涉及远程方法调用、相关输入参数和输出参数以及这些参数的类型定义(或消息格式),这些也是 ProductInfo
服务定义的组成部分。
代码清单 1-1 使用 protocol buffers 来定义
ProductInfo
服务(gRPC)
// ProductInfo.protosyntax = "proto3"; ➊package ecommerce; ➋service ProductInfo { ➌ rpc addProduct(Product) returns (ProductID); ➍ rpc getProduct(ProductID) returns (Product); ➎}message Product { ➏ string id = 1; ➐ string name = 2; string description = 3;}message ProductID { ➑ string value = 1;}复制代码
❶ 服务定义首先声明所使用的 protocol buffers 版本(proto3)。
❷ 用来防止协议消息类型之间发生命名冲突的包名,该包名也会用来生成代码。
❸ 定义 gRPC 服务的接口。
❹ 添加商品的远程方法,该方法会返回商品 ID 作为响应。
❺ 基于商品 ID 获取商品的远程方法。
❻ 定义 Product
的消息格式或类型。
❼ 保存商品 ID 的字段(名–值对),具有唯一的字段编号,该编号用来在二进制格式消息中识别字段。 ❽ 用于商品标识号的用户定义类型。
服务就是可被远程调用的一组方法,比如 addProduct
方法和 getProduct
方法。每个方法都有输入参数和返回类型,既可以被定义为服务的一部分,也可以导入 protocol buffers 定义中。
输入参数和返回参数既可以是用户定义类型,比如 Product
类型和 ProductID
类型,也可以是服务定义中已经定义好的 protocol buffers 已知类型。这些类型会被构造成消息,每条消息都是包含一系列名–值对信息的小型逻辑记录,这些名–值对叫作字段。这些字段都是具有唯一编号的名–值对(如 string id = 1
),在二进制形式消息中,可以用编号来识别相应字段。
该服务定义会被用来构建 gRPC 应用程序的服务器端和客户端。1.1.2 节将介绍 gRPC 服务器端的实现细节。
一旦服务定义准备就绪,就可以使用 protocol buffers 编译器 protoc 来生成服务器端和客户端的代码了。借助 gRPC 的 protocol buffers 插件,可以生成 gRPC 服务器端代码、客户端代码以及常规的 protocol buffers 代码,从而填充、序列化和检索消息类型。
在服务器端,需要实现该服务定义,并运行 gRPC 服务器来处理客户端的调用。因此,为了让服务器端的 ProductInfo
服务完成其任务,需要先做以下两件事情。
通过重载服务基类,实现所生成的服务器端骨架的逻辑。
运行 gRPC 服务器,监听来自客户端的请求并返回服务响应。
要实现服务逻辑,首先要根据服务定义生成服务器端骨架。例如,在代码清单 1-2 中,可以看到使用 Go 语言为 ProductInfo
服务所生成的远程函数。在这些远程函数体中,我们可以实现每个函数的逻辑。
代码清单 1-2 使用 Go 语言为
ProductInfo
服务实现 gRPC 服务器端逻辑
import ( ... "context" pb "github.com/grpc-up-and-running/samples/ch02/productinfo/go/proto" "google.golang.org/grpc" ...)// 使用Go语言的ProductInfo实现// 添加商品的远程方法func (s *server) AddProduct(ctx context.Context, in *pb.Product) ( *pb.ProductID, error) { // 业务逻辑}// 获取商品的远程方法func (s *server) GetProduct(ctx context.Context, in *pb.ProductID) ( *pb.Product, error) { // 业务逻辑}复制代码
当服务实现准备就绪之后,接下来需要运行 gRPC 服务器,从而监听来自客户端的请求,将这些请求分发到服务实现,并将服务的响应返回到客户端。代码清单 1-3 展示了 ProductInfo
服务用例,其中使用 Go 语言来编写 gRPC 服务器实现。另外,这里打开了一个 TCP 端口并启动了 gRPC 服务器,同时在该服务器上注册了 ProductInfo
服务。
代码清单 1-3 使用 Go 语言为
ProductInfo
服务运行 gRPC 服务器
func main() { lis, _ := net.Listen("tcp", port) s := grpc.NewServer() pb.RegisterProductInfoServer(s, &server{}) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) }}复制代码
这就是服务器端要做的所有事情了。接下来看一下 gRPC 的客户端实现。
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: https://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878