Skip to content

Commit f97483c

Browse files
committed
Sigh...
Signed-off-by: Dave Syer <[email protected]>
1 parent 62333af commit f97483c

File tree

3 files changed

+55
-53
lines changed

3 files changed

+55
-53
lines changed

spring-cloud-gateway-integration-tests/grpc/src/test/java/org/springframework/cloud/gateway/tests/grpc/JsonToGrpcApplicationTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.assertj.core.api.Assertions;
3838
import org.junit.jupiter.api.BeforeEach;
3939
import org.junit.jupiter.api.Test;
40+
4041
import org.springframework.boot.test.context.SpringBootTest;
4142
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
4243
import org.springframework.boot.web.server.test.LocalServerPort;

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/JsonToGrpcGatewayFilterFactory.java

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.cloud.gateway.filter.factory;
1818

19-
import static org.springframework.cloud.gateway.support.GatewayToStringStyler.filterToStringCreator;
20-
2119
import java.io.IOException;
2220
import java.net.URI;
2321
import java.util.Arrays;
@@ -28,23 +26,6 @@
2826

2927
import javax.net.ssl.SSLException;
3028

31-
import org.reactivestreams.Publisher;
32-
import org.springframework.cloud.gateway.config.GrpcSslConfigurer;
33-
import org.springframework.cloud.gateway.filter.GatewayFilter;
34-
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
35-
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
36-
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
37-
import org.springframework.cloud.gateway.route.Route;
38-
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
39-
import org.springframework.core.ResolvableType;
40-
import org.springframework.core.io.Resource;
41-
import org.springframework.core.io.ResourceLoader;
42-
import org.springframework.core.io.buffer.DataBuffer;
43-
import org.springframework.core.io.buffer.NettyDataBufferFactory;
44-
import org.springframework.http.codec.json.Jackson2JsonDecoder;
45-
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
46-
import org.springframework.web.server.ServerWebExchange;
47-
4829
import com.fasterxml.jackson.core.JsonProcessingException;
4930
import com.fasterxml.jackson.databind.JsonNode;
5031
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -60,7 +41,6 @@
6041
import com.google.protobuf.DynamicMessage;
6142
import com.google.protobuf.ProtocolStringList;
6243
import com.google.protobuf.util.JsonFormat;
63-
6444
import io.grpc.CallOptions;
6545
import io.grpc.Channel;
6646
import io.grpc.ClientCall;
@@ -70,16 +50,33 @@
7050
import io.grpc.protobuf.ProtoUtils;
7151
import io.grpc.stub.ClientCalls;
7252
import io.netty.buffer.PooledByteBufAllocator;
53+
import org.reactivestreams.Publisher;
7354
import reactor.core.publisher.Flux;
7455
import reactor.core.publisher.Mono;
7556

