2016-12-14 5 views
0

У меня есть веб-приложение Spring Boot. Он предоставляет REST API на порту 8080. Он также предоставляет порт управления 8081 с конечными точками управления Spring Boot Management (http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-monitoring.html). У меня нет пользовательской конфигурации Tomcat для этого. Я просто имею свойство management.port=8081 в моем application.properties файле.Как сделать Javamelody использовать другой порт (Spring Boot + два порта HTTP открыты)

Я JavaMelody сконфигурировано, как описано в https://github.com/javamelody/javamelody/wiki/UserGuideAdvanced#spring-boot-app (У меня есть пользовательский класс 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

это не решит мою проблему. Я все еще хочу, чтобы мое приложение показывало бизнес REST api на порту 8080, API управления 8081 и javamelody на 8081. –

ответ

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) 

Этот подход BTW предоставляет другие конечные точки на этих портах. Чтобы решить эту проблему и ограничить фильтр javamelody (/ мониторинг) на конкретный порт, вам нужно будет написать фильтр, который проверяет путь (сервлет и путь фильтра), который запрашивается из допустимых портов, имея в виду, что порядок этих фильтров важен.

На основании этого ответа и частичному исходный код, который я уже доступен, когда я ответил на этот вопрос, я опубликовал в блоге об этой теме на 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 с использованием порта управления и контекста контекста управления, я бы попытался сопоставить фильтр Javamelody для/admin/monitoring – ootero

+0

Я имел в виду, что server.servlet-path установлен в /, management.context-path установить в/admin – ootero

0

Вы можете использовать ReportServlet через MvcEndpoint. Что-то вроде этого:

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)