天天看點

基于grpc從零開始搭建一個準生産分布式應用(4) - 05 - springGrpc架構

開始前必讀:​基于grpc從零開始搭建一個準生産分布式應用(0) - quickStart​​ 

springGrpc架構是一個開源項目,大家可以在網上下載下傳。本章開始詳細說下相關的内容。這裡不講其內建等,隻把重要内容描述下。

一、概念

  1. Channel: Channel 是單個服務端的連接配接池。 目标伺服器可能是多個 gRPC 服務。
  2. ManagedChannel: ManagedChannel 是 Channel 的一種特殊變體,因為它允許對連接配接池進行管理操作,例如将其關閉。
  3. ClientInterceptor: 在每個 Channel 處理之前攔截它們。 可以用于日志、監測、中繼資料處理和請求/響應的重寫。 grpc-spring-boot-starter 将自動接收所有帶有 @GrpcGlobalClientInterceptor 注解以及手動注冊在GlobalClientInterceptorRegistry 上的客戶攔截器。
  4. CallCredentials: 管理身份驗證的元件。 它可以用于存儲憑據和會話令牌。 它還可以用來身份驗證,并且使用傳回的令牌(例如 OAuth )來授權實際請求。 除此之外,如果令牌過期并且重新發送請求,它可以續簽令牌。 如果您的應用程式上下文中隻存在一個 CallCredentials bean,那麼 spring 将會自動将其附加到Stub( 非 Channel )。 CallCredentialsHelper工具類可以幫助您建立常用的 CallCredentials 類型和相關的StubTransformer。
  5. StubTransformer: 所有用戶端的 Stub 的注入之前應用的轉換器。
  6. @GrpcClient: 這個注解用在你需要注入用戶端的字段或者 set 方法上。 支援 Channel和各種類型的 Stub。 請不要将 @GrpcClient 與 @Autowireed 或 @Inject 一起使用。

二、架構配置

2.1、個性化配置

Channels 的屬性都是以 grpc.server.. 或 grpc.client..security. 為字首

服務端配置,在下面這個類所在的package中GrpcServerProperties.java
@ConfigurationProperties("grpc.server")
public class GrpcServerProperties {}
可以yam檔案中通過以下來配置,詳細看上面源碼
grpc:
  server:
    port: 9898

用戶端配置,在下面這個類所在的package中GrpcChannelsProperties.java      
@Bean
public GrpcServerConfigurer keepAliveServerConfigurer() {
    return serverBuilder -> {
        if (serverBuilder instanceof NettyServerBuilder) {
            ((NettyServerBuilder) serverBuilder)
                    .keepAliveTime(30, TimeUnit.SECONDS)
                    .keepAliveTimeout(5, TimeUnit.SECONDS)
                    .permitKeepAliveWithoutCalls(true);
        }
    };
}
gRPC 服務端配置器允許您将自定義配置添加到 gRPC 的 ServerBuilder      

2.2、本地調用

啟用 InProcessServer
有時,您可能想要在自己的應用程式中調用自己的 grpc 服務。 您可以像調用其他任何 gRPC 服務端一樣,您需要使用 grpc 的 InProcessServer 來節省網絡間開銷。
您可以使用以下屬性将其打開:
grpc.server.in-process-name=<SomeName>
# Optional: Turn off the external grpc-server
#grpc.server.port=-1

這允許用戶端在同一應用程式内使用以下配置連接配接到伺服器:
grpc.client.inProcess.address=in-process:<SomeName>

這對測試特别有用,因為他們不需要打開特定的端口,是以可以并發運作(在建構 伺服器上)。      

三、運作名額統計

3.1、配置

3.1.1、依賴項

名額收集和其他執行器一樣都是可選的,如果應用程式環境中有 MeterRegistry ,它們将自動啟用。您可以簡單地通過向Maven添加以下依賴來實作這一點:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>      

3.1.2、關閉名額功能

您可以選擇退出自動配置,使用以下注解:
@EnableAutoConfiguration(exclude = {GrpcClientMetricAutoConfiguration.class, GrpcServerMetricAutoConfiguration.class})

或使用配置:
spring.autoconfigure.exclude=\
net.devh.boot.grpc.client.autoconfigure.GrpcClientMetricAutoConfiguration,\
net.devh.boot.grpc.server.autoconfigure.GrpcServerMetricAutoConfiguration      

3.1.3、名額配置

預設情況下,用戶端隻會為已進行的請求建立名額。 然而,服務端将嘗試所有找到并注冊的服務,來初始化它們的名額。您可以通過覆寫Bean的建立自定義的行為。 下面使用MetricCollectingClientInterceptor來展示這一點:

@Bean
MetricCollectingClientInterceptor metricCollectingClientInterceptor(MeterRegistry registry) {
    MetricCollectingClientInterceptor collector = new MetricCollectingClientInterceptor(registry,
            counter -> counter.tag("app", "myApp"), // Customize the Counters
            timer -> timer.tag("app", "myApp"), // Customize the Timers
            Code.OK, Code.INVALID_ARGUMENT, Code.UNAUTHENTICATED); // Eagerly initialized status codes
    // Pre-generate metrics for some services (to avoid missing metrics after restarts)
    collector.preregisterService(MyServiceGrpc.getServiceDescriptor());
    return collector;
}      

3.2、名額詳細

一旦依賴關系被添加,grpc-spring-boot-starter 将自動配置ClientIntercertor / ServerInterceptor 以收集名額。

3.2.1、計數器

grpc.client.requests.sent: 發送的總請求數。
grpc.client.responses.received: 接受的總響應數。
grpc.server.requests.received: 收到的總請求數。
grpc.server.responses.sent: 發送的總響應數。

标簽
service: 請求的 grpc 服務名稱(使用 protubuf 名稱)
method: 請求的 grpc 方法名稱(使用 protobuf 名稱)
methodType: 請求的 grpc 方法的類型。      

3.2.2、計時器

grpc.client.processing.duration: 用戶端完成請求所花費的總時間,包括網絡延遲。
grpc.server.processing.duration: 服務端完成請求所花費的時間。

标簽
service: 請求的 grpc 服務名稱(使用 protobuf 名稱)
method: 請求的 grpc 方法名稱(使用 protobuf 名稱)
methodType: 請求的 grpc 方法的類型。
statusCode: 響應的 Status.Code      

3.3、檢視名額

您可以在 /actorator/metrics (需要一個web-server) 或通過 JMX 檢視 grpc 的名額以及其他名額。注意: 你可能需要先啟用名額。
````properties management.endpoints.web.exposure.include=metrics
management.endpoints.jmx.exposure.include=metrics
management.endpoint.metrics.enabled=true ````      

四、Bean作用域

@Bean
@Scope(scopeName = "grpcRequest", proxyMode = ScopedProxyMode.TARGET_CLASS)
//@Scope(scopeName = GrpcRequestScope.GRPC_REQUEST_SCOPE_NAME, proxyMode = ScopedProxyMode.TARGET_CLASS)
ScopedBean myScopedBean() {
    return new ScopedBean();
}

proxyMode = TARGET_CLASS 是必須的,除非在另一個 grpcRequest 作用域中配置了它. 請注意,這個proxyMode 不适用于 final 修飾的類和方法。之後,您就可
以像以前那樣使用 Bean:      
@Autowired
private ScopedBean myScopedBean;

@Override
public void grpcMethod(Request request, StreamObserver<Response> responseObserver) {
    responseObserver.onNext(myScopedBean.magic(request));
    responseObserver.onCompleted();
}      

繼續閱讀