4

デフォルトでは、Togglz 管理コンソールはアプリケーション ポート (server.portプロパティで設定) で実行されます。で公開したいmanagement.port。私の質問:それは可能ですか?

4

1 に答える 1

4

Togglz >= 2.4.0 を使用している場合、この機能はすぐに利用できます。

古いリリースの場合の解決策は次のとおりです。

management.portでラップすることで、生のサーブレットを公開することができましたMvcEndpoint。これを行う最も簡単な方法は、すべてのジョブを実行する Spring Cloud モジュールを使用することです (たとえば、HystrixStreamEndpoint で)。

public class HystrixStreamEndpoint extends ServletWrappingEndpoint {

    public HystrixStreamEndpoint() {
        super(HystrixMetricsStreamServlet.class, "hystrixStream", "/hystrix.stream",
                true, true);
    }

}

残念ながら、TogglzConsoleServletリクエスト URI からプレフィックスを抽出する方法が原因で、パスに関係するハックがもう 1 つあるため、ソリューション全体が少し見苦しく見えます。

@Component
class TogglzConsoleEndpoint implements MvcEndpoint {

    private static final String ADMIN_CONSOLE_URL = "/togglz-console";
    private final TogglzConsoleServlet togglzConsoleServlet;

    @Autowired
    TogglzConsoleEndpoint(final ServletContext servletContext) throws ServletException {
        this.togglzConsoleServlet = new TogglzConsoleServlet();
        togglzConsoleServlet.init(new DelegatingServletConfig(servletContext));
    }

    @Override
    public String getPath() {
        return ADMIN_CONSOLE_URL;
    }

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

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

    @RequestMapping("**")
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {
            @Override
            public String getServletPath() {
                return ADMIN_CONSOLE_URL;
            }
        };
        togglzConsoleServlet.service(requestWrapper, response);
        return null;
    }

    private class DelegatingServletConfig implements ServletConfig {

        private final ServletContext servletContext;

        DelegatingServletConfig(final ServletContext servletContext) {
            this.servletContext = servletContext;
        }

        @Override
        public String getServletName() {
            return TogglzConsoleEndpoint.this.togglzConsoleServlet.getServletName();
        }

        @Override
        public ServletContext getServletContext() {
            return servletContext;
        }

        @Override
        public String getInitParameter(final String name) {
            return servletContext.getInitParameter(name);
        }

        @Override
        public Enumeration<String> getInitParameterNames() {
            return servletContext.getInitParameterNames();
        }
    }
}
于 2016-11-29T14:56:40.303 に答える