0
点赞
收藏
分享

微信扫一扫

基于grpc从零开始搭建一个准生产分布式应用(4) - 05- springGrpc框架

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作用域

避免在您的ServerIntercetor 和 grpc 服务方法实现中(在整个 gRPC 上下文中)使用 ThreadLocal。 如果您想要在会话中存储数据,请使用 grpc 的 Context 或 grpcRequest 作用域。grpcRequest 作用域该项目添加了一个grpcRequest,该功能类似于 Spring Web 的request 作用域。 它只适用于单个的请求。首先需要用 @Scope 注解定义 Bean:首先需要用 @Scope 注解定义 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();
}
举报

相关推荐

0 条评论