Skip to content

Commit 0fccea1

Browse files
therepaniconobc
authored andcommitted
Allow filtering of services
This commit adds the ability to filter out services from being bound to server factories. Resolves #207 Signed-off-by: Andrey Litvitski <[email protected]> Signed-off-by: Chris Bono <[email protected]>
1 parent 2c9457d commit 0fccea1

File tree

8 files changed

+90
-21
lines changed

8 files changed

+90
-21
lines changed

spring-grpc-core/src/main/java/org/springframework/grpc/server/DefaultGrpcServerFactory.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2024-2024 the original author or authors.
2+
* Copyright 2024-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
2828
import org.apache.commons.logging.LogFactory;
2929

3030
import org.springframework.grpc.internal.GrpcUtils;
31+
import org.springframework.lang.Nullable;
3132

3233
import com.google.common.collect.Lists;
3334
import io.grpc.Grpc;
@@ -49,6 +50,7 @@
4950
* @param <T> the type of server builder
5051
* @author David Syer
5152
* @author Chris Bono
53+
* @author Andrey Litvitski
5254
* @see ServerProvider#provider()
5355
*/
5456
public class DefaultGrpcServerFactory<T extends ServerBuilder<T>> implements GrpcServerFactory {
@@ -68,17 +70,21 @@ public class DefaultGrpcServerFactory<T extends ServerBuilder<T>> implements Grp
6870

6971
private ClientAuth clientAuth;
7072

73+
private ServerServiceDefinitionFilter serviceFilter;
74+
7175
public DefaultGrpcServerFactory(String address, List<ServerBuilderCustomizer<T>> serverBuilderCustomizers) {
7276
this.address = address;
7377
this.serverBuilderCustomizers = Objects.requireNonNull(serverBuilderCustomizers, "serverBuilderCustomizers");
7478
}
7579

7680
public DefaultGrpcServerFactory(String address, List<ServerBuilderCustomizer<T>> serverBuilderCustomizers,
77-
KeyManagerFactory keyManager, TrustManagerFactory trustManager, ClientAuth clientAuth) {
81+
KeyManagerFactory keyManager, TrustManagerFactory trustManager, ClientAuth clientAuth,
82+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
7883
this(address, serverBuilderCustomizers);
7984
this.keyManager = keyManager;
8085
this.trustManager = trustManager;
8186
this.clientAuth = clientAuth;
87+
this.serviceFilter = serviceFilter;
8288
}
8389

8490
protected String address() {
@@ -94,7 +100,9 @@ public Server createServer() {
94100

95101
@Override
96102
public void addService(ServerServiceDefinition service) {
97-
this.serviceList.add(service);
103+
if (this.serviceFilter == null || this.serviceFilter.filter(service)) {
104+
this.serviceList.add(service);
105+
}
98106
}
99107

100108
/**

spring-grpc-core/src/main/java/org/springframework/grpc/server/InProcessGrpcServerFactory.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,22 @@
1717

1818
import java.util.List;
1919

20+
import org.springframework.lang.Nullable;
21+
2022
import io.grpc.inprocess.InProcessServerBuilder;
2123

2224
/**
2325
* {@link GrpcServerFactory} that can be used to create an in-process gRPC server.
2426
*
2527
* @author Chris Bono
28+
* @author Andrey Litvitski
2629
*/
2730
public class InProcessGrpcServerFactory extends DefaultGrpcServerFactory<InProcessServerBuilder> {
2831

2932
public InProcessGrpcServerFactory(String address,
30-
List<ServerBuilderCustomizer<InProcessServerBuilder>> serverBuilderCustomizers) {
31-
super(address, serverBuilderCustomizers);
33+
List<ServerBuilderCustomizer<InProcessServerBuilder>> serverBuilderCustomizers,
34+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
35+
super(address, serverBuilderCustomizers, null, null, null, serviceFilter);
3236
}
3337

3438
@Override

spring-grpc-core/src/main/java/org/springframework/grpc/server/NettyGrpcServerFactory.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2024-2024 the original author or authors.
2+
* Copyright 2024-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,6 +21,8 @@
2121
import javax.net.ssl.KeyManagerFactory;
2222
import javax.net.ssl.TrustManagerFactory;
2323

24+
import org.springframework.lang.Nullable;
25+
2426
import io.grpc.TlsServerCredentials.ClientAuth;
2527
import io.grpc.netty.NettyServerBuilder;
2628
import io.netty.channel.epoll.EpollEventLoopGroup;
@@ -32,13 +34,15 @@
3234
*
3335
* @author David Syer
3436
* @author Chris Bono
37+
* @author Andrey Litvitski
3538
*/
3639
public class NettyGrpcServerFactory extends DefaultGrpcServerFactory<NettyServerBuilder> {
3740

3841
public NettyGrpcServerFactory(String address,
3942
List<ServerBuilderCustomizer<NettyServerBuilder>> serverBuilderCustomizers, KeyManagerFactory keyManager,
40-
TrustManagerFactory trustManager, ClientAuth clientAuth) {
41-
super(address, serverBuilderCustomizers, keyManager, trustManager, clientAuth);
43+
TrustManagerFactory trustManager, ClientAuth clientAuth,
44+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
45+
super(address, serverBuilderCustomizers, keyManager, trustManager, clientAuth, serviceFilter);
4246
}
4347

4448
@Override
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2023-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.grpc.server;
17+
18+
import io.grpc.ServerServiceDefinition;
19+
20+
/**
21+
* Strategy to determine whether a {@link ServerServiceDefinition} should be included for
22+
* the {@link GrpcServerFactory server factory}.
23+
*
24+
* @author Andrey Litvitski
25+
*/
26+
@FunctionalInterface
27+
public interface ServerServiceDefinitionFilter {
28+
29+
/**
30+
* Determine whether the given {@link ServerServiceDefinition} should be included for
31+
* the {@link GrpcServerFactory server factory}.
32+
* @param serviceDefinition the gRPC service definition under consideration.
33+
* @return {@code true} if the service should be included; {@code false} otherwise.
34+
*/
35+
boolean filter(ServerServiceDefinition serviceDefinition);
36+
37+
}

spring-grpc-core/src/main/java/org/springframework/grpc/server/ShadedNettyGrpcServerFactory.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2024-2024 the original author or authors.
2+
* Copyright 2024-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,6 +21,8 @@
2121
import javax.net.ssl.KeyManagerFactory;
2222
import javax.net.ssl.TrustManagerFactory;
2323

24+
import org.springframework.lang.Nullable;
25+
2426
import io.grpc.TlsServerCredentials.ClientAuth;
2527
import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
2628
import io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoopGroup;
@@ -32,13 +34,15 @@
3234
*
3335
* @author David Syer
3436
* @author Chris Bono
37+
* @author Andrey Litvitski
3538
*/
3639
public class ShadedNettyGrpcServerFactory extends DefaultGrpcServerFactory<NettyServerBuilder> {
3740

3841
public ShadedNettyGrpcServerFactory(String address,
3942
List<ServerBuilderCustomizer<NettyServerBuilder>> serverBuilderCustomizers, KeyManagerFactory keyManager,
40-
TrustManagerFactory trustManager, ClientAuth clientAuth) {
41-
super(address, serverBuilderCustomizers, keyManager, trustManager, clientAuth);
43+
TrustManagerFactory trustManager, ClientAuth clientAuth,
44+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
45+
super(address, serverBuilderCustomizers, keyManager, trustManager, clientAuth, serviceFilter);
4246
}
4347

4448
@Override

spring-grpc-spring-boot-autoconfigure/src/main/java/org/springframework/grpc/autoconfigure/server/GrpcServerFactoryConfigurations.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,13 @@
3030
import org.springframework.boot.ssl.SslBundles;
3131
import org.springframework.context.ApplicationEventPublisher;
3232
import org.springframework.context.annotation.Bean;
33+
import org.springframework.lang.Nullable;
3334
import org.springframework.context.annotation.Configuration;
3435
import org.springframework.grpc.server.GrpcServerFactory;
3536
import org.springframework.grpc.server.InProcessGrpcServerFactory;
3637
import org.springframework.grpc.server.NettyGrpcServerFactory;
3738
import org.springframework.grpc.server.ServerBuilderCustomizer;
39+
import org.springframework.grpc.server.ServerServiceDefinitionFilter;
3840
import org.springframework.grpc.server.ShadedNettyGrpcServerFactory;
3941
import org.springframework.grpc.server.lifecycle.GrpcServerLifecycle;
4042
import org.springframework.grpc.server.service.GrpcServiceConfigurer;
@@ -62,7 +64,8 @@ static class ShadedNettyServerFactoryConfiguration {
6264
@Bean
6365
ShadedNettyGrpcServerFactory shadedNettyGrpcServerFactory(GrpcServerProperties properties,
6466
GrpcServiceDiscoverer serviceDiscoverer, GrpcServiceConfigurer serviceConfigurer,
65-
ServerBuilderCustomizers serverBuilderCustomizers, SslBundles bundles) {
67+
ServerBuilderCustomizers serverBuilderCustomizers, SslBundles bundles,
68+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
6669
ShadedNettyServerFactoryPropertyMapper mapper = new ShadedNettyServerFactoryPropertyMapper(properties);
6770
List<ServerBuilderCustomizer<io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder>> builderCustomizers = List
6871
.of(mapper::customizeServerBuilder, serverBuilderCustomizers::customize);
@@ -75,7 +78,7 @@ ShadedNettyGrpcServerFactory shadedNettyGrpcServerFactory(GrpcServerProperties p
7578
: io.grpc.netty.shaded.io.netty.handler.ssl.util.InsecureTrustManagerFactory.INSTANCE;
7679
}
7780
ShadedNettyGrpcServerFactory factory = new ShadedNettyGrpcServerFactory(properties.getAddress(),
78-
builderCustomizers, keyManager, trustManager, properties.getSsl().getClientAuth());
81+
builderCustomizers, keyManager, trustManager, properties.getSsl().getClientAuth(), serviceFilter);
7982
serviceDiscoverer.findServices()
8083
.stream()
8184
.map((serviceSpec) -> serviceConfigurer.configure(serviceSpec, factory))
@@ -104,7 +107,8 @@ static class NettyServerFactoryConfiguration {
104107
@Bean
105108
NettyGrpcServerFactory nettyGrpcServerFactory(GrpcServerProperties properties,
106109
GrpcServiceDiscoverer serviceDiscoverer, GrpcServiceConfigurer serviceConfigurer,
107-
ServerBuilderCustomizers serverBuilderCustomizers, SslBundles bundles) {
110+
ServerBuilderCustomizers serverBuilderCustomizers, SslBundles bundles,
111+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
108112
NettyServerFactoryPropertyMapper mapper = new NettyServerFactoryPropertyMapper(properties);
109113
List<ServerBuilderCustomizer<NettyServerBuilder>> builderCustomizers = List
110114
.of(mapper::customizeServerBuilder, serverBuilderCustomizers::customize);
@@ -117,7 +121,7 @@ NettyGrpcServerFactory nettyGrpcServerFactory(GrpcServerProperties properties,
117121
: InsecureTrustManagerFactory.INSTANCE;
118122
}
119123
NettyGrpcServerFactory factory = new NettyGrpcServerFactory(properties.getAddress(), builderCustomizers,
120-
keyManager, trustManager, properties.getSsl().getClientAuth());
124+
keyManager, trustManager, properties.getSsl().getClientAuth(), serviceFilter);
121125
serviceDiscoverer.findServices()
122126
.stream()
123127
.map((serviceSpec) -> serviceConfigurer.configure(serviceSpec, factory))
@@ -145,12 +149,13 @@ static class InProcessServerFactoryConfiguration {
145149
@Bean
146150
InProcessGrpcServerFactory inProcessGrpcServerFactory(GrpcServerProperties properties,
147151
GrpcServiceDiscoverer serviceDiscoverer, GrpcServiceConfigurer serviceConfigurer,
148-
ServerBuilderCustomizers serverBuilderCustomizers) {
152+
ServerBuilderCustomizers serverBuilderCustomizers,
153+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
149154
var mapper = new InProcessServerFactoryPropertyMapper(properties);
150155
List<ServerBuilderCustomizer<InProcessServerBuilder>> builderCustomizers = List
151156
.of(mapper::customizeServerBuilder, serverBuilderCustomizers::customize);
152157
InProcessGrpcServerFactory factory = new InProcessGrpcServerFactory(properties.getInprocess().getName(),
153-
builderCustomizers);
158+
builderCustomizers, serviceFilter);
154159
serviceDiscoverer.findServices()
155160
.stream()
156161
.map((serviceSpec) -> serviceConfigurer.configure(serviceSpec, factory))

spring-grpc-spring-boot-autoconfigure/src/test/java/org/springframework/grpc/autoconfigure/server/GrpcServerAutoConfigurationTests.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@
4545
import org.springframework.context.annotation.Bean;
4646
import org.springframework.context.annotation.Configuration;
4747
import org.springframework.core.annotation.Order;
48+
import org.springframework.grpc.server.DefaultGrpcServerFactory;
4849
import org.springframework.grpc.server.GrpcServerFactory;
4950
import org.springframework.grpc.server.InProcessGrpcServerFactory;
5051
import org.springframework.grpc.server.NettyGrpcServerFactory;
5152
import org.springframework.grpc.server.ServerBuilderCustomizer;
53+
import org.springframework.grpc.server.ServerServiceDefinitionFilter;
5254
import org.springframework.grpc.server.ShadedNettyGrpcServerFactory;
5355
import org.springframework.grpc.server.lifecycle.GrpcServerLifecycle;
5456
import org.springframework.grpc.server.service.DefaultGrpcServiceConfigurer;
@@ -68,6 +70,7 @@
6870
* Tests for {@link GrpcServerAutoConfiguration}.
6971
*
7072
* @author Chris Bono
73+
* @author Andrey Litvitski
7174
*/
7275
class GrpcServerAutoConfigurationTests {
7376

spring-grpc-test/src/main/java/org/springframework/grpc/test/InProcessTestAutoConfiguration.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@
3434
import org.springframework.grpc.client.InProcessGrpcChannelFactory;
3535
import org.springframework.grpc.server.InProcessGrpcServerFactory;
3636
import org.springframework.grpc.server.ServerBuilderCustomizer;
37+
import org.springframework.grpc.server.ServerServiceDefinitionFilter;
3738
import org.springframework.grpc.server.lifecycle.GrpcServerLifecycle;
3839
import org.springframework.grpc.server.service.GrpcServiceConfigurer;
3940
import org.springframework.grpc.server.service.GrpcServiceDiscoverer;
41+
import org.springframework.lang.Nullable;
4042

4143
import io.grpc.BindableService;
4244
import io.grpc.ChannelCredentials;
@@ -56,8 +58,9 @@ public class InProcessTestAutoConfiguration {
5658
@Order(Ordered.HIGHEST_PRECEDENCE)
5759
TestInProcessGrpcServerFactory testInProcessGrpcServerFactory(GrpcServiceDiscoverer serviceDiscoverer,
5860
GrpcServiceConfigurer serviceConfigurer,
59-
List<ServerBuilderCustomizer<InProcessServerBuilder>> customizers) {
60-
var factory = new TestInProcessGrpcServerFactory(address, customizers);
61+
List<ServerBuilderCustomizer<InProcessServerBuilder>> customizers,
62+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
63+
var factory = new TestInProcessGrpcServerFactory(address, customizers, serviceFilter);
6164
serviceDiscoverer.findServices()
6265
.stream()
6366
.map((serviceSpec) -> serviceConfigurer.configure(serviceSpec, factory))
@@ -86,8 +89,9 @@ GrpcServerLifecycle inProcessGrpcServerLifecycle(InProcessGrpcServerFactory fact
8689
public static class TestInProcessGrpcServerFactory extends InProcessGrpcServerFactory {
8790

8891
public TestInProcessGrpcServerFactory(String address,
89-
List<ServerBuilderCustomizer<InProcessServerBuilder>> serverBuilderCustomizers) {
90-
super(address, serverBuilderCustomizers);
92+
List<ServerBuilderCustomizer<InProcessServerBuilder>> serverBuilderCustomizers,
93+
@Nullable ServerServiceDefinitionFilter serviceFilter) {
94+
super(address, serverBuilderCustomizers, serviceFilter);
9195
}
9296

9397
}

0 commit comments

Comments
 (0)