JAV-432 implement get custmon address(remote address)
diff --git a/core/src/main/java/io/servicecomb/core/Const.java b/core/src/main/java/io/servicecomb/core/Const.java
index 2be06b2..004535b 100644
--- a/core/src/main/java/io/servicecomb/core/Const.java
+++ b/core/src/main/java/io/servicecomb/core/Const.java
@@ -35,4 +35,6 @@
   public static final String SRC_MICROSERVICE = "x-cse-src-microservice";
 
   public static final String TARGET_MICROSERVICE = "x-cse-target-microservice";
+  
+  public static final String REMOTE_ADDRESS = "x-cse-remote-address";
 }
diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java
index eec32a9..8e144a4 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java
@@ -52,7 +52,11 @@
   }
 
   @RequestMapping(path = "/sayhi", method = RequestMethod.GET)
-  public String sayHi(HttpServletRequest request) {
+  public String sayHi(HttpServletRequest request) throws Exception {
+    String addr = request.getRemoteAddr();
+    if (addr == null || addr.isEmpty()) {
+      throw new Exception("Can't get remote addr!");
+    }
     String[] values = request.getParameterValues("name");
     if (values != null && values.length > 0 && values[0].equals("throwexception")) {
       throw new RuntimeException();
diff --git a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
index a50517e..521e8dc 100644
--- a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
+++ b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
@@ -102,6 +102,11 @@
   }
 
   @Override
+  public String getRemoteAddr() {
+    return this.vertxRequest.remoteAddress().host();
+  }
+
+  @Override
   public String getRemoteHost() {
     return this.vertxRequest.remoteAddress().host();
   }
diff --git a/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java b/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java
index d59e017..be8a273 100644
--- a/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java
+++ b/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java
@@ -22,18 +22,26 @@
 import io.servicecomb.common.rest.RestConst;
 import io.servicecomb.common.rest.definition.RestOperationMeta;
 import io.servicecomb.common.rest.definition.RestParam;
+import io.servicecomb.core.Const;
 import io.servicecomb.core.Invocation;
 import io.servicecomb.foundation.common.exceptions.ServiceCombException;
 import io.servicecomb.foundation.vertx.http.AbstractHttpServletRequest;
+import io.vertx.core.net.SocketAddress;
 
 public class InvocationToHttpServletRequest extends AbstractHttpServletRequest {
   private RestOperationMeta swaggerOperation;
 
   private Object[] args;
 
+  private SocketAddress sockerAddress;
+
   public InvocationToHttpServletRequest(Invocation invocation) {
     this.swaggerOperation = invocation.getOperationMeta().getExtData(RestConst.SWAGGER_REST_OPERATION);
     this.args = invocation.getArgs();
+    Object remoteAddress = invocation.getHandlerContext().get(Const.REMOTE_ADDRESS);
+    if (remoteAddress != null) {
+      this.sockerAddress = (SocketAddress) remoteAddress;
+    }
   }
 
   @Override
@@ -99,4 +107,19 @@
       throw new ServiceCombException("Failed to get path info.", e);
     }
   }
+
+  @Override
+  public String getRemoteAddr() {
+    return this.sockerAddress == null ? "" : this.sockerAddress.host();
+  }
+  
+  @Override
+  public String getRemoteHost() {
+    return this.sockerAddress == null ? "" : this.sockerAddress.host();
+  }
+  
+  @Override
+  public int getRemotePort() {
+    return this.sockerAddress == null ? 0 : this.sockerAddress.port();
+  }
 }
diff --git a/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java b/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java
index 1f5e3eb..4f5c012 100644
--- a/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java
+++ b/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java
@@ -17,6 +17,7 @@
 package io.servicecomb.provider.rest.common;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
@@ -30,9 +31,11 @@
 import io.servicecomb.common.rest.definition.RestOperationMeta;
 import io.servicecomb.common.rest.definition.RestParam;
 import io.servicecomb.common.rest.definition.path.URLPathBuilder;
+import io.servicecomb.core.Const;
 import io.servicecomb.core.Invocation;
 import io.servicecomb.core.definition.OperationMeta;
 import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+import io.vertx.core.net.SocketAddress;
 import mockit.Expectations;
 import mockit.Mocked;
 
@@ -48,11 +51,17 @@
 
   @Mocked
   Object[] args;
+  
+  @Mocked
+  SocketAddress socketAddress;
+  
+  Map<String, Object> handlerContext = new HashMap<>();
 
   HttpServletRequest request;
 
   @Before
   public void setup() {
+    handlerContext.put(Const.REMOTE_ADDRESS, socketAddress);
     new Expectations() {
       {
         invocation.getOperationMeta();
@@ -61,6 +70,8 @@
         result = swaggerOperation;
         invocation.getArgs();
         result = args;
+        invocation.getHandlerContext();
+        result = handlerContext;
       }
     };
 
@@ -263,4 +274,46 @@
       Assert.assertEquals("error", e.getCause().getMessage());
     }
   }
+
+  @Test
+  public void testGetRemoteAddress() throws Exception {
+    new Expectations() {
+      {
+        socketAddress.host();
+        result = "127.0.0.2";
+        socketAddress.port();
+        result = 8088;
+      }
+    };
+    String addr = request.getRemoteAddr();
+    String host = request.getRemoteHost();
+    int port = request.getRemotePort();
+    Assert.assertEquals(addr, "127.0.0.2");
+    Assert.assertEquals(host, "127.0.0.2");
+    Assert.assertEquals(port, 8088);
+  }
+
+  @Test
+  public void testGetRemoteAddressEmpty(@Mocked Invocation invocation) throws Exception {
+    handlerContext.remove(Const.REMOTE_ADDRESS);
+    new Expectations() {
+      {
+        invocation.getOperationMeta();
+        result = operationMeta;
+        operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION);
+        result = swaggerOperation;
+        invocation.getArgs();
+        result = args;
+        invocation.getHandlerContext();
+        result = handlerContext;
+      }
+    };
+    InvocationToHttpServletRequest request = new InvocationToHttpServletRequest(invocation);
+    String addr = request.getRemoteAddr();
+    String host = request.getRemoteHost();
+    int port = request.getRemotePort();
+    Assert.assertEquals(addr, "");
+    Assert.assertEquals(host, "");
+    Assert.assertEquals(port, 0);
+  }
 }
diff --git a/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java b/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java
index 010c0ef..405b22a 100644
--- a/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java
+++ b/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java
@@ -25,6 +25,7 @@
 import io.servicecomb.codec.protobuf.definition.OperationProtobuf;
 import io.servicecomb.codec.protobuf.definition.ProtobufManager;
 import io.servicecomb.codec.protobuf.utils.WrapSchema;
+import io.servicecomb.core.Const;
 import io.servicecomb.core.CseContext;
 import io.servicecomb.core.Invocation;
 import io.servicecomb.core.definition.MicroserviceMeta;
@@ -117,7 +118,7 @@
 
   private void doRunInExecutor() throws Exception {
     Invocation invocation = HighwayCodec.decodeRequest(header, operationProtobuf, bodyBuffer, protobufFeature);
-
+    invocation.getHandlerContext().put(Const.REMOTE_ADDRESS, this.connection.getNetSocket().remoteAddress());
     invocation.next(response -> {
       sendResponse(invocation.getContext(), response);
     });