開始前必讀:基于grpc從零開始搭建一個準生産分布式應用(0) - quickStart
springGrpc架構是一個開源項目,大家可以在網上下載下傳。本章開始詳細說下相關的内容。這裡不講其內建等,隻把重要内容描述下。
一、概念
- Channel: Channel 是單個服務端的連接配接池。 目标伺服器可能是多個 gRPC 服務。
- ManagedChannel: ManagedChannel 是 Channel 的一種特殊變體,因為它允許對連接配接池進行管理操作,例如将其關閉。
- ClientInterceptor: 在每個 Channel 處理之前攔截它們。 可以用于日志、監測、中繼資料處理和請求/響應的重寫。 grpc-spring-boot-starter 将自動接收所有帶有 @GrpcGlobalClientInterceptor 注解以及手動注冊在GlobalClientInterceptorRegistry 上的客戶攔截器。
- CallCredentials: 管理身份驗證的元件。 它可以用于存儲憑據和會話令牌。 它還可以用來身份驗證,并且使用傳回的令牌(例如 OAuth )來授權實際請求。 除此之外,如果令牌過期并且重新發送請求,它可以續簽令牌。 如果您的應用程式上下文中隻存在一個 CallCredentials bean,那麼 spring 将會自動将其附加到Stub( 非 Channel )。 CallCredentialsHelper工具類可以幫助您建立常用的 CallCredentials 類型和相關的StubTransformer。
- StubTransformer: 所有用戶端的 Stub 的注入之前應用的轉換器。
- @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();
}