关于grpc:gRPCGateWay-Swagger-实战

上一次咱们分享了对于 gRPC-Gateway 疾速实战 ,能够查看地址来进行回顾 : 也能够查看对于 gRPC 的历史文章: gRPC介绍<!----> gRPC 客户端调用服务端须要连接池吗?<!----> gRPC的拦截器<!----> gRPC的认证<!----> 分享一下 gRPC- HTTP网关 I明天次要是分享对于 gRPC-Gateway Swagger 的实战局部,文章大体分为如下几个局部: 根本环境补充<!----> gRPC-GateWay Swagger 实战根本环境补充首先,咱们来看一下环境搭建结束和实现实战之后的目录构造 通过目录构造咱们能够看到: my_grpcgateway 目录下多了 pkg 目录这个目录是通过工具生成的,次要是解决 swagger 的 go 文件 my_grpcgateway/protoc/order/order.swagger.json工具生成的 swagger.json 文件,外面记录了对于 swagger 的接口 和 配置相干信息 my_grpcgateway/protoc/order/protoc-gen-swaggerprotoc-gen-swagger 工具目录 my_grpcgateway/third_partyswagger 的资源目录 那么咱们就动起手来,一个一个的将上述的内容填充起来吧: 装置 Protoc Plugingo get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger执行结束之后,咱们能够在咱们的 GOPATH 目录下找到 protoc-gen-swagger 目录 此时,咱们将 protoc-gen-swagger 目录拷贝到咱们的 my_grpcgateway/order/protoc 下 cd my_grpcgateway/order/protoc cp /root/go/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@v1.16.0/protoc-gen-swagger ./ -rf下载 swagger-ui 的动态资源进入地址 :https://github.com/swagger-api/swagger-ui 将我的项目代码 download 下来 ...

September 1, 2023 · 2 min · jiezi

关于grpc:gRPCGateway-快速实战

明天来分享一波 gRPC-Gateway , 之前咱们有分享过什么是 gRPC 及其应用形式,能够看看这些对于 gRPC 的历史文章: gRPC介绍<!----> gRPC 客户端调用服务端须要连接池吗?<!----> gRPC的拦截器<!----> gRPC的认证<!----> 分享一下 gRPC- HTTP网关 I明天次要是分享对于 gRPC-Gateway 的实战局部,文章大体分为如下几个局部: gRPC-GateWay 简略原理介绍<!----> 根本环境创立<!----> gRPC-GateWay 实战gRPC-GateWay 简略原理介绍如下是官网的一张基本原理图 gRPC-Gateway 是一个协定插件,它读取一个 gRPC 服务定义,并生成一个反向代理服务,它将一个 RESTful JSON API 转换为 gRPC ,这个服务器是依据gRPC定义中的自定义选项生成的。 简略来说,咱们的 gRPC-Gateway 能做到的事件就是: 可能提供 RESTful JSON API 接口,并且申请通过 http 接口打进来,gRPC-Gateway 可能将其申请转给 grpc 服务,最终 grpc 服务进行解决并响应 接下来,咱们就来看看 gRPC-Gateway 是如何同时提供 http 接口和 grpc 服务的 根本环境创立应用 gRPC-Gateway ,咱们须要搭建根本的环境,正如之前咱们实战 grpc 的时候,须要搭建一个根本的 grpc 环境,总的来说须要做如下事项: 开始创立本人的我的项目目录mkdir my_grpcgatewaycd my_grpcgatewaymdkir protoc/ordercd protoc/order下载 gRPC-Gateway 的依赖$ go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway$ go get google.golang.org/protobuf/cmd/protoc-gen-go$ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc查看工具,执行完第二步之后,咱们能够看到咱们将 gRPC-Gateway 的依赖库和工具都下载下来了,咱们能够看到在咱们的 GOPATH 目录下有如下工具 ...

August 31, 2023 · 2 min · jiezi

关于grpc:工作中你会使用到-grpcurl-吗

在平时的开发过程中,咱们个别是 http 接口对外, grpc 接口对外部微服务 置信对于如何去申请 http 接口,大家都很相熟了 如果是 inux 外面应用 curl 命令<!----> 在 windows 外面咱们能够应用 postman 来申请接口<!----> 如果对于一个云上开发的接口的话,咱们可能会应用 apifox 来进行申请那么对于 grpc 服务端提供的接口,咱们个别会如何去申请这些接口来自测呢 Windows 外面咱们能够应用 bloomRPC 工具<!----> Linux 外面咱们能够应用 grpcurl 工具DEMO对于 grpc 的基本知识,感兴趣的能够查看历史文章: gRPC介绍<!----> gRPC 客户端调用服务端须要连接池吗?<!----> gRPC的拦截器<!----> gRPC的认证<!----> 分享一下 gRPC- HTTP网关 I那么咱们写一个 demo,一个 grpc 的服务端,提供如下接口 查问租户的详情<!----> 查问租户的列表Demo 目录构造如下: 咱们的 proto 文件能够是这样的: protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative tenant.proto根本简略的代码实现如下: rpc_services.go 代码如下 这个时候启动咱们的服务端,如何运行 golang 程序就不赘述了 bloomRPC 工具开始来下载 bloomRPC 工具 ...

August 29, 2023 · 1 min · jiezi

关于grpc:gRPC的理解与使用

协定介绍gRPC 是谷歌开源的一套 RPC 协定框架,底层应用HTTP/2协定,次要有两局部,数据编码以及申请映射 数据编码是将内存对象编码为可传输的字节流,也包含把字节流转化为内存对象,常见的蕴含json, msgpack, xml, protobuf,其中该编码效率比json高一些,grpc抉择应用protobuf gRPC为什么基于HTTP2HTTP1.1遇到的问题 协定繁琐,蕴含很多的细节设计,也预留了很多将来扩大选项,所以没有软件实现了协定中提及的全副细节协定规定是一发一收这种模式,相当于一个先进先出的串行队列,HTTP Pipelining 把多个 HTTP 申请放到一个 TCP 连贯中来发送,发送过程中不须要服务器对前一个申请的响应,然而在客户端,还是会依照发送的程序来接管响应申请,导致 HTTP 头阻塞(Head-of-line blocking)HTTP2的个性与组成 HEAD 头数据压缩: 对 HTTP 头字段进行数据压缩,因为 HTTP 头蕴含了大量冗余数据,HTTP2对这些数据进行了压缩,压缩后对于申请大小的影响显著,能够将多个申请压缩到一个包中,减小传输负载多路复用: 每个 HTTP 申请/应答在各自的流(stream,每个流都是互相独立,有一个整数ID 标识,是存在于TCP连贯中的一个虚构连贯通道,能够承载双向音讯)中实现数据交换,如果一个申请/应答阻塞或者速度很慢,也不会影响其它流中的申请/应答解决,在一个 TCP 连贯中就能够传输多个流数据而无需建设多个连贯流量管制和优先级机制: 能够无效利用流的多路复用机制,流量管制能够确保只有接收者应用的数据会被传输,优先级机制能够确保重要的资源被优先传输服务端推送: 即服务端能够推送应答给客户端消息报文二进制编码最小传输单元帧(frame):HTTP2 定义了很多类型的帧,每个帧服务于不同的目标,数据帧中有 1 个要害数据,这个帧属于哪个资源,音讯由一个或多个帧形成json全称JavaScript Object Notation,一种轻量级的数据交换格局,具备良好的可读和便于疾速编写的个性。可在不同平台之间进行数据交换,在json呈现以前,罕用的是xml(Extensiable Markup Language)进行文件传输 xml和json的独特长处 可读性好,构造清晰分层存储(档次嵌套)都可作为Ajaxs传输数据都跨平台,可作为数据传输格局json的长处 数据格式简略,易读易写,且数据都是压缩的,文件较小,便于传输json解析难度较低,而xml须要循环遍历DOM进行解析,效率较低服务端和客户端能够间接应用json,便于保护,而不同客户端解析xml可能应用不同办法json 已成为以后服务器与 web 利用之间数据传输的公认规范xml的应用领域 xml格局较为谨严,可读性更强,更易于拓展,能够良好的做配置文件呈现较早,在各个领域有宽泛的利用,具备广泛的流行性json语法规定json语法是JavaScript语法的子集,而json个别也是用来传输对象和数组。也就是json语法是JavaScript语法的一部分(满足特定语法的JavaScript语法) 数据保留在名称、值对中,数据由逗号分隔花括号示意对象中括号示意数组json名称/值json 数据的书写格局为:"名称":"值"。对应JavaScript的概念就是:名称="值"但json的格局和JavaScript对象格局还是有所区别: JavaScript对象的名称能够不加引号,也能够单引号,也能够双引号,但json字符串的名称只能加双引号的字符示意。JavaScript对象的键值能够是除json值之外还能够是函数等其余类型数据,而json字符串的值对只能是数字、字符串(要双引号)、逻辑值、对象(加大括号)、数组(中括号)、null。json对象json有两种示意构造—对象和数组,通过这两种示意构造能够示意更简单的构造。比照java的话json数组和json对象就好比java的列表/数组(Object类型)和对象(Map)一样的关系。并且很多状况其对象值可能互相嵌套多层,对对象中存在对象,对象中存在数组,数组中存在对象 JavaScript对象 / json对象 / json字符串//JavaScript对象, 除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象var a1={ name:"pky" , sex:"man", value: 12345 };var a2={'name':'pky' , 'sex':'man', 'value': 12345};//满足json格局的JavaScript对象, json对象var a3={"name":"pky" , "sex":"man", "value": 12345};//json字符串var a4='{"name":"pky" , "sex":"man", "value": 12345}';json次要毛病是非字符串的编码效率比拟低,下面的数据比方value字段的值,在内存中是12345,占用2字节,json编码转变为json字符串之后占用5字节 ...

August 24, 2023 · 3 min · jiezi

关于grpc:gRPC-客户端调用服务端需要连接池吗

发现的问题在微服务开发中,gRPC 的利用相对少不了,个别状况下,外部微服务交互,通常是应用 RPC 进行通信,如果是内部通信的话,会提供 https 接口文档 对于 gRPC 的根本应用能够查看文章 gRPC介绍 对于 gRPC ,咱们须要根本晓得如下的一些知识点: gRPC 的根本四种模式的利用场景 申请响应模式客户端数据流模式服务端数据流模式双向流模式<!----> Proto 文件的定义和应用<!----> gRPC 拦截器的利用 , 根本的能够查看这篇 gRPC 拦截器 实际上有客户端拦截器 和 服务端拦截器,具体具体的能够自行学习<!----> gRPC 的设计原理细节<!----> Go-Kit 的应用当然明天并不是要聊 gRPC 的利用或者原理,而是想聊咱们在开发过程中很容易遇到的问题: 未复用 gRPC 客户端连贯,影响性能最近审查各个服务代码中,发现整个部门应用 gRPC 客户端申请服务端接口的时候,都是会新建一个连贯,而后调用服务端接口,应用结束之后就 close 掉, 例如这样 这会有什么问题呢? 失常简略的应用不会有啥问题,但如果是面临高并发的状况,性能问题很容易就会呈现,例如咱们在做性能测试的时候,就会发现,打一会性能测试,客户端申请服务端的时候就会报错: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp xxx:xxx: connect: connection refused ...

August 21, 2023 · 5 min · jiezi

关于grpc:K8sgRPC云原生微服务开发与治理实战完结未成曲调先有情