57+
import org.springframework.cloud.gateway.config.GrpcSslConfigurer;
58+
import org.springframework.cloud.gateway.filter.GatewayFilter;
59+
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
60+
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
61+
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
62+
import org.springframework.cloud.gateway.route.Route;
63+
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
64+
import org.springframework.core.ResolvableType;
65+
import org.springframework.core.io.Resource;
66+
import org.springframework.core.io.ResourceLoader;
67+
import org.springframework.core.io.buffer.DataBuffer;
68+
import org.springframework.core.io.buffer.NettyDataBufferFactory;
69+
import org.springframework.http.codec.json.Jackson2JsonDecoder;
70+
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
71+
import org.springframework.web.server.ServerWebExchange;
72+
73+
import static org.springframework.cloud.gateway.support.GatewayToStringStyler.filterToStringCreator;
74+
7675
/**
77-
* This filter takes a JSON payload, transform it into a protobuf object, send
78-
* it to a
76+
* This filter takes a JSON payload, transform it into a protobuf object, send it to a
7977
* given gRPC channel, and transform the response back to JSON.
8078
*
81-
* Making it transparent for the consumer that the service under the gateway is
82-
* a gRPC
79+
* Making it transparent for the consumer that the service under the gateway is a gRPC
8380
* one.
8481
*
8582
* @author Alberto C. Ríos
@@ -111,7 +108,7 @@ public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
111108

112109
ServerWebExchangeUtils.setAlreadyRouted(exchange);
113110
return modifiedResponse.writeWith(exchange.getRequest().getBody())
114-
.then(chain.filter(exchange.mutate().response(modifiedResponse).build()));
111+
.then(chain.filter(exchange.mutate().response(modifiedResponse).build()));
115112
}
116113

117114
@Override
@@ -189,7 +186,8 @@ class GRPCResponseDecorator extends ServerHttpResponseDecorator {
189186
objectReader = objectMapper.readerFor(JsonNode.class);
190187
objectNode = objectMapper.createObjectNode();
191188

192-
} catch (IOException | Descriptors.DescriptorValidationException e) {
189+
}
190+
catch (IOException | Descriptors.DescriptorValidationException e) {
193191
throw new RuntimeException(e);
194192
}
195193
}
@@ -199,25 +197,24 @@ public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
199197
exchange.getResponse().getHeaders().set("Content-Type", "application/json");
200198

201199
return getDelegate().writeWith(deserializeJSONRequest().map(callGRPCServer())
202-
.map(serialiseGRPCResponse())
203-
.map(wrapGRPCResponse())
204-
.cast(DataBuffer.class)
205-
.last());
200+
.map(serialiseGRPCResponse())
201+
.map(wrapGRPCResponse())
202+
.cast(DataBuffer.class)
203+
.last());
206204
}
207205

208206
private ClientCall<DynamicMessage, DynamicMessage> createClientCallForType(Config config,
209207
Descriptors.ServiceDescriptor serviceDescriptor, Descriptors.Descriptor outputType) {
210208
MethodDescriptor.Marshaller<DynamicMessage> marshaller = ProtoUtils
211-
.marshaller(DynamicMessage.newBuilder(outputType).build());
209+
.marshaller(DynamicMessage.newBuilder(outputType).build());
212210
MethodDescriptor<DynamicMessage, DynamicMessage> methodDescriptor = MethodDescriptor
213-
.<DynamicMessage, DynamicMessage>newBuilder()
214-
.setType(MethodDescriptor.MethodType.UNKNOWN)
215-
.setFullMethodName(
216-
MethodDescriptor.generateFullMethodName(serviceDescriptor.getFullName(),
217-
config.getMethod()))
218-
.setRequestMarshaller(marshaller)
219-
.setResponseMarshaller(marshaller)
220-
.build();
211+
.<DynamicMessage, DynamicMessage>newBuilder()
212+
.setType(MethodDescriptor.MethodType.UNKNOWN)
213+
.setFullMethodName(
214+
MethodDescriptor.generateFullMethodName(serviceDescriptor.getFullName(), config.getMethod()))
215+
.setRequestMarshaller(marshaller)
216+
.setResponseMarshaller(marshaller)
217+
.build();
221218
Channel channel = createChannel();
222219
return channel.newCall(methodDescriptor, CallOptions.DEFAULT);
223220
}
@@ -226,7 +223,7 @@ private Descriptors.MethodDescriptor getMethodDescriptor(Config config)
226223
throws IOException, Descriptors.DescriptorValidationException {
227224
Resource descriptorFile = resourceLoader.getResource(config.getProtoDescriptor());
228225
DescriptorProtos.FileDescriptorSet fileDescriptorSet = DescriptorProtos.FileDescriptorSet
229-
.parseFrom(descriptorFile.getInputStream());
226+
.parseFrom(descriptorFile.getInputStream());
230227
DescriptorProtos.FileDescriptorProto fileProto = fileDescriptorSet.getFile(0);
231228
Descriptors.FileDescriptor fileDescriptor = Descriptors.FileDescriptor.buildFrom(fileProto,
232229
dependencies(fileDescriptorSet, fileProto.getDependencyList()));
@@ -239,9 +236,9 @@ private Descriptors.MethodDescriptor getMethodDescriptor(Config config)
239236
List<Descriptors.MethodDescriptor> methods = serviceDescriptor.getMethods();
240237

241238
return methods.stream()
242-
.filter(method -> method.getName().equals(config.getMethod()))
243-
.findFirst()
244-
.orElseThrow(() -> new NoSuchElementException("No Method found"));
239+
.filter(method -> method.getName().equals(config.getMethod()))
240+
.findFirst()
241+
.orElseThrow(() -> new NoSuchElementException("No Method found"));
245242
}
246243

247244
private FileDescriptor[] dependencies(FileDescriptorSet input, ProtocolStringList list) {
@@ -254,7 +251,8 @@ private FileDescriptor[] dependencies(FileDescriptorSet input, ProtocolStringLis
254251
}
255252
try {
256253
deps[i] = FileDescriptor.buildFrom(file, dependencies(input, file.getDependencyList()));
257-
} catch (DescriptorValidationException e) {
254+
}
255+
catch (DescriptorValidationException e) {
258256
throw new IllegalStateException("Invalid descriptor: " + file.getName(), e);
259257
}
260258
}
@@ -281,7 +279,8 @@ private Function<JsonNode, DynamicMessage> callGRPCServer() {
281279
DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor);
282280
JsonFormat.parser().merge(jsonRequest.toString(), builder);
283281
return ClientCalls.blockingUnaryCall(clientCall, builder.build());
284-
} catch (IOException e) {
282+
}
283+
catch (IOException e) {
285284
throw new RuntimeException(e);
286285
}
287286
};
@@ -291,8 +290,9 @@ private Function<DynamicMessage, Object> serialiseGRPCResponse() {
291290
return gRPCResponse -> {
292291
try {
293292
return objectReader
294-
.readValue(JsonFormat.printer().omittingInsignificantWhitespace().print(gRPCResponse));
295-
} catch (IOException e) {
293+
.readValue(JsonFormat.printer().omittingInsignificantWhitespace().print(gRPCResponse));
294+
}
295+
catch (IOException e) {
296296
throw new RuntimeException(e);
297297
}
298298
};
@@ -312,8 +312,9 @@ private Function<Object, DataBuffer> wrapGRPCResponse() {
312312
return jsonResponse -> {
313313
try {
314314
return new NettyDataBufferFactory(new PooledByteBufAllocator())
315-
.wrap(Objects.requireNonNull(new ObjectMapper().writeValueAsBytes(jsonResponse)));
316-
} catch (JsonProcessingException e) {
315+
.wrap(Objects.requireNonNull(new ObjectMapper().writeValueAsBytes(jsonResponse)));
316+
}
317+
catch (JsonProcessingException e) {
317318
return new NettyDataBufferFactory(new PooledByteBufAllocator()).allocateBuffer();
318319
}
319320
};
@@ -324,7 +325,8 @@ private ManagedChannel createChannelChannel(String host, int port) {
324325
NettyChannelBuilder nettyChannelBuilder = NettyChannelBuilder.forAddress(host, port);
325326
try {
326327
return grpcSslConfigurer.configureSsl(nettyChannelBuilder);
327-
} catch (SSLException e) {
328+
}
329+
catch (SSLException e) {
328330
throw new RuntimeException(e);
329331
}
330332
}

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -289,9 +289,8 @@ public GatewayFilterSpec circuitBreaker(Consumer<SpringCloudCircuitBreakerFilter
289289
* @param protoDescriptor relative path to the proto descriptor file.
290290
*/
291291
public GatewayFilterSpec jsonToGRPC(String service, String method, String protoDescriptor) {
292-
return filter(getBean(JsonToGrpcGatewayFilterFactory.class).apply(c -> c.setMethod(method)
293-
.setProtoDescriptor(protoDescriptor)
294-
.setService(service)));
292+
return filter(getBean(JsonToGrpcGatewayFilterFactory.class)
293+
.apply(c -> c.setMethod(method).setProtoDescriptor(protoDescriptor).setService(service)));
295294
}
296295

297296
/**

0 commit comments

Comments
 (0)