Skip to content

Commit b5eb0c0

Browse files
committed
ref #295
1 parent 5c8e55d commit b5eb0c0

File tree

10 files changed

+147
-30
lines changed

10 files changed

+147
-30
lines changed

grpc-spring-boot-starter-demo/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ dependencies {
8888
testCompile "org.springframework.cloud:spring-cloud-config-client"
8989
testCompile "org.springframework.cloud:spring-cloud-starter-bootstrap"
9090

91-
testCompile "com.playtika.testcontainers:embedded-keycloak:2.0.18"
92-
testCompile "com.playtika.testcontainers:embedded-consul:2.0.18"
91+
testCompile "com.playtika.testcontainers:embedded-keycloak:2.2.2"
92+
testCompile "com.playtika.testcontainers:embedded-consul:2.2.2"
9393

9494
testImplementation 'org.hamcrest:hamcrest:2.2'
9595
testImplementation 'org.mockito:mockito-core:2.23.0'
@@ -100,7 +100,7 @@ dependencies {
100100

101101
bothPureAndShadedNettyTestCompile "io.grpc:grpc-netty"
102102

103-
kafkaStreamTestCompile "com.playtika.testcontainers:embedded-kafka:2.0.18"
103+
kafkaStreamTestCompile "com.playtika.testcontainers:embedded-kafka:2.2.2"
104104
kafkaStreamTestCompile "org.springframework.cloud:spring-cloud-starter-stream-kafka"
105105

106106

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package org.lognet.springboot.grpc.simple;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.node.ObjectNode;
5+
import com.jayway.jsonpath.Configuration;
6+
import com.jayway.jsonpath.DocumentContext;
7+
import com.jayway.jsonpath.JsonPath;
8+
import com.jayway.jsonpath.TypeRef;
9+
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
10+
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
11+
import io.micrometer.prometheus.PrometheusConfig;
12+
import org.awaitility.Awaitility;
13+
import org.hamcrest.Matchers;
14+
import org.junit.Test;
15+
import org.junit.runner.RunWith;
16+
import org.lognet.springboot.grpc.GrpcServerTestBase;
17+
import org.lognet.springboot.grpc.TestConfig;
18+
import org.lognet.springboot.grpc.demo.DemoApp;
19+
import org.springframework.beans.factory.annotation.Autowired;
20+
import org.springframework.boot.actuate.health.Status;
21+
import org.springframework.boot.test.context.SpringBootTest;
22+
import org.springframework.boot.test.web.client.TestRestTemplate;
23+
import org.springframework.http.HttpStatus;
24+
import org.springframework.http.ResponseEntity;
25+
import org.springframework.test.context.ActiveProfiles;
26+
import org.springframework.test.context.junit4.SpringRunner;
27+
28+
import java.time.Duration;
29+
import java.util.Optional;
30+
import java.util.Set;
31+
import java.util.Spliterator;
32+
import java.util.Spliterators;
33+
import java.util.concurrent.Callable;
34+
import java.util.concurrent.ExecutionException;
35+
import java.util.stream.Stream;
36+
import java.util.stream.StreamSupport;
37+
38+
import static org.hamcrest.MatcherAssert.assertThat;
39+
import static org.junit.Assert.assertEquals;
40+
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
41+
42+
/**
43+
* Created by alexf on 28-Jan-16.
44+
*/
45+
@RunWith(SpringRunner.class)
46+
@SpringBootTest(classes = {DemoApp.class}, webEnvironment = RANDOM_PORT
47+
, properties = {
48+
"management.endpoints.web.exposure.include=*"
49+
, "spring.main.web-application-type=servlet"
50+
})
51+
@ActiveProfiles({"disable-security"})
52+
public class Issue295Test extends GrpcServerTestBase {
53+
54+
55+
56+
@Autowired
57+
private TestRestTemplate restTemplate;
58+
59+
60+
@Test
61+
public void configPropertiesTest() throws ExecutionException, InterruptedException {
62+
ResponseEntity<String> response = restTemplate.getForEntity("/actuator/configprops", String.class);
63+
assertEquals(HttpStatus.OK, response.getStatusCode());
64+
}
65+
66+
@Test
67+
public void actuatorGrpcTest() throws ExecutionException, InterruptedException {
68+
ResponseEntity<String> response = restTemplate.getForEntity("/actuator/grpc", String.class);
69+
assertEquals(HttpStatus.OK, response.getStatusCode());
70+
final DocumentContext json = JsonPath.parse(response.getBody(), Configuration.builder()
71+
.mappingProvider(new JacksonMappingProvider())
72+
.jsonProvider(new JacksonJsonProvider())
73+
.build());
74+
final String[] statuses = json.read("services.*name", new TypeRef<String[]>() {});
75+
assertThat(statuses,Matchers.arrayWithSize(Matchers.greaterThan(0)));
76+
for(String s:statuses) {
77+
assertThat(s, Matchers.not(Matchers.blankOrNullString()));
78+
}
79+
80+
final Integer port = json.read("port", Integer.class);
81+
assertThat(port,Matchers.greaterThan(0));
82+
}
83+
84+
@Test
85+
public void actuatorHealthTest() throws ExecutionException, InterruptedException {
86+
ResponseEntity<String> response = restTemplate.getForEntity("/actuator/health/grpc", String.class);
87+
assertEquals(HttpStatus.OK, response.getStatusCode());
88+
89+
final DocumentContext json = JsonPath.parse(response.getBody(), Configuration.builder()
90+
.mappingProvider(new JacksonMappingProvider())
91+
.jsonProvider(new JacksonJsonProvider())
92+
.build());
93+
final TypeRef<Set<String>> setOfString = new TypeRef<Set<String>>() {
94+
};
95+
final Set<String> services = json.read("components.keys()", setOfString);
96+
assertThat(services,Matchers.containsInAnyOrder( super.appServicesNames().toArray(new String[]{})));
97+
98+
final Set<String> statuses = json.read("components.*status", setOfString);
99+
assertThat(statuses,Matchers.contains(Status.UP.getCode()));
100+
101+
102+
103+
}
104+
105+
106+
107+
108+
}

grpc-spring-boot-starter-demo/src/noConsulDependenciesTest/java/org/lognet/springboot/grpc/simple/NoConsulDependencyTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.runner.RunWith;
66
import org.lognet.springboot.grpc.GrpcServerTestBase;
77
import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties;
8+
import org.lognet.springboot.grpc.autoconfigure.consul.GrpcConsulProperties;
89
import org.lognet.springboot.grpc.demo.DemoApp;
910
import org.springframework.boot.test.context.SpringBootTest;
1011
import org.springframework.test.context.ActiveProfiles;
@@ -25,7 +26,7 @@ public void noConsulClassesTest() {
2526

2627
final NoClassDefFoundError error = assertThrows(NoClassDefFoundError.class, () -> {
2728
try {
28-
ReflectionUtils.findMethod(GRpcServerProperties.ConsulProperties.class, "getDiscovery");
29+
ReflectionUtils.findMethod(GrpcConsulProperties.class, "getDiscovery");
2930
}catch (IllegalStateException illegalStateException){
3031
throw illegalStateException.getCause();
3132
}

grpc-spring-boot-starter-demo/src/test/java/org/lognet/springboot/grpc/consul/ConsulDefaultRegistrationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.hamcrest.Matchers;
66
import org.junit.Test;
77
import org.junit.runner.RunWith;
8-
import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties;
8+
import org.lognet.springboot.grpc.autoconfigure.consul.GrpcConsulProperties;
99
import org.lognet.springboot.grpc.demo.DemoApp;
1010
import org.springframework.boot.test.context.SpringBootTest;
1111
import org.springframework.cloud.client.ServiceInstance;
@@ -34,7 +34,7 @@ public void consulPropertiesTest() {
3434
assertThat(cloudConsulProps.getInstanceGroup(),Matchers.nullValue(String.class));
3535

3636

37-
final ConsulDiscoveryProperties grpcConsulProperties = applicationContext.getBean(GRpcServerProperties.class).getConsul().getDiscovery();
37+
final ConsulDiscoveryProperties grpcConsulProperties = applicationContext.getBean(GrpcConsulProperties.class).getDiscovery();
3838
assertThat(grpcConsulProperties.getTags(), Matchers.hasSize(3));
3939
assertThat(grpcConsulProperties.getTags(), Matchers.hasItem("1"));
4040

grpc-spring-boot-starter-demo/src/test/java/org/lognet/springboot/grpc/consul/ConsulRegistrationBaseTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.junit.After;
1818
import org.junit.Before;
1919
import org.junit.Test;
20-
import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties;
20+
import org.lognet.springboot.grpc.autoconfigure.consul.GrpcConsulProperties;
2121
import org.lognet.springboot.grpc.autoconfigure.consul.ServiceRegistrationMode;
2222
import org.springframework.beans.factory.annotation.Autowired;
2323
import org.springframework.cloud.client.ServiceInstance;
@@ -57,8 +57,8 @@ public void setUp() throws Exception {
5757

5858
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
5959

60-
final ServiceRegistrationMode registrationMode = applicationContext.getBean(GRpcServerProperties.class)
61-
.getConsul().getRegistrationMode();
60+
final ServiceRegistrationMode registrationMode = applicationContext.getBean(GrpcConsulProperties.class)
61+
.getRegistrationMode();
6262

6363
if(!ServiceRegistrationMode.NOOP.equals(registrationMode)) {
6464

@@ -90,8 +90,7 @@ public void tearDown() throws Exception {
9090
public void contextLoads() {
9191

9292
int minExpectedRegistrations;
93-
switch (applicationContext.getBean(GRpcServerProperties.class)
94-
.getConsul()
93+
switch (applicationContext.getBean(GrpcConsulProperties.class)
9594
.getRegistrationMode()) {
9695
case STANDALONE_SERVICES:
9796
minExpectedRegistrations = getServicesDefinitions().size();

grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/GRpcServerProperties.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ public class GRpcServerProperties {
3838

3939
private NettyServerProperties nettyServer;
4040

41-
private ConsulProperties consul = new ConsulProperties();
42-
4341
@Setter(AccessLevel.NONE)
4442
@Getter(AccessLevel.NONE)
4543
private volatile Integer runningPort = null;
@@ -102,13 +100,7 @@ public static class Auth {
102100
}
103101
}
104102

105-
@Getter
106-
@Setter
107-
public static class ConsulProperties {
108-
ServiceRegistrationMode registrationMode = ServiceRegistrationMode.SINGLE_SERVER_WITH_GLOBAL_CHECK;
109-
@NestedConfigurationProperty
110-
ConsulDiscoveryProperties discovery;
111-
}
103+
112104
@Getter
113105
@Setter
114106
public static class NettyServerProperties {

grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/consul/ConsulGrpcAutoConfiguration.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import org.lognet.springboot.grpc.GRpcServerRunner;
44
import org.lognet.springboot.grpc.autoconfigure.GRpcAutoConfiguration;
5-
import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties;
65
import org.lognet.springboot.grpc.autoconfigure.OnGrpcServerEnabled;
76
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
87
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
98
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
109
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1110
import org.springframework.boot.context.properties.ConfigurationPropertiesBindHandlerAdvisor;
11+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1212
import org.springframework.boot.context.properties.bind.AbstractBindHandler;
1313
import org.springframework.boot.context.properties.bind.BindContext;
1414
import org.springframework.boot.context.properties.bind.Bindable;
@@ -25,6 +25,7 @@
2525
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
2626
@ConditionalOnBean({ConsulServiceRegistry.class, GRpcServerRunner.class})
2727
@OnGrpcServerEnabled
28+
@EnableConfigurationProperties(GrpcConsulProperties.class)
2829
public class ConsulGrpcAutoConfiguration {
2930

3031

@@ -34,15 +35,15 @@ public class ConsulGrpcAutoConfiguration {
3435
public ConfigurationPropertiesBindHandlerAdvisor advisor( ){
3536
// sets cloud consul discovery bound instance as starting object for grpc consul discovery properties
3637
return b->new AbstractBindHandler(b) {
37-
private final ConfigurationPropertyName grpcConfigName = ConfigurationPropertyName.of("grpc");
38+
private final ConfigurationPropertyName grpcConfigName = ConfigurationPropertyName.of("grpc.consul");
3839
@Override
3940
public <T> Bindable<T> onStart(ConfigurationPropertyName name, Bindable<T> target, BindContext context) {
4041

4142
if(grpcConfigName.equals(name)){
4243

4344
final ConsulDiscoveryProperties result = context.getBinder().bindOrCreate(ConsulDiscoveryProperties.PREFIX, ConsulDiscoveryProperties.class);
44-
final GRpcServerProperties p = (GRpcServerProperties) target.getValue().get();
45-
p.getConsul().setDiscovery(result);
45+
final GrpcConsulProperties p = (GrpcConsulProperties) target.getValue().get();
46+
p.setDiscovery(result);
4647
}
4748
return super.onStart(name, target, context);
4849
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.lognet.springboot.grpc.autoconfigure.consul;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
7+
import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
8+
9+
@Getter
10+
@Setter
11+
@ConfigurationProperties(prefix = "grpc.consul")
12+
public class GrpcConsulProperties {
13+
ServiceRegistrationMode registrationMode = ServiceRegistrationMode.SINGLE_SERVER_WITH_GLOBAL_CHECK;
14+
@NestedConfigurationProperty
15+
ConsulDiscoveryProperties discovery;
16+
}

grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/consul/GrpcConsulRegistrar.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.lognet.springboot.grpc.autoconfigure.consul;
22

3-
import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties;
43
import org.lognet.springboot.grpc.context.GRpcServerInitializedEvent;
54
import org.springframework.cloud.consul.serviceregistry.ConsulRegistration;
65
import org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistry;
@@ -26,12 +25,13 @@ public void onGrpcServerStarted(GRpcServerInitializedEvent event) {
2625

2726
ApplicationContext applicationContext = event.getApplicationContext();
2827

29-
final GRpcServerProperties.ConsulProperties gRpcConsulProperties = applicationContext
30-
.getBean(GRpcServerProperties.class)
31-
.getConsul();
28+
final GrpcConsulProperties gRpcConsulProperties = applicationContext
29+
.getBean(GrpcConsulProperties.class);
3230

3331

34-
registrations = gRpcConsulProperties.getRegistrationMode()
32+
33+
registrations = gRpcConsulProperties
34+
.getRegistrationMode()
3535
.createServices(event.getServer(),applicationContext)
3636
.stream()
3737
.map(s->new ConsulRegistration(s, gRpcConsulProperties.getDiscovery()))

grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/consul/ServiceRegistrationMode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public Collection<NewService> createServices(Server grpcServer, ApplicationConte
3232
@Override
3333
public Collection<NewService> createServices(Server grpcServer, ApplicationContext applicationContext) {
3434
GRpcServerProperties gRpcServerProperties = applicationContext.getBean(GRpcServerProperties.class);
35-
ConsulDiscoveryProperties consulProperties = gRpcServerProperties.getConsul().getDiscovery();
35+
ConsulDiscoveryProperties consulProperties = applicationContext.getBean(GrpcConsulProperties.class).getDiscovery();
3636

3737

3838

0 commit comments

Comments
 (0)