download:K8s+gRPC云原生微服务开发与治理实战完结从源码学习gRPC设计的概述gRPC是一款高性能、开源的RPC框架,由Google公司开发并保护。它基于Protocol Buffers协定进行通信,反对多种编程语言和平台间的通信。在gRPC中,客户端能够像调用本地办法一样调用近程服务,并且主动生成客户端和服务器端的代码,简化了开发者的工作。 在本文中,咱们将从源码层面来学习gRPC的设计,深刻探索其实现原理,包含gRPC的外围组件、音讯传输、序列化和反序列化等方面。 gRPC的外围组件gRPC的外围组件次要包含Channel、Server、Call、Service、Message和Interceptor。其中,Channel用于建设连贯,Server监听并解决申请,Call解决申请和响应,Service提供服务定义,Message示意发送和接管的音讯,Interceptor提供拦截器链。 ChannelChannel是gRPC客户端和服务端之间通信的通道,负责连贯治理、压缩解决、流量管制等。当客户端和服务端建设连贯后,会创立一个对应的Channel对象来治理该连贯,Channel对象外部保护着多个Subchannel对象来实现负载平衡和故障转移。 ServerServer是gRPC服务端的外围组件,负责监听网络申请和解决网络申请。当服务端启动时,会创立一个对应的Server对象来管理网络申请,Server对象外部保护着多个Subserver对象来解决网络申请和响应。 CallCall是gRPC客户端和服务端之间进行申请和响应的外围组件,负责序列化和反序列化、压缩和解压缩、流量管制等。当客户端调用近程办法时,会创立一个对应的Call对象来发送申请和接管响应,Call对象外部保护着多个Stream对象来实现音讯流的传输。 ServiceService是gRPC服务定义的外围组件,负责定义服务的接口和办法。在gRPC中,服务端须要实现服务定义中的办法,客户端则能够通过主动生成的代码来调用服务定义中的办法。 MessageMessage是gRPC中音讯传输的外围组件,负责序列化和反序列化数据。在gRPC中,客户端和服务端之间替换的数据必须是通过序列化解决后的二进制数据,Message对象封装了这些二进制数据及其元信息。 InterceptorInterceptor是gRPC提供的拦截器链,用于在申请和响应之间插入拦截器。拦截器能够在申请和响应前后进行一些解决,比方日志记录、鉴权、限流等。 gRPC的音讯传输gRPC的音讯传输分为两种形式:一种是基于HTTP/2协定的一般模式,另一种是基于TCP协定的流模式。在一般模式下,客户端和服务端之间通过HTTP/2进行通信,能够实现多路复用和头部压缩等优化。而在流模式下,客户端和服务端之间通过TCP进行通信,能够实现更高效的数据传输。 在gRPC的实现中,音讯传输采纳了流式解决的形式,行将申请和响应分成多个音讯进行解决。这样能够防止大量数据的阻塞和提早,进步了通信效率和吞吐量。 gRPC的序列化和反序列化在gRPC中,序列化和反序列化是十分重要的组件,它们负责将音讯转换为二进制格局,并在接管方将其还原为音讯格局。gRPC采纳Protocol Buffers作为序列化和反序列化的规范,比起JSON、XML等格局,Protocol Buffers具备更小的体积和更快的解析速度。 在gRPC的实现中,序列化和反序列化由protobuf库实现。当发送方调用办法时,序列化器将参数对象转换为二进制格局,并将其封装为Message对象;当接管方收到音讯后,反序列化器将其转换为音讯格局,并将其封装为Message对象。 总结通过对gRPC的源码学习,咱们深刻理解了其设计和实现原理。gRPC的外围组件包含Channel、Server、Call、Service、Message和Interceptor,它们别离负责连贯治理、网络申请解决、音讯传输、服务定义、序列化和反序列化、拦截器链等性能。同时,gRPC采纳基于HTTP/2协定的一般模式和基于TCP协定的流模式进行音讯传输,并采纳Protocol Buffers作为序列化和反序列化的规范,具备更高的效率和性能。

May 25, 2023 · 1 min · jiezi

关于grpc:gRPC请求超时和异常处理

1. 申请超时在 HTTP 申请中,咱们发送申请的时候,能够设置一个申请超时工夫-connectTimeout,即在指定的工夫内,如果申请没有达到服务端,为了防止客户端始终进行不必要的期待,就会抛出一个申请超时异样。 然而在微服务零碎中,咱们却很少设置申请超时工夫,个别都是用另外一个概念代替,那就是申请截止工夫。 这是什么起因呢?明天咱们就来简略聊一聊这个话题。 在微服务中咱们客户端的申请在服务端往往会有比较复杂的链条,我想起来 Spring Cloud Sleuth 官网给的一个申请链路追踪的图,咱们间接拿来看下: 这张图中,申请从客户端发动之后,在服务端一共经验了四个 SERVICE,对于这样的申请,如果咱们还是依照之前发送一般 HTTP 申请的形式,设置一个 connectTimeout 显然是不够的。 我举个例子: 假如咱们发送一个申请,为该申请设置 connectTimeout 为 5s,那么这个工夫只对第一个服务 SERVICE1 无效,也就是申请在 5s 之内没有达到 SERVICE1,那么就会抛出连贯超时异样;申请如果在 5s 之内达到 SERVICE1,那么就不会抛出异样,然而!!!,申请达到 SERVICE1 并不意味着申请完结,前面从 SERVICE1 到 SERVICE2,从 SERVICE2 到 SERVICE3,从 SERVICE3 到 SERVICE4,还有四个 HTTP 申请待处理,这些申请超时了怎么办?很显著,connectTimeout 属性对于前面几个申请就遥相呼应了。 所以,对于这种场景,咱们个别应用截止工夫来解决。 截止工夫相当于设置整个申请生命周期的工夫,也就是这个申请,我要多久拿到后果。很显著,这个工夫应该在客户端发动申请的时候设置。 gRPC 中提供了对应的办法,咱们能够十分不便的设置申请的截止工夫 DeadLineTime,如下: public class LoginClient { public static void main(String[] args) throws InterruptedException { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051) .usePlaintext() .build(); LoginServiceGrpc.LoginServiceStub stub = LoginServiceGrpc.newStub(channel).withDeadline(Deadline.after(3, TimeUnit.SECONDS)); login(stub); } private static void login(LoginServiceGrpc.LoginServiceStub stub) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(1); stub.login(LoginBody.newBuilder().setUsername("javaboy").setPassword("123").build(), new StreamObserver<LoginResponse>() { @Override public void onNext(LoginResponse loginResponse) { System.out.println("loginResponse.getToken() = " + loginResponse.getToken()); } @Override public void onError(Throwable throwable) { System.out.println("throwable = " + throwable); } @Override public void onCompleted() { countDownLatch.countDown(); } }); countDownLatch.await(); }}服务端通过 Thread.sleep 做个简略的休眠就行了,超时之后,客户端的 onError 办法会被触发,抛出如下异样: ...

March 9, 2023 · 2 min · jiezi

关于grpc:手把手教大家在-gRPC-中使用-JWT-完成身份校验

@[toc]上篇文章松哥和小伙伴们聊了在 gRPC 中如何应用拦截器,这些拦截器有服务端拦截器也有客户端拦截器,这些拦截器的一个重要应用场景,就是能够进行身份的校验。当客户端发动申请的时候,服务端通过拦截器进行身份校验,就晓得这个申请是谁发动的了。明天松哥就来通过一个具体的案例,来和小伙伴们演示一下 gRPC 如何联合 JWT 进行身份校验。 1. JWT 介绍1.1 无状态登录1.1.1 什么是有状态有状态服务,即服务端须要记录每次会话的客户端信息,从而辨认客户端身份,依据用户身份进行申请的解决,典型的设计如 Tomcat 中的 Session。例如登录:用户登录后,咱们把用户的信息保留在服务端 session 中,并且给用户一个 cookie 值,记录对应的 session,而后下次申请,用户携带 cookie 值来(这一步有浏览器主动实现),咱们就能辨认到对应 session,从而找到用户的信息。这种形式目前来看最不便,然而也有一些缺点,如下: 服务端保留大量数据,减少服务端压力服务端保留用户状态,不反对集群化部署1.1.2 什么是无状态微服务集群中的每个服务,对外提供的都应用 RESTful 格调的接口。而 RESTful 格调的一个最重要的标准就是:服务的无状态性,即: 服务端不保留任何客户端请求者信息客户端的每次申请必须具备自描述信息,通过这些信息辨认客户端身份那么这种无状态性有哪些益处呢? 客户端申请不依赖服务端的信息,屡次申请不须要必须拜访到同一台服务器服务端的集群和状态对客户端通明服务端能够任意的迁徙和伸缩(能够不便的进行集群化部署)减小服务端存储压力1.2 如何实现无状态无状态登录的流程: 首先客户端发送账户名/明码到服务端进行认证认证通过后,服务端将用户信息加密并且编码成一个 token,返回给客户端当前客户端每次发送申请,都须要携带认证的 token服务端对客户端发送来的 token 进行解密,判断是否无效,并且获取用户登录信息1.3 JWT1.3.1 简介JWT,全称是 Json Web Token, 是一种 JSON 格调的轻量级的受权和身份认证标准,可实现无状态、分布式的 Web 利用受权: JWT 作为一种标准,并没有和某一种语言绑定在一起,罕用的 Java 实现是 GitHub 上的开源我的项目 jjwt,地址如下:https://github.com/jwtk/jjwt 1.3.2 JWT数据格式JWT 蕴含三局部数据: Header:头部,通常头部有两局部信息: 申明类型,这里是JWT加密算法,自定义咱们会对头部进行 Base64Url 编码(可解码),失去第一局部数据。 Payload:载荷,就是无效数据,在官网文档中(RFC7519),这里给了7个示例信息: iss (issuer):示意签发人exp (expiration time):示意token过期工夫sub (subject):主题aud (audience):受众nbf (Not Before):失效工夫iat (Issued At):签发工夫jti (JWT ID):编号这部分也会采纳 Base64Url 编码,失去第二局部数据。 ...

February 22, 2023 · 5 min · jiezi

关于grpc:聊一聊-gRPC-中的拦截器

明天咱们持续 gRPC 系列。 后面松哥跟大家聊了 gRPC 的简略案例,也说了四种不同的通信模式,感兴趣的小伙伴能够戳这里: 一个简略的案例入门 gRPC聊一聊 gRPC 的四种通信模式明天咱们来持续聊一聊 gRPC 中的拦截器。 有申请的发送、解决,当然就会有拦截器的需要,例如在服务端通过拦截器对立进行申请认证等操作,这些就须要拦截器来实现,明天松哥先和小伙伴们来聊一聊 gRPC 中拦截器的根本用法,前面我再整一篇文章和小伙伴们做一个基于拦截器实现的 JWT 认证的 gRPC。 gRPC 中的拦截器整体上来说能够分为两大类: 服务端拦截器客户端拦截器咱们别离来看。 1. 服务端拦截器服务端拦截器的作用有点像咱们 Java 中的 Filter,服务端拦截器又能够持续细分为一元拦截器和流拦截器。 一元拦截器对应咱们上篇文章中所讲的一元 RPC,也就是一次申请,一次响应这种状况。 流拦截器则对应咱们上篇文章中所讲的服务端流 RPC、客户端流 RPC 以及双向流 RPC。 不过,在 Java 代码中,无论是一元拦截器还是流拦截器,代码其实都是一样的。不过如果你是用 Go 实现的 gRPC,那么这块是不一样的。 所以接下来的内容我就不去辨别一元拦截器和流拦截器了,咱们间接来看一个服务端拦截器的例子。 这里我就不从头开始写了,咱们间接在上篇文章的根底之上持续增加拦截器即可。 服务端拦截器工作地位大抵如下: 从这张图中小伙伴们能够看到,咱们能够在服务端解决申请之前将申请拦挡下来,对立进行权限校验等操作,也能够在服务端将申请处理完毕之后,筹备响应的时候将响应拦挡下来,能够对响应进行二次解决。 首先咱们来看申请拦截器,实际上是一个监听器: public class BookServiceCallListener<R> extends ForwardingServerCallListener<R> { private final ServerCall.Listener<R> delegate; public BookServiceCallListener(ServerCall.Listener<R> delegate) { this.delegate = delegate; } @Override protected ServerCall.Listener<R> delegate() { return delegate; } @Override public void onMessage(R message) { System.out.println("这是客户端发来的音讯,能够在这里进行预处理:"+message); super.onMessage(message); }}这里咱们自定义一个类,继承自 ForwardingServerCallListener 类,在这里重写 onMessage 办法,当有申请达到的时候,就会通过这里的 onMessage 办法。如果咱们须要对传入的参数进行验证等操作,就能够在这里实现。 ...

