From af6e3dc216d7528bf56a691d49f9784d8c0a66ba Mon Sep 17 00:00:00 2001 From: chenzhiguo Date: Tue, 21 Jan 2025 17:12:21 +0800 Subject: [PATCH] Update for grpc response --- .../provider/service/UserServiceGrpcImpl.java | 3 +- .../router/gprc/request/GrpcRequest.java | 29 ++++++++++++++++--- .../router/gprc/response/GrpcResponse.java | 12 ++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/joylive-demo/joylive-demo-grpc/joylive-demo-grpc-provider/src/main/java/com/jd/live/agent/demo/grpc/provider/service/UserServiceGrpcImpl.java b/joylive-demo/joylive-demo-grpc/joylive-demo-grpc-provider/src/main/java/com/jd/live/agent/demo/grpc/provider/service/UserServiceGrpcImpl.java index 3eccc436..c4e34410 100644 --- a/joylive-demo/joylive-demo-grpc/joylive-demo-grpc-provider/src/main/java/com/jd/live/agent/demo/grpc/provider/service/UserServiceGrpcImpl.java +++ b/joylive-demo/joylive-demo-grpc/joylive-demo-grpc-provider/src/main/java/com/jd/live/agent/demo/grpc/provider/service/UserServiceGrpcImpl.java @@ -18,6 +18,7 @@ import com.jd.live.agent.core.util.network.Ipv4; import com.jd.live.agent.demo.grpc.service.api.*; import com.jd.live.agent.demo.response.LiveTransmission; +import io.grpc.Status; import io.grpc.stub.StreamObserver; import net.devh.boot.grpc.server.service.GrpcService; @@ -29,7 +30,7 @@ public class UserServiceGrpcImpl extends UserServiceGrpc.UserServiceImplBase { @Override public void get(UserGetRequest request, StreamObserver responseObserver) { if (request.getId() < 0 && ThreadLocalRandom.current().nextInt(3) == 0) { - responseObserver.onError(new RuntimeException("error")); + responseObserver.onError(Status.INTERNAL.withDescription("Server error!").asException()); return; } if (request.getId() >= 100) { diff --git a/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/request/GrpcRequest.java b/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/request/GrpcRequest.java index bb25a728..dba00067 100644 --- a/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/request/GrpcRequest.java +++ b/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/request/GrpcRequest.java @@ -16,22 +16,22 @@ package com.jd.live.agent.plugin.router.gprc.request; import com.jd.live.agent.bootstrap.exception.RejectException.RejectNoProviderException; +import com.jd.live.agent.governance.exception.ErrorName; import com.jd.live.agent.governance.instance.Endpoint; import com.jd.live.agent.governance.request.AbstractRpcRequest.AbstractRpcInboundRequest; import com.jd.live.agent.governance.request.AbstractRpcRequest.AbstractRpcOutboundRequest; import com.jd.live.agent.governance.request.RoutedRequest; +import com.jd.live.agent.plugin.router.gprc.exception.GrpcException; import com.jd.live.agent.plugin.router.gprc.exception.GrpcException.GrpcClientException; import com.jd.live.agent.plugin.router.gprc.loadbalance.LiveDiscovery; import com.jd.live.agent.plugin.router.gprc.loadbalance.LiveRequest; import com.jd.live.agent.plugin.router.gprc.loadbalance.LiveRouteResult; -import io.grpc.Grpc; -import io.grpc.Metadata; -import io.grpc.MethodDescriptor; -import io.grpc.ServerCall; +import io.grpc.*; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -88,6 +88,17 @@ public List getHeaders(String key) { */ class GrpcOutboundRequest extends AbstractRpcOutboundRequest> implements GrpcRequest, RoutedRequest { + private static final Function GRPC_ERROR_FUNCTION = throwable -> { + if (throwable instanceof StatusException) { + return new ErrorName(null, String.valueOf(((StatusException) throwable).getStatus().getCode().value())); + } else if (throwable instanceof StatusRuntimeException) { + return new ErrorName(null, String.valueOf(((StatusRuntimeException) throwable).getStatus().getCode().value())); + } else if (throwable instanceof GrpcException.GrpcServerException) { + return new ErrorName(null, String.valueOf(((GrpcException.GrpcServerException) throwable).getStatus().getCode().value())); + } + return DEFAULT_ERROR_FUNCTION.apply(throwable); + }; + public GrpcOutboundRequest(LiveRequest request) { super(request); this.service = LiveDiscovery.getService(request.getPath()); @@ -134,5 +145,15 @@ public boolean hasEndpoint() { LiveRouteResult result = request.getRouteResult(); return result != null && result.isSuccess(); } + + /** + * Returns the default error name function. + * + * @return The default error name function. + */ + @Override + public Function getErrorFunction() { + return GRPC_ERROR_FUNCTION; + } } } diff --git a/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/response/GrpcResponse.java b/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/response/GrpcResponse.java index ad4182b9..ebe545f5 100644 --- a/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/response/GrpcResponse.java +++ b/joylive-plugin/joylive-router/joylive-router-grpc/src/main/java/com/jd/live/agent/plugin/router/gprc/response/GrpcResponse.java @@ -31,9 +31,16 @@ class GrpcOutboundResponse extends AbstractRpcOutboundResponse implement private final Status status; + private final boolean server; + public GrpcOutboundResponse(Object response) { + this(response, false); + } + + public GrpcOutboundResponse(Object response, boolean isServer) { super(response, null); status = Status.OK; + server = isServer; } public GrpcOutboundResponse(ServiceError error, ErrorPredicate retryPredicate) { @@ -43,6 +50,7 @@ public GrpcOutboundResponse(ServiceError error, ErrorPredicate retryPredicate) { public GrpcOutboundResponse(ServiceError error, ErrorPredicate retryPredicate, Status status) { super(null, error, retryPredicate); this.status = status != null ? status : getStatus(error.getThrowable()); + this.server = error != null && error.isServerError(); } @Override @@ -53,5 +61,9 @@ public String getCode() { private Status getStatus(Throwable throwable) { return throwable == null ? Status.INTERNAL : Status.fromThrowable(throwable); } + + public boolean isServer() { + return server; + } } }