マイクロサービスアーキテクチャ学習ノート(一):gRPC Spring Boot Starter 2.2.0リリース、および使用手順
10804 ワード
概要
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 を使用できます.
####バージョン
注意:このアイテムはSpring-Bootなしでも使用できますが、手動bean構成が必要です.
使用方法
gRPC server + client
Mavenを使用している場合は、次の依存関係を追加します.
使用するGradleの場合は、次の依存を追加します.
gRPCサービス
Mavenを使用している場合は、次の依存関係を追加します.
使用するGradleの場合は、次の依存を追加します.
gRPCサーバのビジネスロジックを実装し、@GrpcService注記を使用
gRPCのhostとportを設定し、デフォルトのリスニングのhostは0.0.0.0、デフォルトのportは9090です.その他の構成プロパティはsettingsを参照できます.すべてのプロファイルはgrpc.server.を追加するプレフィックスをserverで使用します.
Propertiesの例
Spring-securityを使用してあなたのgRPCアプリケーションを暗号化することをサポートします.Spring-security(coreまたはconfig)依存を追加し、必要に応じて暗号化の構成を追加するだけです.
まず、認証スキームを選択する必要があります.
BasicAuth(基礎認証)
Certificate Authentication(証明書認証)
関連する構成プロパティは次のとおりです. CommositeGrpcAuthenticationReaderクラスチェーンを使用した複数の認証スキームの呼び出し カスタム認証方式(GrpcAuthenticationReaderクラスを継承し実現) そしてあなたのサービスを守るなら Spring-securityを使用した注釈
手動設定
gRPCクライアント
Mavenを使用している場合は、次の依存関係を追加します.
使用するGradleの場合は、次の依存を追加します.
ここでは3つの方法でgRPC serverの接続を取得します. grpcChannelFactory.createChannel(serverName)を使用してChannelを作成し、独自のgRPC stub. を作成します.チャネルタイプのフィールドに@GrpcClient(serverName)注記を追加し、独自のgRPC stub. を作成します.
@Autowiredまたは@Injectを使用して注入する必要はありません@GrpcClient(serverName)注釈を自分のstubに直接追加します @Autowiredまたは@Injectを使用して注入する必要はありません
注意:ブロックが異なる場合を除き、複数のchannelsと複数の異なるstubsに対して同じserverNameを使用できます.
次に、サービス側に直接要求することができます.は、クライアントごとに対応する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の例
クライアント認証
クライアント認証にはさまざまな方法がありますが、現在は一部しかサポートされていません.サポートリストは次のとおりです. BasicAuth
ClientInterceptorを用いる(他の認証メカニズムは同様に実現できる).
すべてのクライアントに同じ認証を設定
クライアントごとに異なる認証を使用
いくつかの構成プロパティが必要です.
grpc-netty-shadedの使用
このライブラリはgrpc-netty-shadedライブラリもサポートしています
注意:shaded nettyがclasspathにすでに存在する場合は、このライブラリが優先的に使用されます.
Mavenを使用する場合は、次の構成を使用できます.
Gradleを使用する場合は、次の構成を使用できます.
サンプルアイテム
GitHubアドレス:https://github.com/yidongnan/grpc-spring-boot-starter
もっと素晴らしい内容は「IT実戦連盟」の公式アカウントに注目できますよ~~~
gRPC Spring Boot Starterプロジェクトは、gRPCのSpring Bootモジュールです.Spring Bootに1つのgRPC Serverを内蔵して対外的にサービスを提供し、Spring Cloudのサービス発見、登録、リンク追跡などをサポートします.
コンテンツの更新
2.2.0.RELEASEバージョンには、次の重大な更新が含まれています.
gRPC使用
特長
####バージョン
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
@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の接続を取得します.
@Autowired
private GrpcChannelFactory grpcChannelFactory;
private GreeterGrpc.GreeterBlockingStub greeterStub;
@PostConstruct
public void init() {
Channel channel = grpcChannelFactory.createChannel("gRPC server name");
greeterStub = GreeterGrpc.newBlockingStub(channel);
}
@Autowiredまたは@Injectを使用して注入する必要はありません
@GrpcClient("gRPC server name")
private Channel channel;
private GreeterGrpc.GreeterBlockingStub greeterStub;
@PostConstruct
public void init() {
greeterStub = GreeterGrpc.newBlockingStub(channel);
}
@GrpcClient("gRPC server name")
private GreeterGrpc.GreeterBlockingStub greeterStub;
注意:ブロックが異なる場合を除き、複数のchannelsと複数の異なるstubsに対して同じserverNameを使用できます.
次に、サービス側に直接要求することができます.
HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName(name).build());
複数のターゲット・アドレスを構成することもでき、要求時に自動的に負荷分散を使用します.
Propertiesの例
grpc.client.(gRPC server name).address=static://localhost:9090
# Or
grpc.client.myName.address=static://localhost:9090
クライアント認証
クライアント認証にはさまざまな方法がありますが、現在は一部しかサポートされていません.サポートリストは次のとおりです.
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実戦連盟」の公式アカウントに注目できますよ~~~