February 15, 2023 · 2 min · jiezi

关于grpc:写给go开发者的gRPC教程错误处理

本篇为【写给go开发者的gRPC教程】系列第四篇 第一篇:protobuf根底 第二篇:通信模式 第三篇:拦截器 第四篇:错误处理 本系列将继续更新,欢送关注获取实时告诉 根本错误处理首先回顾下pb文件和生成进去的client与server端的接口 service OrderManagement { rpc getOrder(google.protobuf.StringValue) returns (Order);}type OrderManagementClient interface { GetOrder(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*Order, error)}type OrderManagementServer interface { GetOrder(context.Context, *wrapperspb.StringValue) (*Order, error) mustEmbedUnimplementedOrderManagementServer()}能够看到,尽管咱们没有在pb文件中的接口定义设置error返回值,但生成进去的go代码是蕴含error返回值的 这十分合乎Go语言的应用习惯:通常状况下咱们定义多个error变量,并且在函数内返回,调用方能够应用errors.Is()或者errors.As()对函数的error进行判断 var ( ParamsErr = errors.New("params err") BizErr = errors.New("biz err"))func Invoke(i bool) error { if i { return ParamsErr } else { return BizErr }}func main() { err := Invoke(true) if err != nil { switch { case errors.Is(err, ParamsErr): log.Println("params error") case errors.Is(err, BizErr): log.Println("biz error") } }} 但,在RPC场景下,咱们还能进行error的值判断么? ...

February 13, 2023 · 4 min · jiezi

关于grpc:聊一聊-gRPC-的四种通信模式

舒适提醒:本文须要联合上一篇 gRPC 文章一起食用,否则可能看不懂。后面一篇文章松哥和大家聊了 gRPC 的根本用法,明天咱们再来略微深刻一点点,来看下 gRPC 中四种不同的通信模式。 gRPC 中四种不同的通信模式别离是: 一元 RPC服务端流 RPC客户端流 RPC双向流 RPC接下来松哥就通过四个残缺的案例,来别离和向搭档们演示这四种不同的通信模式。 1. 筹备工作对于 gRPC 的基础知识咱们就不啰嗦了,咱们间接来看我明天的 proto 文件,如下: 这次我新建了一个名为 book.proto 的文件,这里次要定义了一些图书相干的办法,如下: syntax = "proto3";option java_multiple_files = true;option java_package = "org.javaboy.grpc.demo";option java_outer_classname = "BookServiceProto";import "google/protobuf/wrappers.proto";package book;service BookService { rpc addBook(Book) returns (google.protobuf.StringValue); rpc getBook(google.protobuf.StringValue) returns (Book); rpc searchBooks(google.protobuf.StringValue) returns (stream Book); rpc updateBooks(stream Book) returns (google.protobuf.StringValue); rpc processBooks(stream google.protobuf.StringValue) returns (stream BookSet);}message Book { string id = 1; repeated string tags = 2; string name = 3; float price = 4; string author = 5;}message BookSet { string id = 1; repeated Book bookList = 3;}这个文件中,有一些内容咱们在上篇文章中都讲过了,讲过的我就不再反复了,我说一些上篇文章没有波及到的货色: ...

February 9, 2023 · 5 min · jiezi

关于grpc:写给go开发者的gRPC教程通信模式

本篇为【写给go开发者的gRPC教程系列】第二篇 第一篇:protobuf根底第二篇:通信模式上一篇介绍了如何编写 protobuf 的 idl,并应用 idl 生成了 gRPC 的代码,当初来看看如何编写客户端和服务端的代码 Simple RPC (Unary RPC)syntax = "proto3";package ecommerce;import "google/protobuf/wrappers.proto";option go_package = "ecommerce/";message Order { string id = 1; repeated string items = 2; string description = 3; float price = 4; string destination = 5;}service OrderManagement { rpc getOrder(google.protobuf.StringValue) returns (Order);}定义如上的 idl,须要关注几个事项 应用protobuf最新版本syntax = "proto3";protoc-gen-go要求 pb 文件必须指定 go 包的门路。即option go_package = "ecommerce/";定义的method仅能有一个入参和出参数。如果须要传递多个参数须要定义成message应用import援用另外一个文件的 pb。google/protobuf/wrappers.proto是 google 内置的类型生成 go 和 grpc 的代码 $ protoc -I ./pb \ --go_out ./ecommerce --go_opt paths=source_relative \ --go-grpc_out ./ecommerce --go-grpc_opt paths=source_relative \ ./pb/product.protoecommerce├── product.pb.go└── product_grpc.pb.gopb└── product.protoserver 实现1、由 pb 文件生成的 gRPC 代码中蕴含了 service 的接口定义,它和咱们定义的 idl 是吻合的 ...

January 26, 2023 · 5 min · jiezi

关于grpc:写给go开发者的gRPC教程protobuf基础

gRPC是谷歌开源的一款高性能、反对多种开发语言的服务框架,对于一个rpc咱们关注如下几方面: 序列化协定。gRPC应用protobuf,首先应用protobuf定义服务,而后应用这个文件来生成客户端和服务端的代码。因为pb是跨语言的,因而即便服务端和客户端语言并不统一也是能够相互序列化和反序列化的 网络传输层。gRPC应用http2.0协定,http2.0相比于HTTP 1.x ,大幅度的晋升了 web 性能。 Protobuf IDL所谓序列化艰深来说就是把内存的一段数据转化成二进制并存储或者通过网络传输,而读取磁盘或另一端收到后能够在内存中重建这段数据 1、protobuf协定是跨语言跨平台的序列化协定。 2、protobuf自身并不是和gRPC绑定的。它也能够被用于非RPC场景,如存储等 json、 xml都是一种序列化的形式,只是他们不须要提前预约义idl,且具备可读性,当然他们传输的体积也因而较大,能够说是各有优劣 所以先来介绍下protobuf的idl怎么写。protobuf最新版本为proto3,在这里你能够看到具体的文档阐明:https://protobuf.dev/programm... 定义音讯类型protobuf里最根本的类型就是message,每一个messgae都会有一个或者多个字段(field),其中字段蕴含如下元素 类型:类型不仅能够是标量类型(int、string等),也能够是复合类型(enum等),也能够是其余message字段名:字段名比拟举荐的是应用下划线/分隔名称字段编号:一个messgae内每一个字段编号都必须惟一的,在编码后其实传递的是这个编号而不是字段名字段规定:音讯字段能够是以下字段之一 singular:格局正确的音讯能够有零个或一个字段(但不能超过一个)。应用 proto3 语法时,如果未为给定字段指定其余字段规定,则这是默认字段规定optional:与 singular 雷同,不过您能够查看该值是否明确设置repeated:在格局正确的音讯中,此字段类型能够反复零次或屡次。零碎会保留反复值的程序map:这是一个成对的键值对字段保留字段:为了防止再次应用到已移除的字段能够设定保留字段。如果任何将来用户尝试应用这些字段标识符,编译器就会报错标量值类标量类型会波及到不同语言和编码方式,后续有机会深刻讲 .proto TypeGo TypeNotesdoublefloat64 floatfloat32 int32int32应用可变长度的编码。对正数的编码效率低下 - 如果您的字段可能蕴含负值,请改用 sint32。int64int64应用可变长度的编码。对正数的编码效率低下 - 如果字段可能有负值,请改用 sint64。uint32uint32应用可变长度的编码。uint64uint64应用可变长度的编码。sint32int32应用可变长度的编码。有符号整数值。与惯例 int32 相比,这些函数能够更高效地对正数进行编码。sint64int64应用可变长度的编码。有符号整数值。与惯例 int64 相比,这些函数能够更高效地对正数进行编码。fixed32uint32始终为 4 个字节。如果值通常大于 2^28,则比 uint32 更高效。fixed64uint64始终为 8 个字节。如果值通常大于 2^56,则比 uint64 更高效。sfixed32int32始终为 4 个字节。sfixed64int64始终为 8 个字节。boolbool stringstring字符串必须始终蕴含 UTF-8 编码或 7 位 ASCII 文本,并且长度不得超过 232。bytes[]byte能够蕴含任意长度的 2^32 字节。复合类型数组message SearchResponse { repeated Result results = 1;}message Result { string url = 1; string title = 2; repeated string snippets = 3;}枚举message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; enum Corpus { UNIVERSAL = 0; WEB = 1; IMAGES = 2; LOCAL = 3; NEWS = 4; PRODUCTS = 5; VIDEO = 6; } Corpus corpus = 4;}服务定义的method仅能有一个入参和出参数。如果须要传递多个参数须要定义成message ...

January 24, 2023 · 3 min · jiezi

关于grpc:Grpc使用bufbuild-快速编译

本文通过实例来解说应用buf来疾速的编译proto文件,不须要再用protoc命令加各种参数来编译proto文件。 当时须要装置buf, 装置办法请参考官网installation咱们先建设目录构造 auth.protosyntax = "proto3";option go_package ="trade/auth/pb/proto/go/auth/v1;authV1";package auth.v1;message LoginRequest { string username = 1; string password = 2;}message LoginResponse { string access_token = 1; int32 expires_in = 2;}service AuthService { rpc Login (LoginRequest) returns (LoginResponse);}进入proto文件夹,执行buf mod initcd trade/apps/auth/pb/protobuf mod init进入下级pb文件夹 增加buf.gen.yaml文件buf.gen.yaml的配置,此处用到的plugin是本地模式的,请提前装好红框里的插件怎么装,请自行百度,如果有疑难能够私信我。 # buf.gen.yamlversion: v1plugins: - plugin: go out: gen/proto/go opt: paths=source_relative - plugin: go-grpc out: gen/proto/go opt: paths=source_relative输出命令 buf generate 进行编译,生成grpc的代码buf generate如果须要生成grpc-gateway的代码,请持续向下看在pb目录下创立一个auth.yamltype: google.api.Serviceconfig_version: 3http: rules: - selector: auth.v1.AuthService.Login post: "/v1/login" body: "*"批改buf.gen.yaml,增加grpc-gateway插件,并指定http接口规定的文件为auth.yaml - plugin: grpc-gateway out: gen/proto/go opt: - paths=source_relative - grpc_api_configuration=auth.yaml从新执行 buf generate 进行编译,生成proto文件对应的gw文件 ...

December 20, 2022 · 1 min · jiezi

关于grpc:grpc-备忘

