Bootstrap

gRPC简介

Grpc简介

  1. gRPC是一项进程间通信技术,可以用来连接、调用、操作和调试分布式异构应用程序。

  2. 在开发gRPC应用程序时,先要定义服务接口,其中应包含

    • 消费者消费服务的方式

    • 消费者能够远程调用的方法

    • 调用这些方法所使用的参数和消息格式等

  3. 在服务定义中所使用的语言叫作接口定义语言(interface definition language,IDL)。服务定义

    • 可以生成服务器端代码,也就是服务器端骨架,它通过提供低层级的通信抽象简化了服务器端的逻辑。
    • 可以生成客户端代码,也就是客户端存根,它使用抽象简化了客户端的通信,为不同的编程语言隐藏了低层级的通信
  4. 基于gPRC的生产者和消费者
    在这里插入图片描述

  5. 当调用gRPC服务时,客户端的gRPC库会使用protocol buffers,并将RPC的请求编排(marshal)为protocol buffers格式,然后将其通过HTTP/2进行发送。在服务器端,请求会被解排(unmarshal),对应的过程调用会使用protocol buffers来执行。

  6. gPRC劣势

    • 不太适合面向外部的服务。gRPC服务具有契约驱动、强类型的特点,会限制向外部暴露的服务的灵活性,同时消费者的控制权会削弱很多
    • 巨大的服务定义变更是复杂的开发流程。如果出现巨大的gRPC服务定义变更,通常需要重新生成客户端代码和服务器端代码。
    • gRPC生态系统相对较小

开发案例

定义服务接口

  1. 创建接口模块grpc-demo:grpc-apigrpc的版本一定要与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'
    }
    
    
  2. 使用Protocol

;