マイクロサービスアーキテクチャ学習ノート(一):gRPC Spring Boot Starter 2.2.0リリース、および使用手順


概要
gRPC Spring Boot Starterプロジェクトは、gRPCのSpring Bootモジュールです.Spring Bootに1つのgRPC Serverを内蔵して対外的にサービスを提供し、Spring Cloudのサービス発見、登録、リンク追跡などをサポートします.
コンテンツの更新
2.2.0.RELEASEバージョンには、次の重大な更新が含まれています.
  • Java 11
  • をサポート
  • Spring Securityによる認証承認
  • をサポート
  • は、カスタムコーデック
  • をサポートする.
  • はmetric情報の自動収集と報告をサポートする
  • /infoは、現在バインドされているポートおよび対応するgRPCサービス
  • を示す.
  • shaded net
  • をサポート
  • より多くのNameResolver
  • をサポート
    gRPC使用
    特長
  • @GrpcServiceを使用して、spring-bootアプリケーションに組み込まれたgRPCサービスを自動的に作成し、実行します.
  • @GrpcClientを使用して、channelとstub
  • を自動的に作成し、管理します.
  • Spring Cloud(ConsulまたはEurekaにサービスを登録し、gRPCサーバ情報を取得する)
  • をサポート
  • Spring Sleuthによるリンク追跡をサポート
  • は、server、clientに対してグローバルブロッキングまたは単一のブロッキング
  • をそれぞれ設定ことをサポートする.
  • Spring-security
  • をサポート
  • はmetric(micrometer/actuator)
  • をサポートする
  • grpc-netty-shaded
  • を使用できます.
    ####バージョン
    2.x.x.RELEASE    Spring Boot 2 & Spring Cloud Finchley。
    
         :2.2.0.RELEASE
    
    1.x.x.RELEASE    Spring Boot 1 & Spring Cloud Edgware 、Dalston、Camden。
    
         :1.4.1.RELEASE
    

    注意:このアイテムはSpring-Bootなしでも使用できますが、手動bean構成が必要です.
    使用方法
    gRPC server + client
    Mavenを使用している場合は、次の依存関係を追加します.
    
      net.devh
      grpc-spring-boot-starter
      2.2.0.RELEASE
    
    

    使用するGradleの場合は、次の依存を追加します.
    dependencies {
      compile 'net.devh:grpc-spring-boot-starter:2.2.0.RELEASE'
    }
    

    gRPCサービス
    Mavenを使用している場合は、次の依存関係を追加します.
    
      net.devh
      grpc-server-spring-boot-starter
      2.2.0.RELEASE
    
    

    使用するGradleの場合は、次の依存を追加します.
    dependencies {
      compile 'net.devh:grpc-server-spring-boot-starter:2.2.0.RELEASE'
    }
    

    gRPCサーバのビジネスロジックを実装し、@GrpcService注記を使用
    @GrpcService
    public class GrpcServerService extends GreeterGrpc.GreeterImplBase {
    
        @Override
        public void sayHello(HelloRequest req, StreamObserver responseObserver) {
            HelloReply reply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
            responseObserver.onNext(reply);
            responseObserver.onCompleted();
        }
    }
    

    gRPCのhostとportを設定し、デフォルトのリスニングのhostは0.0.0.0、デフォルトのportは9090です.その他の構成プロパティはsettingsを参照できます.すべてのプロファイルはgrpc.server.を追加するプレフィックスをserverで使用します.
    Propertiesの例
    grpc.server.port=9090
    grpc.server.address=0.0.0.0
    Server-Security
    

    Spring-securityを使用してあなたのgRPCアプリケーションを暗号化することをサポートします.Spring-security(coreまたはconfig)依存を追加し、必要に応じて暗号化の構成を追加するだけです.
    まず、認証スキームを選択する必要があります.
    BasicAuth(基礎認証)
    @Bean
    AuthenticationManager authenticationManager() {
        final List providers = new ArrayList<>();
        providers.add(...); // Possibly DaoAuthenticationProvider
        return new ProviderManager(providers);
    }
    
    @Bean
    GrpcAuthenticationReader authenticationReader() {
        final List readers = new ArrayList<>();
        readers.add(new BasicGrpcAuthenticationReader());
        return new CompositeGrpcAuthenticationReader(readers);
    }
    

    Certificate Authentication(証明書認証)
    @Bean
    AuthenticationManager authenticationManager() {
        final List providers = new ArrayList<>();
        providers.add(new X509CertificateAuthenticationProvider(userDetailsService()));
        return new ProviderManager(providers);
    }
    
    @Bean
    GrpcAuthenticationReader authenticationReader() {
        final List readers = new ArrayList<>();
        readers.add(new SSLContextGrpcAuthenticationReader());
        return new CompositeGrpcAuthenticationReader(readers);
    }
    

    関連する構成プロパティは次のとおりです.
    grpc.server.security.enabled=true
    grpc.server.security.certificateChainPath=certificates/server.crt
    grpc.server.security.privateKeyPath=certificates/server.key
    grpc.server.security.trustCertCollectionPath=certificates/trusted-clients-collection
    grpc.server.security.clientAuth=REQUIRE
    
    
  • CommositeGrpcAuthenticationReaderクラスチェーンを使用した複数の認証スキームの呼び出し
  • カスタム認証方式(GrpcAuthenticationReaderクラスを継承し実現)
  • そしてあなたのサービスを守るなら
  • Spring-securityを使用した注釈
  • @Configuration
    @EnableGlobalMethodSecurity(proxyTargetClass = true, ...)
    public class SecurityConfiguration {
           Spring Security        ,proxyTargetClass       !           ,   MyServiceImpl#bindService()      final      。           ,      ,     。
    

    手動設定
    @Bean
    AccessDecisionManager accessDecisionManager() {
        final List> voters = new ArrayList<>();
        voters.add(new AccessPredicateVoter());
        return new UnanimousBased(voters);
    }
    
    @Bean
    GrpcSecurityMetadataSource grpcSecurityMetadataSource() {
        final ManualGrpcSecurityMetadataSource source = new ManualGrpcSecurityMetadataSource();
        source.set(MyServiceGrpc.getSecureMethod(), AccessPredicate.hasRole("ROLE_USER"));
        source.setDefault(AccessPredicate.permitAll());
        return source;
    }
    

    gRPCクライアント
    Mavenを使用している場合は、次の依存関係を追加します.
    
      net.devh
      grpc-client-spring-boot-starter
      2.2.0.RELEASE
    
    

    使用するGradleの場合は、次の依存を追加します.
    dependencies {
      compile 'net.devh:grpc-client-spring-boot-starter:2.2.0.RELEASE'
    }
    
    

    ここでは3つの方法でgRPC serverの接続を取得します.
  • grpcChannelFactory.createChannel(serverName)を使用してChannelを作成し、独自のgRPC stub.
  • を作成します.
    @Autowired
    private GrpcChannelFactory grpcChannelFactory;
    
    private GreeterGrpc.GreeterBlockingStub greeterStub;
    
    @PostConstruct
    public void init() {
        Channel channel = grpcChannelFactory.createChannel("gRPC server name");
        greeterStub = GreeterGrpc.newBlockingStub(channel);
    }
    
  • チャネルタイプのフィールドに@GrpcClient(serverName)注記を追加し、独自のgRPC stub.
  • を作成します.
    @Autowiredまたは@Injectを使用して注入する必要はありません
    @GrpcClient("gRPC server name")
    private Channel channel;
    
    private GreeterGrpc.GreeterBlockingStub greeterStub;
    
    @PostConstruct
    public void init() {
        greeterStub = GreeterGrpc.newBlockingStub(channel);
    }
    
  • @GrpcClient(serverName)注釈を自分のstubに直接追加します
  • @Autowiredまたは@Injectを使用して注入する必要はありません
    @GrpcClient("gRPC server name")
    private GreeterGrpc.GreeterBlockingStub greeterStub;
    

    注意:ブロックが異なる場合を除き、複数のchannelsと複数の異なるstubsに対して同じserverNameを使用できます.
    次に、サービス側に直接要求することができます.
    HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName(name).build());
    
  • は、クライアントごとに対応するaddressを個別に構成できますが、場合によってはデフォルトの構成を調整できます.NameResolver.Factory beansを使用してデフォルトのurlマッピングをカスタマイズできます.このbeanを構成していない場合は、次の方法で解析します.
  • DiscoveryClientのbeanが存在する場合、client nameを使用して登録センターで対応するサービスを取得するaddress
  • が使用される.
  • そうでない場合、client側はlocalhostと9090ポートの他の構成属性をsettingsを参照し、すべての構成ファイルはclient側で使用する際にgrpc.client.(serverName)のプレフィックス
  • を追加する必要がある.
    複数のターゲット・アドレスを構成することもでき、要求時に自動的に負荷分散を使用します.
  • static://127.0.0.1:9090,[::1]:9090ターゲットアドレス(DiscoveryClient beanが必要)
  • を取得するには、サービス発見を使用することもできます.
  • discovery:///my-service-name さらに、DNSを使用してターゲットアドレス
  • を取得することもできます.
  • dns:///example.com

  • Propertiesの例
    grpc.client.(gRPC server name).address=static://localhost:9090
    # Or
    grpc.client.myName.address=static://localhost:9090
    

    クライアント認証
    クライアント認証にはさまざまな方法がありますが、現在は一部しかサポートされていません.サポートリストは次のとおりです.
  • BasicAuth

  • ClientInterceptorを用いる(他の認証メカニズムは同様に実現できる).
    @Bean
    ClientInterceptor basicAuthInterceptor() {
        return AuthenticatingClientInterceptors.basicAuth(username, password);
    }
    

    すべてのクライアントに同じ認証を設定
    @Bean
    public GlobalClientInterceptorConfigurer basicAuthInterceptorConfigurer() {
        return registry -> registry.addClientInterceptors(basicAuthInterceptor());
    }
    

    クライアントごとに異なる認証を使用
    @GrpcClient(value = "myClient", interceptorNames = "basicAuthInterceptor")
    private MyServiceStub myServiceStub;
    Certificate Authentication
    

    いくつかの構成プロパティが必要です.
    #grpc.client.test.security.authorityOverride=localhost
    #grpc.client.test.security.trustCertCollectionPath=certificates/trusted-servers-collection
    grpc.client.test.security.clientAuthEnabled=true
    grpc.client.test.security.certificateChainPath=certificates/client.crt
    grpc.client.test.security.privateKeyPath=certificates/client.key
    

    grpc-netty-shadedの使用
    このライブラリはgrpc-netty-shadedライブラリもサポートしています
    注意:shaded nettyがclasspathにすでに存在する場合は、このライブラリが優先的に使用されます.
    Mavenを使用する場合は、次の構成を使用できます.
    
        io.grpc
        grpc-netty-shaded
        ${grpcVersion}
    
    
    
    
        net.devh
        grpc-spring-boot-starter
        ...
        
            
                io.grpc
                grpc-netty
            
        
    
    
    
        net.devh
        grpc-server-spring-boot-starter
        ...
        
            
                io.grpc
                grpc-netty
            
        
    
    
    
        net.devh
        grpc-client-spring-boot-starter
        ...
        
            
                io.grpc
                grpc-netty
            
        
    
    

    Gradleを使用する場合は、次の構成を使用できます.
    compile "io.grpc:grpc-netty-shaded:${grpcVersion}"
    
    compile 'net.devh:grpc-spring-boot-starter:...' exclude group: 'io.grpc', module: 'grpc-netty' // For both
    compile 'net.devh:grpc-client-spring-boot-starter:...' exclude group: 'io.grpc', module: 'grpc-netty' // For the client
    compile 'net.devh:grpc-server-spring-boot-starter:...' exclude group: 'io.grpc', module: 'grpc-netty' // For the server
    

    サンプルアイテム
    GitHubアドレス:https://github.com/yidongnan/grpc-spring-boot-starter
    もっと素晴らしい内容は「IT実戦連盟」の公式アカウントに注目できますよ~~~