grpcui 绑定调整grpcui 默认是绑定在127.0.0.1上,如果须要外网拜访 能够通过-bind设置 例如 grpcui -bind '0.0.0.0' -plaintext 127.0.0.1:8104 grpc 状态码状态码形容阐明0Ok返回胜利1Canceled操作已勾销2Unknown未知谬误。如果从另一个地址空间接管到的状态值属于在该地址空间中未知的谬误空间,则能够返回此谬误的示例。 没有返回足够的错误信息的API引发的谬误也可能会转换为此谬误3InvalidArgument示意客户端指定了有效的参数。 请留神,这与FailedPrecondition不同。 它示意无论零碎状态如何(例如格局谬误的文件名)都有问题的参数4DeadlineExceeded意味着操作在实现之前过期。 对于更改零碎状态的操作,即便操作胜利实现,也可能会返回此谬误。 例如,服务器的胜利响应可能会提早足够的工夫以使截止日期到期5NotFound示意找不到某个申请的实体(例如文件或目录)6AlreadyExists示意尝试创立实体失败,因为曾经存在7PermissionDenied示意调用者没有执行指定操作的权限。它不能用于因耗尽某些资源而引起的回绝(应用ResourceExhausted代替这些谬误)。如果调用者无奈辨认,则不能应用它(应用Unauthenticated代替这些谬误)8ResourceExhausted示意某些资源已耗尽,可能是每个用户的配额,或者整个文件系统空间有余9FailedPrecondition示意操作被回绝,因为零碎不处于操作执行所需的状态10Aborted示意操作被停止,通常是因为并发问题(如序列器查看失败,事务异样终止等)造成的11OutOfRange示意操作尝试超过无效范畴12Unimplemented该办法未实现13Internal意味着底层零碎预期的一些不变量已被突破。 如果你看到其中的一个谬误,那么事件就会十分蹩脚14Unavailable外部Grpc服务不可用,申请不到15DataLoss批示不可复原的数据失落或损坏16Unauthenticated示意申请没有无效的操作认证凭证常见状态码 4 超时过期14 不可用(rpc服务没有开启 端口异样)参考这里

November 29, 2022 · 1 min · jiezi

关于grpc:解压proto文件

以php clinet为例: 解压proto文件装置相应扩大,进入以后文件夹下执行如下命令即可protoc --php_out=../ centerorder.protoprotoc --php_out=../ centerpay.proto Passport接入的是第3版 这样会缺失客户端文件/usr/local/protobuf/bin/protoc --php_out=./ User.proto 在proto以后文件下运行脚本,将解压后的文件放在上一级当时建好的Settlement文件夹下protoc --proto_path=./ --php_out=../Settlement --grpc_out=../Settlement --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin ./settlement.proto或者:protoc --proto_path=./ --php_out=../ --grpc_out=../ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin ./settlement.proto

October 24, 2022 · 1 min · jiezi

关于grpc:grpc中的拦截器

0.1、索引https://waterflow.link/articles/1665853719750 当咱们编写 HTTP 应用程序时,您能够应用 HTTP 中间件包装特定于路由的应用程序处理程序,能够在执行应用程序处理程序之前和之后执行一些常见的逻辑。 咱们通常应用中间件来编写跨畛域组件,例如受权、日志记录、缓存等。在 gRPC 中能够应用称为拦截器的概念来实现雷同的性能。 通过应用拦截器,咱们能够在客户端和服务器上拦挡 RPC 办法的执行。 在客户端和服务器上,都有两种类型的拦截器: UnaryInterceptor(一元拦截器)StreamInterceptor(流式拦截器)UnaryInterceptor 拦挡一元 RPC,而 StreamInterceptor 拦挡流式 RPC。 在一元 RPC 中,客户端向服务器发送单个申请并返回单个响应。 在流式 RPC 中,客户端或服务器,或单方(双向流式传输),获取一个流读取一系列音讯返回,而后客户端或服务器从返回的流中读音讯,直到没有更多音讯为止。 1、在 gRPC 客户端中编写拦截器咱们能够在 gRPC 客户端应用程序中编写两种类型的拦截器: UnaryClientInterceptor:UnaryClientInterceptor 拦挡客户端上一元 RPC 的执行。StreamClientInterceptor:StreamClientInterceptor拦挡ClientStream的创立。 它可能会返回一个自定义的 ClientStream 来拦挡所有 I/O 操作。1、UnaryClientInterceptor为了创立 UnaryClientInterceptor,能够通过提供 UnaryClientInterceptor 函数值调用 WithUnaryInterceptor 函数,该函数返回一个 grpc.DialOption 指定一元 RPC 的拦截器: func WithUnaryInterceptor(f UnaryClientInterceptor) DialOption而后将返回的 grpc.DialOption 值用作调用 grpc.Dial 函数以将拦截器利用于一元 RPC 的参数。 UnaryClientInterceptor func 类型的定义如下: type UnaryClientInterceptor func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts …CallOption) error参数调用者是实现 RPC 的处理程序,调用它是拦截器的责任。 UnaryClientInterceptor 函数值提供拦截器逻辑。 这是一个实现 UnaryClientInterceptor 的示例拦截器: ...

October 16, 2022 · 6 min · jiezi

关于grpc:golang开发一个简单的grpc

0.1、索引https://waterflow.link/articles/1665674508275 1、什么是grpc在 gRPC 中,客户端应用程序能够间接调用不同机器上的服务器应用程序上的办法,就像它是本地对象一样,使您更容易创立分布式应用程序和服务。 与许多 RPC 零碎一样,gRPC 基于定义服务的思维,指定能够近程调用的办法及其参数和返回类型。 在服务端,服务端实现这个接口并运行一个 gRPC 服务器来解决客户端调用。 在客户端,客户端有一个stub(在某些语言中仅称为客户端),它提供与服务器雷同的办法。 所以grpc是跨语言的。 2、什么是Protocol BuffersProtocol Buffers提供了一种语言中立、平台中立、可扩大的机制,用于以向前兼容和向后兼容的形式序列化结构化数据。 它相似于 JSON,只是它更小更快,并且生成本地语言绑定。 能够通过 .proto定义数据结构,而后就能够应用Protocol Buffers编译器 protoc 从. proto 定义中生成咱们喜爱的语言的数据拜访类。 它们为每个字段提供简略的拜访器,如 name() 和 set_name(),以及将整个构造序列化/解析到原始字节/从原始字节中提取的办法。 3、grpc服务端1、首先咱们须要下载go对应的protoc插件go install google.golang.org/protobuf/cmd/[email protected]go install google.golang.org/grpc/cmd/[email protected]而后把GOPATH放到PATH export PATH="$PATH:$(go env GOPATH)/bin"接着打印下看看有没有进去 echo $PATH/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$GOPATH/bin:/usr/local/go/bin接着开新窗口,执行上面命令看下protoc是否装置胜利 protoc --versionlibprotoc 3.19.12、接着咱们创立一个hello.proto内容如下(不懂构造的可自行百度) syntax = "proto3";package helloservice;option go_package = ".;helloservice"; // 指定包名message String { string value = 1;}service HelloService { rpc Hello(String) returns (String); // 一元办法 rpc Channel (stream String) returns (stream String); // 流式办法}目录构造如下 ...

October 13, 2022 · 2 min · jiezi

关于grpc:从零开始学gRPC一

