在dubbo工程中,使用druid監控


介紹:在dubbo項目中,使用druid的監控功能

 

問題:因為,在網上找勒,很多的資料,顯示的都是需要在web.xml中配置

<servlet>
      <servlet-name>DruidStatView</servlet-name>
      <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>DruidStatView</servlet-name>
      <url-pattern>/druid/*</url-pattern>
  </servlet-mapping>

可是,我們一般搭建的dubbo項目,使用的shell腳本啟動的,java命令啟動,沒有使用到Tomcat容器,雖然可以使用,

    但是會顯得,很浪費

 

解決:

    其實,思路是借鑒,dubbo-monitor-simple 工程的思路,在dubbo的啟動項目中,啟動jetty容器,去監控,這個監控

這個容器也不是很大,所以不會有多少性能的損失。

    下面貼出代碼,以及遇到的問題,貼出的為主要代碼,是在大家已有的dubbo項目上添加即可

pom.xml

<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty</artifactId>
    <version>6.1.26</version>
</dependency>

描述: dubbo啟動jetty依賴的jar

 /src/main/resources/META-INF/dubbo/com.alibaba.dubbo.container.Container

myjetty=com.xxxx.insurance.service.demo.common.container.JettyContainer

/src/main/java/com/xxxx/insurance/service/demo/common/container/JettyContainer.java

// 日志監控系統的
        handler.addServletWithMapping(StatViewServlet.class, "/druid/*");

代碼如下:

public class JettyContainer implements Container {  
  
    private static final Logger logger = LoggerFactory.getLogger(JettyContainer.class);  
  
    public static final String JETTY_PORT = "dubbo.jetty.port";  
  
    public static final String JETTY_DIRECTORY = "dubbo.jetty.directory";  
  
    public static final String JETTY_PAGES = "dubbo.jetty.page";  
  
    public static final int DEFAULT_JETTY_PORT = 8090; //jetty容器端口  
  
    SelectChannelConnector connector;  
  
    public void start() {  
        String serverPort = ConfigUtils.getProperty(JETTY_PORT);  
        int port;  
        if (serverPort == null || serverPort.length() == 0) {  
            port = DEFAULT_JETTY_PORT;  
        } else {  
            port = Integer.parseInt(serverPort);  
        }  
        connector = new SelectChannelConnector();  
        connector.setPort(port);  
        ServletHandler handler = new ServletHandler();  
  
        String resources = ConfigUtils.getProperty(JETTY_DIRECTORY);  
        if (resources != null && resources.length() > 0) {  
            FilterHolder resourceHolder = handler.addFilterWithMapping(ResourceFilter.class, "/*", Handler.DEFAULT);  
            resourceHolder.setInitParameter("resources", resources);  
        }  
          
        ServletHolder pageHolder = handler.addServletWithMapping(PageServlet.class, "/*");  
        pageHolder.setInitParameter("pages", ConfigUtils.getProperty(JETTY_PAGES));  
        pageHolder.setInitOrder(2);  
            //這里是新添加的,作用於druid日志監控系統的  
                handler.addServletWithMapping(StatViewServlet.class, "/druid/*");  
          
        Server server = new Server();  
        server.addConnector(connector);  
        server.addHandler(handler);  
        try {  
            server.start();  
        } catch (Exception e) {  
            throw new IllegalStateException("Failed to start jetty server on " + NetUtils.getLocalHost() + ":" + port  
                    + ", cause: " + e.getMessage(), e);  
        }  
    }  
  
    public void stop() {  
        try {  
            if (connector != null) {  
                connector.close();  
                connector = null;  
            }  
        } catch (Throwable e) {  
            logger.error(e.getMessage(), e);  
        }  
    }  
  
}  

描述:直接copy,dubbo的JettyContainer.java過來,修改就可以啦

啟動代碼

public static void main(String[] args) {
        args = new String[]{"spring","myjetty"};
        com.alibaba.dubbo.container.Main.main(args);
    }

腳本啟動

conf/ dubbo.properties

dubbo.container=spring,myjetty
dubbo.log4j.file=logs/dubbo-demo-provider.logdubbo.log4j.level=WARN

最后,啟動,訪問

http://localhost:8080/druid/index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM