Grpc简介
-
gRPC是一项进程间通信技术,可以用来连接、调用、操作和调试分布式异构应用程序。
-
在开发gRPC应用程序时,先要定义服务接口,其中应包含
-
消费者消费服务的方式
-
消费者能够远程调用的方法
-
调用这些方法所使用的参数和消息格式等
-
-
在服务定义中所使用的语言叫作接口定义语言(interface definition language,IDL)。服务定义
- 可以生成服务器端代码,也就是服务器端骨架,它通过提供低层级的通信抽象简化了服务器端的逻辑。
- 可以生成客户端代码,也就是客户端存根,它使用抽象简化了客户端的通信,为不同的编程语言隐藏了低层级的通信
-
基于gPRC的生产者和消费者
-
当调用gRPC服务时,客户端的gRPC库会使用protocol buffers,并将RPC的请求编排(marshal)为protocol buffers格式,然后将其通过HTTP/2进行发送。在服务器端,请求会被解排(unmarshal),对应的过程调用会使用protocol buffers来执行。
-
gPRC劣势
- 不太适合面向外部的服务。gRPC服务具有契约驱动、强类型的特点,会限制向外部暴露的服务的灵活性,同时消费者的控制权会削弱很多
- 巨大的服务定义变更是复杂的开发流程。如果出现巨大的gRPC服务定义变更,通常需要重新生成客户端代码和服务器端代码。
- gRPC生态系统相对较小
开发案例
定义服务接口
-
创建接口模块
grpc-demo:grpc-api
。 grpc的版本一定要与protobuf匹配apply plugin: "io.spring.dependency-management" dependencyManagement { imports { mavenBom "io.grpc:grpc-bom:1.43.0" } } //==============protobuf配置================ sourceSets { main { proto { srcDir 'src/main/proto' } } test { proto { srcDir 'src/test/proto' } } } protobuf { protoc { //从仓库下载 artifact = 'com.google.protobuf:protoc:3.19.1' //生成代码的目录 generatedFilesBaseDir = "$projectDir/src/" plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:1.43.0" } } generateProtoTasks { //protobuf源码输出目录 all().each { task -> task.builtins { java { outputSubDir = 'grpc' } } } //grpc源码输出目录 all()*.plugins { grpc { outputSubDir = 'grpc' } } } } } //==============protobuf配置================ //在build之前执行proto代码生成 build.dependsOn(":grpc-demo:grpc-api:generateProto") clean { delete protobuf.generatedFilesBaseDir + "/main/grpc" } dependencies { compile 'com.google.protobuf:protobuf-java-util:3.19.1' compile 'com.google.protobuf:protobuf-java:3.19.1' compile 'io.grpc:grpc-stub' compile 'io.grpc:grpc-protobuf' }
-
使用Protocol