前言gRPC作为以后最热门的RPC框架之一,以其独特的跨语言、跨平台个性,博得许多公司的青眼。诚实说,之前我只是一人传虚;万人传实并没有认真去钻研,明天我会依据官网的demo开展介绍整个gRPC的性能,前面一篇会介绍gRPC如何整合到SpringCloud。 我这里只提供了搭建demo工程的材料,倡议本人入手来操作。没有截图我的项目也是因为官网的材料相当齐全,没必要反复造轮子。 gRPC总览在间接应用gRPC之前,咱们先理解下它的所有个性。官网形容 我就不开展讲了,gRPC有以下几点次要性能: 应用Protocol Buffer 定义服务。语言和平台的中立性双向流式通信基于HTTP2.0身份认证、SLB、tracing、health check组件可扩大。疾速搭建环境筹备操作系统:WindownsJDK版本:1.8编辑工具:IntelliJ IDEA Community Edition 2021.1.2 x64 创立我的项目本人创立一个maven我的项目就好,没有别的要求(All in one,临时不须要分模块)。想要偷懒的同学也能够借鉴我的我的项目,这里曾经给你筹备好了。然而我倡议本人入手尝试搭建比拟好,不然印象不太粗浅,等于没学(有个词儿叫口头废人,尽管不好听但目标是心愿能让你入手实际)。 阐明: 这里之所以没用官网的demo是因为我本地切实编译不进去,而且官网给的我的项目太大,对于学习来说没必要全副下载。(我只想要examples模块,然而必须强制全副下载,就很烦)当然,要下载的敌人看这里 。官网的中文文档地址是这个 ,能够依照官网提供的文档做。但如果只是玩具,那我这种All on one的形式我感觉更简略。 Helloworld咱们间接拿官网的例子来解说,官网代码地址 。外面有很多例子,我这里只讲局部。 proto文件咱们到官网地址 抄作业时要留神,整个目录的构造。proto文件只能放在模块的src/main上面,留神地位还有名字是否弄错,不然生成不了代码。 代码服务端:代码地址 客户端:代码地址 个性解说咱们晓得gRPC不仅仅是一个helloworld就能形容分明的,我上面将官网的代码例子做个分类,顺便总结下。 Stream例子proto: 代码地址代码目录: 代码地址总结上述代码想表白的意思是,服务端在收到全副的客户端数据之后再响应回客户端处理结果。理论状况能够是服务端先解决一部分,而后返回局部。也能够是任意程序, 重要的是理解如何应用Stream的相干API来做交互。 TLS例子proto: 代码地址代码目录: 代码地址(还是helloworld的例子) 总结这个就没啥好说的,用了Http2.0的TLS个性,默认就是开启的。如果客户端要传明文则必须在channel中配置,如下所示。 SLB 和 Health Check例子proto: 代码地址代码目录: 代码地址官网并没提供,上面都是本人的尝试 Client端在创立ManagedChannel时指定SLB策略。默认实现只有 pick_first 和 round_robin,这里以round_robin为例子解说。target字符串做调整新增两个类,代码如下。 public class MyNameResolverProvider extends NameResolverProvider { /** * The constant containing the scheme that will be used by this factory. */ public static final String STATIC_SCHEME = "static"; private static final Pattern PATTERN_COMMA = Pattern.compile(","); @Nullable @Override public NameResolver newNameResolver(final URI targetUri, final NameResolver.Args args) { if (STATIC_SCHEME.equals(targetUri.getScheme())) { return of(targetUri.getAuthority(), args.getDefaultPort()); } return null; } /** * Creates a new {@link NameResolver} for the given authority and attributes. * * @param targetAuthority The authority to connect to. * @param defaultPort The default port to use, if none is specified. * @return The newly created name resolver for the given target. */ private NameResolver of(final String targetAuthority, int defaultPort) { requireNonNull(targetAuthority, "targetAuthority"); // Determine target ips final String[] hosts = PATTERN_COMMA.split(targetAuthority); final List<EquivalentAddressGroup> targets = new ArrayList<>(hosts.length); for (final String host : hosts) { final URI uri = URI.create("//" + host); int port = uri.getPort(); if (port == -1) { port = defaultPort; } targets.add(new EquivalentAddressGroup(new InetSocketAddress(uri.getHost(), port))); } if (targets.isEmpty()) { throw new IllegalArgumentException("Must have at least one target, but was: " + targetAuthority); } return new MyStaticNameResolver(targetAuthority, targets); } @Override public String getDefaultScheme() { return STATIC_SCHEME; } @Override protected boolean isAvailable() { return true; } @Override protected int priority() { return 4; // Less important than DNS } @Override public String toString() { return "StaticNameResolverProvider [scheme=" + getDefaultScheme() + "]"; }}public class MyStaticNameResolver extends NameResolver { private final String authority; private final ResolutionResult result; /** * Creates a static name resolver with only a single target server. * * @param authority The authority this name resolver was created for. * @param target The target address of the server to use. */ public MyStaticNameResolver(final String authority, final EquivalentAddressGroup target) { this(authority, ImmutableList.of(requireNonNull(target, "target"))); } /** * Creates a static name resolver with multiple target servers. * * @param authority The authority this name resolver was created for. * @param targets The target addresses of the servers to use. */ public MyStaticNameResolver(final String authority, final Collection<EquivalentAddressGroup> targets) { this.authority = requireNonNull(authority, "authority"); if (requireNonNull(targets, "targets").isEmpty()) { throw new IllegalArgumentException("Must have at least one target"); } this.result = ResolutionResult.newBuilder() .setAddresses(ImmutableList.copyOf(targets)) .build(); } /** * Creates a static name resolver with multiple target servers. * * @param authority The authority this name resolver was created for. * @param result The resolution result to use.. */ public MyStaticNameResolver(final String authority, final ResolutionResult result) { this.authority = requireNonNull(authority, "authority"); this.result = requireNonNull(result, "result"); } @Override public String getServiceAuthority() { return this.authority; } @Override public void start(final Listener2 listener) { listener.onResult(this.result); } @Override public void refresh() { // Does nothing } @Override public void shutdown() { // Does nothing } @Override public String toString() { return "StaticNameResolver [authority=" + this.authority + ", result=" + this.result + "]"; }}新增文件io.grpc.NameResolverProviderServer端启动多个实现,记得要改端口(能够在server端加些日志来验证)阐明:下面的代码是从grpc-spring-boot-start中抄过来的,前面会细讲。原生的grpc只能用dns,本地没法做,所以采纳这种形式验证SLB。其实在这个过程中咱们也能看到,如果要基于grpc性能组件做扩大也是极不便的。 ...

June 23, 2022 · 3 min · jiezi

关于grpc:理解-GRPC-中的长连接

有些技术知识点能在这么短的工夫里搞清楚弄明确,和本人接触的技术深度以及广度,工作教训密不可分。再次强调一下,千万不要试图去钻研你钻研了很久都整不明确的货色,或者是你的档次不到,也或者是你从未在理论的利用场景接触过,这种状况下你去钻研,只会事倍功半,徒劳一番罢了。(在不该了解的时候了解不该了解的知识点,后果只会事倍功半)。 GRPC 包含=》 传输协定(http2.0) + 序列化协定(pb) HTTP协定是基于申请/响应模式的,因而只有服务端给了响应,本次HTTP连贯就完结了,或者更精确的说,是本次HTTP申请就完结了,基本没有长连贯这一说。那么天然也就没有短连贯这一说了。 网络上说HTTP分为长连贯和短连贯,其实实质上是说的TCP连贯。TCP连贯是一个双向的通道,它是能够放弃一段时间不敞开的,因而TCP连贯才有真正的长连贯和短连贯这一说。 HTTP协定说到底是应用层的协定,而TCP才是真正的传输层协定,只有负责传输的这一层才须要建设连贯。 举例:一个形象的例子就是,拿你在网上购物来说,HTTP协定是指的那个快递单,你寄件的时候填的单子就像是发了一个HTTP申请,等货物运到中央了,快递员会依据你发的申请把货物送给相应的收货人。而TCP协定就是两头运货的那个大货车,也可能是火车或者飞机,但不论是什么,它是负责运输的,因而必须要有路,不论是地上还是天上。那么这个路就是所谓的TCP连贯,也就是一个双向的数据通道。 HTTP申请和HTTP响应,都是通过TCP连贯这个通道来回传输的。 肯定要务必记住,长连贯是指的TCP连贯,而不是HTTP连贯。 问题:1.第一个问题是,是不是只有设置Connection为keep-alive就算是长连贯了?当然是的,但要服务器和客户端都设置。 2、第二个问题是,咱们平时用的是不是长连贯?当初用的基本上都是HTTP1.1协定,基本上Connection都是keep-alive。而且HTTP协定文档上也提到了,HTTP1.1默认是长连贯,也就是默认Connection的值就是keep-alive 3、长连贯有啥益处?长连贯是为了复用,那既然长连贯是指的TCP连贯,也就是说复用的是TCP连贯。那这就很好解释了,也就是说,长连贯状况下,多个HTTP申请能够复用同一个TCP连贯,这就节俭了很多TCP连贯建设和断开的耗费。 比方你申请了淘宝的一个网页,这个网页里必定还蕴含了CSS、JS等等一系列资源,如果你是短连贯(也就是每次都要从新建设TCP连贯)的话,那你每关上一个网页,根本要建设几个甚至几十个TCP连贯,这节约了多少资源就不必LZ去说了吧。 但如果是长连贯的话,那么这么屡次HTTP申请(这些申请包含申请网页内容,CSS文件,JS文件,图片等等),其实应用的都是一个TCP连贯,很显然是能够节俭很多耗费的,只须要一次TCP三次握手就行了。 长连贯还要多提一句,那就是,长连贯并不是永恒连贯的。如果一段时间内(具体的工夫长短,是能够在header当中进行设置的,也就是所谓的超时工夫),这个连贯没有HTTP申请收回的话,那么这个长连贯就会被断掉。 参考: https://juejin.cn/post/692388...

June 5, 2022 · 1 min · jiezi

关于grpc:预览目录gozero必知必会

go-zero必知必会服务注册发现一、服务注册发现分类【阐明】:其余服务发现形式看https://github.com/zeromicro/...官网demo,其中yaml中,etcd、IP直连、k8s三种配置文件也不是对立的 默认形式etcdapi配置文件#gateway-api.yaml#api服务发现配置模块AdminRpc: Timeout: 10000 Etcd: Hosts: - 127.0.0.1:2379 Key: admin.rpcrpc配置文件#admin.yamlName: admin.rpcListenOn: 127.0.0.1:8080#rpc服务发现配置模块Etcd: Hosts: - 127.0.0.1:2379 Key: admin.rpckubernetes【阐明】:举荐应用k8s形式部署对应利用,这样能够缩小保护一套etcd集群。 1.api配置文件 #gateway-api.yaml#api服务发现配置模块AdminRpc: Timeout: 10000 Endpoints: - 127.0.0.1:395112.rpc配置文件 #admin.yamlName: admin.rpcListenOn: 127.0.0.1:8080#rpc服务发现配置模块,不须要配置IP直连1.api配置文件 #gateway-api.yaml#api服务发现配置模块AdminRpc: Timeout: 10000 Endpoints: - 127.0.0.1:395112.rpc配置文件 #admin.yamlName: admin.rpcListenOn: 127.0.0.1:8080#rpc服务发现配置模块,不须要配置consulnacospolaris二、框架组件(一)、Api定义(二)、我的项目配置rest.RestConf配置配置构造体 RestConf struct { service.ServiceConf Host string `json:",default=0.0.0.0"` Port int CertFile string `json:",optional"` KeyFile string `json:",optional"` Verbose bool `json:",optional"` MaxConns int `json:",default=10000"` MaxBytes int64 `json:",default=1048576"` // milliseconds Timeout int64 `json:",default=3000"` CpuThreshold int64 `json:",default=900,range=[0:1000]"` Signature SignatureConf `json:",optional"`}//成员service.ServiceConftype ServiceConf struct { Name string Log logx.LogConf Mode string `json:",default=pro,options=dev|test|rt|pre|pro"` MetricsUrl string `json:",optional"` Prometheus prometheus.Config `json:",optional"` Telemetry trace.Config `json:",optional"`}//成员SignatureSignatureConf struct { Strict bool `json:",default=false"` Expiry time.Duration `json:",default=1h"` PrivateKeys []PrivateKeyConf}第1步:在internal/config/config.go新增配置文件 ...

April 29, 2022 · 1 min · jiezi

关于grpc:gRPC-简介实践

前言古代的软件服务大多数是分布式应用程序,通过裸露本人的 API 对内或对外提供了一系列的性能点。服务与服务之间有时是跨语言、跨平台通信的。 为了解决这些简单场景,市面上也涌现了有很多解决方案。比方构建 RESTful 服务,将服务能力转化为资源汇合;也有面向函数调用的客户端-服务器模式:近程过程调用(Remote Procedure Calls)。明天要介绍的 gRPC 就是后者的演变,一个十分受欢迎分布式过程间通信技术。 意识 gRPCgRPC 是 Google 在 2015 年推出的 RPC 框架。在意识 gRPC 之前,咱们先来理解下 RPC 的相干常识。RPC 次要使用于分布式程序中,它构建了客户端-服务器模型,相似于申请-响应通信形式,只不过这种申请被咱们形象为了函数办法 + 入参信息,底层的网络通信则被屏蔽了起来,到最初就像本地办法调用一样。 Protocol Buffers下面提到了函数的入参信息,有入参就有对象类型,而端到端的对象类型就势必波及到网络通信过程中的字节序列化和反序列化过程。在 gRPC 中,采纳了 Protobuf(Protocol Buffers)作为序列化和反序列化协定。它是一种轻便高效的结构化数据存储格局,基于二进制编码构建,可能缩小 CPU 的简单解析,保障了 RPC 调用的高性能。 另外 Protobuf 反对多种编程语言,咱们只须要对其进行接口定义形容,便能够依据形容文件主动生成客户端和服务端须要应用到的构造体和办法函数,就像是代码主动生成一样,大大提高了咱们的编程效率。 HTTP/2gRPC 是基于 HTTP/2 设计的,HTTP/2 也是 2015 年公布的,它是下一代的 HTTP 协定,具备很多高级性能,如: 基于二进制格局传输,传输速度更快,更紧凑,不易出错。多路复用,单个连贯可发送多个申请。对报头压缩,能升高传输开销。容许服务器被动推送。正是这些 HTTP/2 的个性,使得 gRPC 可能应用较少的资源,取得较快的响应,在挪动端设施上更加省电省流量。 gRPC 的应用接口定义当咱们开发一个 gRPC 应用程序时,要做的第一件事件就是定义一个接口形容文件。在这个文件里,咱们会将函数、参数信息都形容进去,就像上面这个 ProductInfo.proto 文件一样: // 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;}gRPC 服务端当咱们拿到定义好的接口形容文件 ProductInfo.proto 后,就能够应用 Protobuf 编译器:protoc 来生成咱们的服务端代码了。假如咱们的服务端采纳的是 Go 语言,则在通过一系列插件的装置后,咱们就能够应用上面的命令来编译生成代码了: ...

March 8, 2022 · 2 min · jiezi

关于grpc:postman如何调试grpc

在刚刚接触 grpc 的时候,调试十分不不便,之后应用过 Grpc Swagger 等一系列工具,应用都还蛮不便的,然而作为一个 postman 的忠诚粉丝,还是心愿能够应用 postman 来调试 grpc 服务。 前段时间,我老大对我说,postman 反对 grpc 了,我哈哈,情绪异样冲动,毕竟在工作中又能够省出一部分工夫去摸鱼了。 明天钻研下 postman 如何反对 grpc 服务调试。 前置条件postman 反对 grpc 是在 v9.7.1 及以上版本,低于此版本的须要降级到此版本以上版本。 如何应用 如上是官网的演示图,如下我写下我是如何看图钻研的。 其实有两种形式能够调用,第一是通过 postman 反射能力调用服务,第二是创立或导入 proto 后调用服务。 1. 反射第一步: 第二步: 第三步: 第四步:抉择Using server reflection,第三个下拉框抉择须要调用的接口,Invoke点击调用 通过以上四步,实现 grpc 服务调用,很简略吧,只须要输出ip和端口,其余的只是下拉框选一选,然而我点了几次 Save 都提醒 Coming soon 意思是马上就来 ,那就等吧。我预计是 Save 性能还未公布上线,还用不了,这个是比拟大的悲观,毕竟每次都得须要录入IP、端口等等。 2. 创立、导入proto这种形式其实更加不便,能够将 proto 文件导入到 postman 中,并且能够分版本,最终调用的时候应用导入的模版来进行调用。 第一步: 第二步:咱们导入下 demo.proto 文件第三步:导入导入实现: 第四步:可选,批改名称 第五步:这步骤也就是最终将文件加载进来,咱们能够看到具体的 proto 文件内容,也能够批改,然而不会同步本地磁盘文件。 ...

February 19, 2022 · 1 min · jiezi

关于grpc:gRPC-源码阅读及实践之-resolver

ResolvergRPC 插件式编程之Resolver 随着微服务越来越流行,服务间的通信也是绕不开的话题,gRPC 在泛滥 RPC 框架中算得上佼佼者,不仅其有一个好爸爸,grpc 在扩大方面也给开发者留有足够的空间,明天咱们将走进grpc 扩大之 Resolver,gRPC Resolver 提供了用户自行解析主机的扩大能力,咱们在应用 gRPC 时,大家有没有想过,为什么 gRPC 为什么反对以下几种格局的 target: 直连, 链接 target 为指标服务的endpointdns 服务发现unix其中在进入连贯之前,gRPC 会依据用户是否提供了 Resolver 来进行指标服务的 endpoint 解析,明天咱们来尝试写一个最简略的 etcd 做服务发现的例子 阐明源码浏览的 gRPC 版本为 3.5.1 环境etcd 装置go思路咱们将为 server 服务,假如名称为 grpc-server 启动多个实例以 grpc-server 为 key 向 etcd put 每个实例的 endpoint 真正进入 etcd 的 key 为以 grpc-server + / + 随机值实现 resolver.Builder, 获取 target从 etcd 读取以 grpc-server 为 prefix 的 endpoints告诉负载均衡器从新 pick 实例实现实现 resolver.Builder ...

January 14, 2022 · 3 min · jiezi

关于grpc:gRPC系列二-异步服务使用

gRPC系列(二) 异步服务应用相干文章:gRPC系列(一)装置和入门 异步的实现次要围绕的是grpc提供的队列:grpc::CompletionQueue。 客户端代码异步客户端代码绝对于同步客户端来说并没有简单多少,简略来说,就是同步rpc调用是调用完不会立即返回,而是能够异步从队列中取得返回后果,实现调用的解耦,咱们来看代码。 #include <iostream>#include <grpcpp/completion_queue.h>#include <grpcpp/security/credentials.h>#include <grpcpp/support/async_unary_call.h>#include <grpcpp/grpcpp.h>#include "../protos/simple/simple.grpc.pb.h"using grpc::Status;using grpc::Channel;using grpc::CompletionQueue;using grpc::ClientContext;using grpc::ClientAsyncResponseReader;using Simple::EchoRequest;using Simple::EchoResponse;int main(){ std::shared_ptr<Channel> chan = grpc::CreateChannel("localhost:12345",grpc::InsecureChannelCredentials()); std::unique_ptr<Simple::Server::Stub> stub(Simple::Server::NewStub(chan)); ClientContext context; EchoRequest req; req.set_msg("hello world!"); EchoResponse resp; CompletionQueue cq; // 实现rpc调用会将tag增加到cq队列中 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> rpc(stub->AsyncEcho(&context, req, &cq)); Status status; // 第三个参数是一个上下文标签,用于帮咱们标识这个申请 // grpc框架只会将其保存起来 rpc->Finish(&resp, &status, (void*)1); void* got_tag; bool ok = false; // 从队列中获取,申请的标签以及状态 cq.Next(&got_tag, &ok); if(ok && got_tag == (void*)1){ // check一下后果 std::cout << resp.msg() << std::endl; } return 0;}服务端代码异步服务端不不便了解,能够参考:grpc应用记录(三)简略异步服务实例这里次要波及到的类包含grpc::ServerCompletionQueue、grpc::ServerAsyncResponseWriter、grpc::ServerAsyncResponseWriter、Simple::Server::AsyncService。次要的解决流程是, ...

December 18, 2021 · 2 min · jiezi

关于grpc:gRPC系列一-安装和入门

gRPC系列(一) 装置和入门gRPC是由谷歌公司开发的一款rpc框架,反对多种语言,包含C++、Java、Golang、python等等。这个系列将会次要记录gRPC的学习过程,本文次要包含装置和简略的应用,语言为C++。 装置我的操作系统是ubuntu20.04。 装置依赖 sudo apt-get install pkg-configsudo apt-get install autoconf automake libtool make g++ unzipsudo apt-get install libgfalgs-dev libgtest-devsudo apt-get install clang libc++-dev下载gRPC git clone https://github.com/grpc/grpc.gitcd grpcgit submodule update --init // 更新第三方源码装置protobuf源码 cd third_party/protobuf/git submodule update --init --recursive./autogen.sh // 生成配置脚本./configure // 生成Makefile文件,为下一步的编译做筹备,能够加上装置门路:--prefix=pathmakemake checksudo make installsudo ldconfig // 更新共享库缓存which protoc // 查看软件是否装置胜利protoc --version // 查看是否装置胜利装置gRPC cd ../..makesudo make install简略应用应用grpc包含几个步骤:定义服务、生成代码、编写服务端代码、编写客户端代码、运行。 定义服务服务定义文件是proto文件,中文文档能够参考Protobuf语法指南这里先写一个简略的proto文件 syntax="proto3";// 语法类型package Simple;// 这是生成代码应用的namespace,所有生成的代码都会在这个namespace中。// 指定服务的名称,生成的代码外面的二级namespaceservice Server { rpc Echo(EchoRequest) returns (EchoReponse){}}message EchoRequest { string msg = 1; // }message EchoResponse { string msg = 1;}下面的接口中,必须有参数和返回值,如果不须要参数或者返回值,也必须定义一个空的(没有成员)message,否则无奈通过编译。 ...

December 18, 2021 · 2 min · jiezi

关于grpc:Golang-gRPC实践-在gRPC中使用FlatBuffers编码

介绍gRPC默认应用Protocol Buffers编码,同时也反对其余编码如:JSON、FlatBuffers等。 FlatBuffers是一个跨平台的序列化库,旨在实现最大的内存效率。它容许您间接拜访序列化数据,而无需首先对其进行解析/解包,同时仍具备良好的向前/向后兼容性。 我的项目地址:https://github.com/google/flatbuffers FlatBuffers在解编码性能上要比Protocol Buffers快很多,这里有两篇具体介绍Protocol Buffers和FlatBuffers比照的文章: https://blog.csdn.net/chosen0ne/article/details/43033575https://juzii.gitee.io/2020/03/02/protobuf-vs-flatbuffer/ 这里有一篇文章具体介绍了FlatBuffers以及schema的编写: https://halfrost.com/flatbuffers_schema/ 这里次要来演示一下如何在gRPC中应用FlatBuffers. 编码编写fbs接口定义文件api/fbs/greeter.fbs namespace models;table HelloReply { message:string;}table HelloRequest { name:string;}table ManyHellosRequest { name:string; num_greetings:int;}rpc_service Greeter { SayHello(HelloRequest):HelloReply; SayManyHellos(ManyHellosRequest):HelloReply (streaming: "server");}这里的定义和protobuf差不多,应用table定义构造体,应用rcp_service定义接口。 这里定义了三个构造体用于数据发送和接管,定义了两个接口用于演示。 生成gRPC代码先装置flatc 从上面地址中下载对应版本的flatc即可 https://github.com/google/flatbuffers/releases/tag/v2.0.0 flatc --go --grpc -o api/ api/fbs/greeter.fbs参数阐明: --go 指定生成的语言是go--grpc 指定生成grpc代码-o 可选,指定要生成的指标文件目录前缀--go-namespace 可选,指定生成的包名,笼罩 fbs 文件中的定义会在指定目录下生成一个models目录,外面即是生成的代码,这个目录名就是fbs文件中定义的namespace,也能够通过参数'--go-namespace来笼罩这个值,以指定新的目录,如: flatc --go --go-namespace newmodels --grpc -o api/ api/fbs/greeter.fbs倡议通过fbs定义namespace,这个namespace也是Go文件的package名称。 生成的文件目录是这样的: ├── api│   ├── fbs│   │   └── greeter.fbs│   └── models│   ├── Greeter_grpc.go│   ├── HelloReply.go│   ├── HelloRequest.go│   └── ManyHellosRequest.go当初咱们能够编写gRPC的代码了。 ...

December 15, 2021 · 3 min · jiezi

关于grpc:基于内存通信的gRPC调用

Apache Dubbo 有injvm形式的通信,可能防止网络带来的提早,同时也不占用本地端口,对测试、本地验证而言,是一种比拟不便的RPC通信形式。 最近看到 containerd 的代码,发现它也有相似的需要。但应用ip端口通信,有可能会有端口抵触;应用unix socket,可能会有门路抵触。考查了下gRPC有没有和injvm相似的,基于内存的通信形式。起初发现pipe十分好用,所以记录了下。 Golang/gRPC对网络的形象首先,咱们先看一下gRPC一次调用的架构图。当然,这个架构图目前只关注了网络形象散布。 咱们重点关注网络局部。 操作系统零碎形象首先,在网络包之上,零碎形象进去了socket,代表一条虚构连贯,对于UDP,这个虚构连贯是不牢靠的,对于TCP,这个链接是尽力牢靠的。 对于网络编程而言,仅仅有连贯是不够的,还须要通知开发者如何创立、敞开连贯。对于服务端,零碎提供了accept办法,用来接管连贯。对于客户端,零碎提供了connect办法,用于和服务端建设连贯。 Golang形象在Golang中,socket对等的概念叫net.Conn,代表了一条虚构连贯。 接下来,对于服务端,accept这个行为被包装成了net.Listener接口;对于客户端,Golang则基于connect提供了net.Dial办法。 type Listener interface { // 接管来自客户端的网络连接 Accept() (Conn, error) Close() error Addr() Addr}gRPC应用那么gRPC是怎么应用Listener和Dial的呢? 对于gRPC服务端,Serve办法接管一个Listener,示意在这个Listener上提供服务。 对于gRPC客户端,网络实质上就是一个可能连贯到某个中央的货色就能够,所以只须要一个dialer func(context.Context, string) (net.Conn, error)函数就行了。 什么是pipe在操作系统层面,pipe示意一个数据管道,而这个管道两端都在本程序中,能够很好的满足咱们的要求:基于内存的网络通信。 Golang也基于pipe提供了net.Pipe()函数创立了一个双向的、基于内存通信的管道,在能力上,可能很好的满足gRPC对底层通信的要求。 然而net.Pipe仅仅产生了两个net.Conn,即只产生两个网络连接,没有之前提到的Listner,也没有Dial办法。 于是联合Golang的channel,把net.Pipe包装成了Listner,也提供了Dial办法: Listener.Accept(),只须要监听一个channel,客户端连贯过去的时候,把连贯通过channel传递过去即可Dial办法,调用Pipe,将一端通过channel给服务端(作为服务端连贯),另一端作为客户端连贯代码如下: package mainimport ( "context" "errors" "net" "sync" "sync/atomic")var ErrPipeListenerClosed = errors.New(`pipe listener already closed`)type PipeListener struct { ch chan net.Conn close chan struct{} done uint32 m sync.Mutex}func ListenPipe() *PipeListener { return &PipeListener{ ch: make(chan net.Conn), close: make(chan struct{}), }}// Accept 期待客户端连贯func (l *PipeListener) Accept() (c net.Conn, e error) { select { case c = <-l.ch: case <-l.close: e = ErrPipeListenerClosed } return}// Close 敞开 listener.func (l *PipeListener) Close() (e error) { if atomic.LoadUint32(&l.done) == 0 { l.m.Lock() defer l.m.Unlock() if l.done == 0 { defer atomic.StoreUint32(&l.done, 1) close(l.close) return } } e = ErrPipeListenerClosed return}// Addr 返回 listener 的地址func (l *PipeListener) Addr() net.Addr { return pipeAddr(0)}func (l *PipeListener) Dial(network, addr string) (net.Conn, error) { return l.DialContext(context.Background(), network, addr)}func (l *PipeListener) DialContext(ctx context.Context, network, addr string) (conn net.Conn, e error) { // PipeListener是否曾经敞开 if atomic.LoadUint32(&l.done) != 0 { e = ErrPipeListenerClosed return } // 创立pipe c0, c1 := net.Pipe() // 期待连贯传递到服务端接管 select { case <-ctx.Done(): e = ctx.Err() case l.ch <- c0: conn = c1 case <-l.close: c0.Close() c1.Close() e = ErrPipeListenerClosed } return}type pipeAddr intfunc (pipeAddr) Network() string { return `pipe`}func (pipeAddr) String() string { return `pipe`}如何用pipe作为gRPC的connection有了下面的包装,咱们就能够基于此创立一个gRPC的服务器端和客户端,来进行基于内存的RPC通信了。 ...

December 5, 2021 · 4 min · jiezi

关于grpc:gRPC-PHP与GO-数据增长性能测试与分析

前言大家好,我是CrazyCodes,最近调研了下对于PHP通过gRPC申请go,与PHP通过HTTP形式申请,依据数据量一直增长的状况下,均匀响应工夫会有多大差距。 一致性申明测试报告全副由开发机测试得出,未进行任何配置更改。 本机配置 3 GHz 六核Intel Core i516 GB 2400 MHz DDR4MacOsGo启动HTTP http.ListenAndServePHP启动HTTP php -S 127.0.0.1:8088Ab ab -c 200 -n 200 -k测试数据阐明Go作为服务端,是通过for间接迭代出的测试数据,没有任何其余多余操作 // 伪代码for i := 0; i < 2,20,200,2000,5000; i++ {}其余阐明 下方GPH[数字],代表gRPC + PHP + HTTP + 数据量 GPH 2返回数据集大小统一 gRPC Document Length≈87bytesHttp Document Length≈315bytesGo Grpc -> Go Grpc 均匀响应工夫为66.215ms Php Grpc -> Go Grpc 均匀响应工夫为190.551ms Php Http -> Go Http 均匀响应工夫为120.692ms GPH 20返回数据集大小统一 gRPC Document Length≈556bytesHttp Document Length≈2198bytesGo Grpc -> Go Grpc 均匀响应工夫为71.525ms ...

November 7, 2021 · 1 min · jiezi

关于grpc:GRPC-如何实现分布式日志跟踪

简介: 本文将介绍如何在 gRPC 分布式场景中,实现 API 的日志跟踪。 介绍本文将介绍如何在 gRPC 分布式场景中,实现 API 的日志追踪。 什么是 API 日志追踪?一个 API 申请会跨多个微服务,咱们心愿通过一个惟一的 ID 检索到整个链路的日志。 咱们将会应用 rk-boot 来启动 gRPC 服务。 请拜访如下地址获取残缺教程: https://rkdev.info/cnhttps://rkdocs.netlify.app/cn (备用) 装置go get github.com/rookie-ninja/rk-boot 疾速开始rk-boot 默认集成了 grpc-gateway,并且会默认启动。 咱们会创立 /api/v1/greeter API 进行验证,同时开启 logging, meta 和 tracing 拦截器以达到目标。 1. 创立 api/v1/greeter.protosyntax = "proto3";package api.v1;option go_package = "api/v1/greeter";service Greeter { rpc Greeter (GreeterRequest) returns (GreeterResponse) {}}message GreeterRequest { string name = 1;}message GreeterResponse { string message = 1;}2. 创立 api/v1/gw_mapping.yamltype: google.api.Serviceconfig_version: 3# Please refer google.api.Http in https://github.com/googleapis/googleapis/blob/master/google/api/http.proto file for details.http: rules: - selector: api.v1.Greeter.Greeter get: /api/v1/greeter3. 创立 buf.yamlversion: v1beta1name: github.com/rk-dev/rk-demobuild: roots: - api4. 创立 buf.gen.yamlversion: v1beta1plugins: # protoc-gen-go needs to be installed, generate go files based on proto files - name: go out: api/gen opt: - paths=source_relative # protoc-gen-go-grpc needs to be installed, generate grpc go files based on proto files - name: go-grpc out: api/gen opt: - paths=source_relative - require_unimplemented_servers=false # protoc-gen-grpc-gateway needs to be installed, generate grpc-gateway go files based on proto files - name: grpc-gateway out: api/gen opt: - paths=source_relative - grpc_api_configuration=api/v1/gw_mapping.yaml # protoc-gen-openapiv2 needs to be installed, generate swagger config files based on proto files - name: openapiv2 out: api/gen opt: - grpc_api_configuration=api/v1/gw_mapping.yaml5. 编译 proto file$ buf generate如下的文件会被创立。$ tree api/gen api/gen└── v1 ├── greeter.pb.go ├── greeter.pb.gw.go ├── greeter.swagger.json └── greeter_grpc.pb.go 1 directory, 4 files6. 创立 bootA.yaml & serverA.goServer-A 监听 1949 端口,并且发送申请给 Server-B。 ...

October 21, 2021 · 4 min · jiezi

关于grpc:GRPC-如何优雅关闭进程graceful-shutdown

简介: 本文将介绍优雅敞开 gRPC 微服务。在过程收到敞开信号时,咱们须要敞开后盾运行的逻辑,比方,MySQL 连贯等等。 介绍本文将介绍优雅敞开 gRPC 微服务。 什么是优雅敞开? 在过程收到敞开信号时,咱们须要敞开后盾运行的逻辑,比方,MySQL 连贯等等。 咱们将会应用 rk-boot 来启动 gRPC 服务。 请拜访如下地址获取残缺教程: https://rkdev.info/cnhttps://rkdocs.netlify.app/cn (备用)装置go get github.com/rookie-ninja/rk-boot 疾速开始1.创立 boot.yaml---grpc: - name: greeter # Name of grpc entry port: 8080 # Port of grpc entry enabled: true # Enable grpc entry2.创立 main.go通过 AddShutdownHookFunc() 来增加 shutdownhook 函数。 package mainimport ( "context" "github.com/rookie-ninja/rk-boot" "github.com/rookie-ninja/rk-gin/interceptor/context")// Application entrance.func main() { // Create a new boot instance. boot := rkboot.NewBoot() // Add shutdown hook function boot.AddShutdownHookFunc("shutdown-hook", func() { fmt.Println("shutting down") }) // Bootstrap boot.Bootstrap(context.Background()) // Wait for shutdown sig boot.WaitForShutdownSig(context.Background())}3.启动 main.go$ go run main.go ...

October 21, 2021 · 1 min · jiezi

关于grpc:Grpc对象转proto代码工具

Grpc对象转proto代码工具尽管Grpc.Tools能够将proto文件主动生成代理类,然而proto文件得手敲,还容易出错,如果接口比较复杂,定义比拟多,这就很头疼了 为了解决这个问题Class2Proto诞生了,应用规范C#对象转换成proto文件,不论是新写的接口,还是老的API接口转Grpc,都没问题 <u>装置nuget包:CRL.Class2Proto</u><u>using CRL.Class2Proto;</u>定义标准接口代码 [ProtoServiceAttribute("protoTest", "ClassTestAction")]public interface ClassTestAction{ ClassTest getObj(TestObj a); //ClassTest getObj2(TestObj a); Request getObj3(TestObj2<Request> a); TestObj2<List<Request>> getObj4(TestObj2<List<Request>> a);}运行转换方法生成proto文件 var convertInfo = ClassConvert.Convert(System.Reflection.Assembly.GetAssembly(typeof(ClassTest)));convertInfo.ForEach(b => b.CreateCode());程序目录Protos成生了protoTest.proto文件 syntax = "proto3";option csharp_namespace = "gRPC.gRpcClient.protoTest";package protoTest;service ClassTestAction { rpc getObj(TestObjDTO) returns (ClassTestDTO); rpc getObj3(TestObj2_RequestDTO) returns (RequestDTO); rpc getObj4(TestObj2_l_RequestDTO) returns (TestObj2_l_RequestDTO);}message StatusDTO { ok = 0; fail = 1;}message TestObjDTO { string Id = 1;}message ClassTestDTO { string Name = 1; int32 nullableValue = 2; StatusDTO Status = 3; TestObjDTO Data = 4; repeated string Name2 = 5; repeated TestObjDTO Data2 = 6; map<string, TestObjDTO> Data3 = 7; string time = 8; double decimalValue = 9; string Id = 10;}message RequestDTO {}message TestObj2_RequestDTO { string Id = 1; RequestDTO data = 2;}message TestObj2_l_RequestDTO { string Id = 1; repeated RequestDTO data = 2;}

July 2, 2021 · 1 min · jiezi

关于grpc:gRPCgo源码剖析与实战专栏介绍

1、背景介绍无论是分布式架构,还是微服务架构,服务之间如何高效、可靠性的通信是具备肯定的挑战性的;那么,解决方案之一就是应用RPC通信;而由google开发的grpc-go是一个高性能、开源和通用的RPC框架,面向挪动和HTTP2设计。在波及到网络通信的畛域内,常常能够看到grpc-go的身影;目前,曾经在Kubernetes、Docker、Istio等优良开源框架中广泛应用;因而,有必要对grpc-go的外围原理进行深刻理解,以便可能更好的为微服务架构,分布式架构提供平安、高效、牢靠的网络通信服务。 2、专栏解读:本专栏十分具体的介绍了grpc-go的源码,编写了近100篇文章来帮忙大家理解每个性能的外围原理; 浏览本专栏不仅能够理解到grpc-go的外围原理;如,如何建设rpc连贯,rpc申请,滑动窗口(流量管制)原理,如何自定义平衡器,解析器,重试机制,加密,认证,如何让grpc-go反对lz4算法等等;如何基于wireshark进行抓包剖析; 还能够从grpc-go源码中学到很多技巧:如,grpc-go框架是如何应用事件机制的,如何应用上下文的?如何比拟两个数的大小?当某个步骤失败时如何对本步骤以及后面的步骤实现重试机制等等,对go语言的进步有很大的帮忙; 本专栏最大的目标,心愿您学完之后,该技术可能成为您的技术亮点;比方,在求职简历上能够表明熟读grpc-go源码,具备二次开发grpc-go源码的能力;通过本人的致力后,甚至能够称为grpc-go框架的源码贡献者;也是证实你go语言程度的一种能力;心愿这一项技术可能称为您简历上的亮点之一。 3、专栏次要分为以下几个模块3.1.模块1:grpc客户端是如何向grpc服务器端建设起rpc连贯的本模块次要介绍rpc链接建设阶段所波及到的内容;次要波及到的内容: grpc客户端跟grpc服务器端整个交互过程次要经验过那些阶段;如何建设起的tcp链接?如果rpc链接失败后,grpc客户端是否尝试重试链接,每次连贯的间隔时间是如何设置的;等等 3.2.模块2:解析器原理以及实际介绍本模块介绍解析器相干原理;次要波及到的内容: 解析器是用来做什么的?如何实现一个解析器,如何注册一个解析器?对grpc框架内置的解析器介绍?如何应用consul来自定义解析器; 3.3.模块3:平衡器原理以及实际介绍本模块介绍平衡器相干原理;次要波及到的内容: 平衡器次要实现什么性能?客户端如何指定应用哪个平衡器呢?如何实现、注册、创立平衡器?pickFirst平衡器介绍、round_robin平衡器介绍、grpc+LoadBalancer平衡器介绍、grpc+nginx平衡器介绍、grpc+consul自定义解析器介绍等等; 3.4.模块4:grpc客户端是如何向grpc服务器端发动rpc申请的以及解决流程本模块介绍的原理以及流程:是在rpc建设连贯根底之上的;也就是rpc连贯建设后,客户端如何调用本地办法,服务器端如何接管申请,执行申请,反馈执行后果给客户端。次要波及到的内容: 在rpc申请阶段,次要经验了哪些过程;在客户端一侧,什么场景下,会触发流的创立?客户端是如何将申请服务的名称,办法名称等信息告诉服务器端的?以及如何将申请办法的参数值发送给服务器端的?客户端一侧,接管服务器端反馈执行后果的流程?grpc服务器端一侧,解决客户端的整体流程?grpc服务器端对客户端的每次tcp申请,是单协程解决,还是多协程解决?等等; 3.5.模块5:帧接管原理介绍本模块介绍帧接收器相干原理;每次客户端跟服务器端建设rpc连贯后,就会创立各自的帧接收器,专门用来接管对方发送的帧;次要内容波及到: grpc客户端帧接收器的原理介绍;grpc客户端帧接收器是如何解决不同的帧的?grpc服务器端帧接收器的原理介绍;服务器端接管到客户端的头帧后,如何解决?等等 3.6.模块6:帧发送器原理介绍本模块介绍帧发送器相干原理;每次客户端跟服务器端建设rpc连贯后,就会创立各自的帧发送器,专门用来将各种类型的帧发送给对方;客户端跟服务器端的帧发送器原理是一样的。次要内容波及到: 帧发送器的整体流程介绍;如何将帧数据再内存里进行存储和读取?在同一个过程里如何应用告诉的形式生产数据帧?帧发送器解决帧时有什么特点?帧发送器的根本流程介绍?为什么源码作者将帧发送器的代码如何设计?客户端一侧,头帧的整体解决流程介绍?等等 3.7.模块7:滑动窗口(流量管制)本模块次要介绍grpc服务器端在接管客户端发送的数据帧时,是如何动态控制客户端发送的数据帧大小的;也能够称之为流量管制。波及到的内容: 滑动窗口的整体流程介绍;帧发送器是如何将数据帧发送给服务器端的;在服务器端一侧,帧接收器是如何将接管到的数据帧存储到本地的?数据帧缓存到recvBuffer前的流控?从recvBuffer里读取数据时,如何调整流控指标?服务器端在真正执行客户端的申请办法时,是如何残缺的读取到申请参数值的?如何计算本次发送的数据帧的大小?服务器端发送的设置帧、窗口更新帧是如何影响客户端的帧大小的?基于wireshark对grpc进行抓包剖析:如何配置wireshark可能抓取grpc包,多场景抓包测试用例剖析;等等 3.8.模块8:勾销性能cancellation本模块对grpc框架中的勾销性能cancellation进行介绍;波及到的内容: 勾销cancellation性能的基本原理介绍;勾销性能实现什么成果?客户端一侧,是如何解决勾销性能的?服务器端一侧,是如何解决勾销性能的?等等 3.9.模块9:截止工夫deadline本模块对grpc框架中的截止工夫Deadline进行介绍;波及到的内容: 截止工夫deadline跟勾销性能cancellation的区别?截止工夫能够产生在哪些阶段?客户端一侧,如何配置启动截止工夫?客户端一侧,当截止工夫产生在不同的阶段,每个阶段是如何解决的?服务器端一侧,是如何解决截止工夫的?等等 3.10.模块10:衰弱检测health本模块对grpc框架中的衰弱检测HealthChecking进行介绍;波及到的内容: 客户端是如何断定服务器端的服务的衰弱状态的?衰弱检测原理的整体流程图介绍;客户端的链接状态时如何更新为Ready状态的?客户端如何判断服务器端的服务可能失常提供服务呢?服务器端衰弱检测Watcher的核心思想?衰弱检测运行时场景的异样场景解决?等等 3.11.模块11:拦截器interceptor本模块对grpc框架中的拦截器interceptor原理进行介绍;波及到的内容: 拦截器的分类;客户端如何应用拦截器;服务器端如何应用拦截器;服务器端何时触发拦截器流程?客户端何时触发拦截器流程?拦截器的调度策略,即拦截器的执行过程?等等 3.12.模块12:放弃链接keepalive本模块对grpc框架中的放弃链接keepalive原理进行介绍;波及到的内容: 放弃链接跟衰弱检测的区别?服务器端keepalive的原理图?服务器端何时触发keepalive性能的启动?当链接处于不同状态时,服务器端如何解决链接?客户端一侧keepalive的原理图?服务器端跟客户端交互解决goAway帧的流程图;等等 3.13.模块13:多路复用multiplex本模块对grpc框架中多路复用multiplex原理进行介绍;波及到的内容: grpc采矿机是如何实现多路复用的;实现多路复用的基本思路?grpc框架中,服务器端是如何辨别不同的服务申请的?一个服务器申请,可能存在多个http2数据帧,服务器端是如何存储不同服务申请的http2数据帧的?如何按顺序存储?如何按程序读取数据帧呢?等等 3.14.模块14:压缩个性compression本模块对grpc框架中压缩个性compression原理进行介绍;波及到的内容: grpc框架是如何反对不同的压缩算法的?如何启动压缩个性?如何注册一个压缩算法?客户端一侧,压缩解决数据的原理?服务器端一侧,压缩解决数据的原理?在客户端一侧,发送数据阶段,压缩器压缩数据的解决流程?在服务器端一侧,如何获取客户端采纳的压缩算法呢?如何解压数据?如何让grpc框架反对lz4压缩算法呢?等等 3.15.模块15:重试机制retry本模块对grpc框架中的重试机制retry原理进行介绍;波及到的内容: 在grpc框架中什么场景下应用了重试机制?客户端一侧,如何启动、禁止重试机制性能?如何定义、应用重试策略呢?grpc框架中,实现重试机制的主体思路?重试机制withRetry实现形式的特点?客户端是如何判断是不是容许重试呢?如果某个阶段失败了,客户端如何重试前几步的操作呢?等等 3.16.模块16:元数据metadata本模块对grpc框架中的元数据metadata原理进行介绍;波及到的内容: 客户端一侧,如何创立元数据?如何应用创立的元数据?如何将元数据信息存储到上下文中的呢?服务器端一侧,是如何接管元数据的?如何让服务端提供的服务中有能力应用元数据;等等 3.17.模块17:加密encryption本模块对grpc框架中加密encryption原理进行介绍;波及到的内容: grpc框架反对哪几种加密?基于tls证书加密的测试用例介绍?基于ca的tls证书加密测试用例介绍?链路建设阶段时的tls加密原理介绍:客户端一侧,加密原理介绍?服务器端加密原理介绍,介绍时配合wireshark抓包剖析;如何配置wireshark可能抓取tls包?整体握手过程原理介绍;数据帧发送阶段的tls加密介绍;如何应用在tls链路建设阶段单方协商好的数据作为加密数据的?应用协商好的加密数据开始对数据帧进行加密?等等 3.18.模块18:认证authentication本模块对grpc框架中的认证authentication原理进行介绍;波及到的内容: 如何了解认证?grpc+oauth2.Token认证形式介绍:如何配置认证?认证性能属于链路级别性能,还是属于流级别性能?服务器端一侧是如何获取认证信息的?如何来验证认证信息的?grpc+自定义认证形式介绍;grpc+Basic认证形式介绍:basic认证形式介绍;模仿Basic认证测试用例介绍;grpc+jwt认证形式介绍:jwt认证介绍;jwt-grpc-go认证测试用例介绍;客户端向服务器端发动受权码申请?如何具体校验jwt?如何生成jwt?等等 4、合适人群go语言研发工程师、go语言爱好者微服务研发工程师kubernetes开发工程师docker开发工程师中间件研发工程师计算机相关业余的大学生、研究生对grpc-go感兴趣的爱好者等

May 13, 2021 · 1 min · jiezi

关于grpc:grpc通过-etcd-实现服务发现与注册源码分析

介绍上面介绍 jupiter-0.2.7 版本中 grpc 通过 etcd 实现服务发现与注册。 服务发现与注册的实现解析服务注册服务注册的流程图: etcd的服务注册代码模块在 jupiter/pkg/registry/etcdv3 中。 上面让咱们来看看理论的代码 // Registry register/unregister service// registry impl should control rpc timeouttype Registry interface { RegisterService(context.Context, *server.ServiceInfo) error UnregisterService(context.Context, *server.ServiceInfo) error ListServices(context.Context, string, string) ([]*server.ServiceInfo, error) WatchServices(context.Context, string, string) (chan Endpoints, error) io.Closer}在 pkg/registry/registry.go 中定义了注册服务对象的接口。不同的服务只有实现了这些接口,jupiter 就能应用。 首先咱们来看看注册办法 // RegisterService register service to registryfunc (reg *etcdv3Registry) RegisterService(ctx context.Context, info *server.ServiceInfo) error { err := reg.registerBiz(ctx, info) ...}// 业务信息注册func (reg *etcdv3Registry) registerBiz(ctx context.Context, info *server.ServiceInfo) error { ... // 提交信息到 etcd _, err := reg.client.Put(readCtx, key, val, opOptions...) ...}这里次要的局部是 reg.client.Put()  将服务信息提交到 etcd 中。其中的租约机制我会在之后独自写一篇文章介绍。这里次要还是关注如何注册。源码中还有个 registerMetric() 办法,这个办法的目标是将服务信息在提交到etcd的 prometheus 前缀目录下,用于服务监控,用的也是 client.Put() 办法。这里具体就不展现代码了,感兴趣的同学能够去源码库中查看。 ...

December 5, 2020 · 3 min · jiezi

关于grpc:grpcnode-源码阅读笔记0

简略介绍 gRPC贴一张挂在官网的图片:https://grpc.io/docs/what-is-... 能够了解 gRPC 是 RPC(近程过程调用)框架的一种实现,对于 RPC 的介绍因为并不是本次的主题,所以放个链接来帮忙大家了解:https://www.zhihu.com/questio... 我所了解 RPC 整个执行的过程就是 Client 调用办法 -> 序列化申请参数 -> 传输数据 -> 反序列化申请参数 -> Server 解决申请 -> 序列化返回数据 -> 传输数据 -> Client 接管到办法返回值: 其次要逻辑会集中在 数据的序列化/反序列化 以及 数据的传输上,而这两项 gRPC 别离选用了 Protocol Buffers 和 HTTP2 来作为默认选项。 gRPC 在 Node.js 的实现gRPC 在 Node.js 的实现上一共有两个官网版本,一个是基于 c++ addon 的版本,另一个是纯 JS 实现的版本。 gRPC 在 Node.js 中相干的模块除了上边提到的两个 gRPC 的实现,在 Node.js 中还存在一些其余的模块用来辅助应用 gRPC。 grpc-tools 这个是每个语言都会用的,用来依据 proto 文件生成对应,插件提供了 Node.js 语言的实现proto-loader 用来动静加载 proto 文件,不须要应用 grpc_tools 提前生成代码(性能比上边的形式稍差)这次笔记次要是针对 grpc-node 形式的实现,在 c++ addon 模块的实现下,并不是一个 gRPC 的残缺实现,做的事件更多的是一个连接的工作,通过 JS、c++ 两层封装将 c++ 版本的 gRPC 能力裸露进去供用户应用。 ...

December 1, 2020 · 7 min · jiezi