一.使用sentinel作为GRPC的限流组件
在官方文档中告诉我们只需要
Server server = ServerBuilder.forPort(port)
.addService(new MyServiceImpl()) // 添加自己的服务实现
.intercept(new SentinelGrpcServerInterceptor()) // 在此处注册拦截器
.build();
这样就可以使用sentinel作为GRPC的限流组件,但是老项目并没有用到或者我们的部分项目不需要sentinel,这样的话,我们需要自适应判断添加SentinelGrpcServerInterceptor。
我重写了阿里的SentinelGrpcServerInterceptor,毕竟Flow control limit exceeded (server side)这句话不是很适合。
class XXXXSentinelGrpcServerInterceptor(fallbackMessage: String) : SentinelGrpcServerInterceptor() {
private val status = Status.UNAVAILABLE.withDescription(
fallbackMessage)
private val STATUS_RUNTIME_EXCEPTION = StatusRuntimeException(Status.CANCELLED)
override fun <ReqT, RespT> interceptCall(call: ServerCall<ReqT, RespT>, headers: Metadata?, next: ServerCallHandler<ReqT, RespT>): ServerCall.Listener<ReqT>? {
val fullMethodName = call.methodDescriptor.fullMethodName
// Remote address: serverCall.getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR);
var entry: Entry? = null
return try {
entry = SphU.asyncEntry(fullMethodName, EntryType.IN)
val atomicReferenceEntry = AtomicReference<Entry?>(entry)
// Allow access, forward the call.
object : ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(
next.startCall(
object : ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) {
override fun close(status: Status, trailers: Metadata) {
val entry = atomicReferenceEntry.get()
if (entry != null) {