2016-12-14 83 views
0

我有Spring Boot web應用程序。它在端口8080上公開了REST API。它還公開了帶有Spring Boot Management端點的管理端口8081(http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-monitoring.html)。 我沒有任何定製的Tomcat配置來實現這一點。我的application.properties文件中只有屬性management.port=8081如何讓Javamelody使用不同的端口(Spring Boot +兩個HTTP端口暴露)

https://github.com/javamelody/javamelody/wiki/UserGuideAdvanced#spring-boot-app 描述我已經JavaMelody配置(我有定製JavaMelodyConfiguration類,有org.springframework.boot.web.servlet.FilterRegistrationBean,其登記net.bull.javamelody.MonitoringFilter)。

@Bean 
    public FilterRegistrationBean javaMelody() { 
     final FilterRegistrationBean javaMelody = new FilterRegistrationBean(); 
     javaMelody.setFilter(new MonitoringFilter()); 
     javaMelody.setAsyncSupported(true); 
     javaMelody.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC); 
     javaMelody.addUrlPatterns("/*"); 
     return javaMelody; 
    } 

通過此配置,Javamelody在端口8080(業務端口)上公開。我想把它移到8081(管理端口)。如何改變?

我使用Spring引導1.4.2.RELEASE,javamelody 1.62.0

+0

搜索你的項目爲8080,看看你是否發現將其更改爲8081 – StackFlowed

+0

這不會解決我的問題的地方。我仍然希望我的應用程序在8080端口上顯示業務REST api,在8081上顯示管理API,在8081上顯示javamelody。 –

回答

2

EmbeddedTomcatConfiguration.java

package ... 

import java.util.ArrayList; 
import java.util.List; 

import org.apache.catalina.connector.Connector; 
import org.apache.commons.lang.StringUtils; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; 
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class EmbeddedTomcatConfiguration { 

    @Value("${server.additionalPorts}") 
    private String additionalPorts; 

    @Bean 
    public EmbeddedServletContainerFactory servletContainer() { 
     TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); 
     Connector[] additionalConnectors = this.additionalConnector(); 
     if (additionalConnectors != null && additionalConnectors.length > 0) { 
      tomcat.addAdditionalTomcatConnectors(additionalConnectors); 
     } 
     return tomcat; 
    } 

    private Connector[] additionalConnector() { 
     if (StringUtils.isBlank(this.additionalPorts)) { 
      return null; 
     } 
     String[] ports = this.additionalPorts.split(","); 
     List<Connector> result = new ArrayList<>(); 
     for (String port : ports) { 
      Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 
      connector.setScheme("http"); 
      connector.setPort(Integer.valueOf(port)); 
      result.add(connector); 
     } 
     return result.toArray(new Connector[] {}); 
    } 
} 

application.yml

server: 
    port: ${appPort:8800} 
    additionalPorts: 8880,8881 

Application.java

@SpringBootApplication 
@ComponentScan(...) 
@Import(EmbeddedTomcatConfiguration.class) 
public Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application .class, args); 
    } 
} 

我從一個特定的端口限制訪問javamelody的建議是延長javamelody過濾器,如果它來自一個特定端口,否則發回一個404

從日誌剛剛鏈中的要求:

INFO TomcatEmbeddedServletContainer:185 - Tomcat started on port(s): 8800 (http) 8880 (http) 8881 (http) 

這種方法公開了這些端口上的其他端點。 爲了解決這個問題並將Javamelody過濾器(/監視)限制到特定端口,您需要編寫一個過濾器來驗證從允許端口請求的路徑(servlet和過濾器路徑),同時牢記這些過濾器的排序很重要。

在此基礎上的答案和部分源代碼,我已經可以當我回答這個問題,我已經在http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html

+0

謝謝!有了這樣的配置,當我註冊javamelody描述(我已編輯我的問題,包括那)將net.bull.javamelody.MonitoringFilter註冊到兩個端口? –

+0

Yw,假設您想使用管理端口和管理上下文路徑訪問Javamelody UI,我會嘗試將Javamelody過濾器映射到/ admin/monitoring – ootero

+0

我的意思是將server.servlet-path設置爲/,management.context-path設置爲/ admin – ootero

0

的一篇博客有關此主題,您可以通過MvcEndpoint使用ReportServlet。事情是這樣的:

import net.bull.javamelody.MonitoringFilter; 
    import net.bull.javamelody.ReportServlet; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.boot.actuate.endpoint.Endpoint; 
    import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; 
    import org.springframework.boot.web.servlet.FilterRegistrationBean; 
    import org.springframework.context.annotation.Bean; 
    import org.springframework.context.annotation.Configuration; 
    import org.springframework.web.bind.annotation.GetMapping; 

    import javax.servlet.ServletConfig; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import java.io.IOException; 

    /** 
    * We configure the Java Melody {@link MonitoringFilter} normally, but disables all access to the UI. Instead, 
    * we create a {@link ReportServlet}, and expose it through a {@link MvcEndpoint} in {@link #javaMelodyReportEndpoint()}. 
    */ 
    @Configuration 
    public class JavaMelodyConfiguration { 

     private final ServletConfig servletConfig; 

     @Autowired 
     public JavaMelodyConfiguration(ServletConfig servletConfig) { 
      this.servletConfig = servletConfig; 
     } 

     @Bean 
     MvcEndpoint javaMelodyReportEndpoint() { 
      ReportServlet reportServlet = new ReportServlet(); 
      // We initialize the servlet with the servlet configuration from the server that runs on server.port, as 
      // it currently only uses it to access the Collector instance, and some system information. 
      reportServlet.init(servletConfig); 

      return new MvcEndpoint() { 
       @Override 
       public String getPath() { 
        return "/monitoring"; 
       } 

       @Override 
       public boolean isSensitive() { 
        return false; 
       } 

       @Override 
       public Class<? extends Endpoint> getEndpointType() { 
        return null; 
       } 

       @GetMapping 
       public void report(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException { 
        reportServlet.service(httpRequest, httpResponse); 
       } 
      }; 
     } 

     @Bean 
     FilterRegistrationBean javaMelodyFilterRegistration() { 
      FilterRegistrationBean javaMelody = new FilterRegistrationBean(); 
      javaMelody.setFilter(monitoringFilter()); 
      javaMelody.setName("javamelody"); 
      return javaMelody; 
     } 

     @Bean 
     MonitoringFilter monitoringFilter() { 
      return new MonitoringFilter() { 
       @Override 
       protected boolean isAllowed(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException { 
        // We allow no access to the report (/monitoring) from this filter, access is done through the 
        // MvcEndpoint above, using the management port. 
        return false; 
       } 
      }; 
     } 
    } 

(我還張貼了這個位置:https://github.com/javamelody/javamelody/issues/601

相關問題