3131import java .lang .management .ManagementFactory ;
3232import java .util .ArrayList ;
3333import java .util .Arrays ;
34+ import java .util .Collections ;
3435import java .util .HashMap ;
3536import java .util .List ;
3637import java .util .Map ;
@@ -143,9 +144,11 @@ public final class Microservices {
143144 private final MonoProcessor <Void > shutdown = MonoProcessor .create ();
144145 private final MonoProcessor <Void > onShutdown = MonoProcessor .create ();
145146 private ServiceEndpoint serviceEndpoint ;
147+ private String containerHost ;
148+ private Integer containerPort ;
146149
147150 private Microservices (Builder builder ) {
148- this .tags = new HashMap <>(builder .tags );
151+ this .tags = Collections . unmodifiableMap ( new HashMap <>(builder .tags ) );
149152 this .serviceProviders = new ArrayList <>(builder .serviceProviders );
150153 this .serviceRegistry = builder .serviceRegistry ;
151154 this .methodRegistry = builder .methodRegistry ;
@@ -157,6 +160,8 @@ private Microservices(Builder builder) {
157160 this .dataDecoder = builder .dataDecoder ;
158161 this .contentType = builder .contentType ;
159162 this .principalMapper = builder .principalMapper ;
163+ this .containerHost = builder .containerHost ;
164+ this .containerPort = builder .containerPort ;
160165
161166 // Setup cleanup
162167 shutdown
@@ -217,7 +222,7 @@ private Mono<Microservices> start() {
217222 LOGGER .warn ("[{}] ServiceTransport is not set" , this .id ());
218223 }
219224
220- serviceEndpoint = serviceEndpointBuilder .build ();
225+ serviceEndpoint = newServiceEndpoint ( serviceEndpointBuilder .build () );
221226
222227 return createDiscovery (
223228 this , new ServiceDiscoveryOptions ().serviceEndpoint (serviceEndpoint ))
@@ -236,6 +241,20 @@ this, new ServiceDiscoveryOptions().serviceEndpoint(serviceEndpoint))
236241 .doOnTerminate (scheduler ::dispose );
237242 }
238243
244+ private ServiceEndpoint newServiceEndpoint (ServiceEndpoint serviceEndpoint ) {
245+ ServiceEndpoint .Builder builder = ServiceEndpoint .from (serviceEndpoint );
246+
247+ int port = Optional .ofNullable (containerPort ).orElse (serviceEndpoint .address ().port ());
248+
249+ // calculate local service endpoint address
250+ Address newAddress =
251+ Optional .ofNullable (containerHost )
252+ .map (host -> Address .create (host , port ))
253+ .orElseGet (() -> Address .create (serviceEndpoint .address ().host (), port ));
254+
255+ return builder .address (newAddress ).build ();
256+ }
257+
239258 private Mono <GatewayBootstrap > startGateway (GatewayOptions options ) {
240259 return gatewayBootstrap .start (this , options );
241260 }
@@ -373,6 +392,8 @@ public static final class Builder {
373392 .orElse ((message , dataType ) -> message );
374393 private String contentType = ServiceMessage .DEFAULT_DATA_FORMAT ;
375394 private PrincipalMapper <Object , Object > principalMapper = authData -> authData ;
395+ private String containerHost ;
396+ private Integer containerPort ;
376397
377398 public Mono <Microservices > start () {
378399 return Mono .defer (() -> new Microservices (this ).start ());
@@ -411,6 +432,16 @@ public Builder services(ServiceProvider serviceProvider) {
411432 return this ;
412433 }
413434
435+ public Builder containerHost (String containerHost ) {
436+ this .containerHost = containerHost ;
437+ return this ;
438+ }
439+
440+ public Builder containerPort (Integer containerPort ) {
441+ this .containerPort = containerPort ;
442+ return this ;
443+ }
444+
414445 public Builder serviceRegistry (ServiceRegistry serviceRegistry ) {
415446 this .serviceRegistry = serviceRegistry ;
416447 return this ;
0 commit comments