首页 > 其他分享 >dremio backend webserver 简单说明

dremio backend webserver 简单说明

时间:2023-01-20 22:56:06浏览次数:47  
标签:dremio register final webserver new servletContextHandler class backend

dremio 的webserver 是基于jetty+jersey 开发的web server 同时也和标准的dremio 服务一样实现了service 接口方便服务的启动
具体是由DACDaemon 调用触发的启动

webserver start 服务

 
 @Override
  public void start() throws Exception {
   // 使用了DremioServer 服务进行实际的启动
    server.startDremioServer(
      registry,
      config,
      credentialsServiceProvider,
      uiType,
      this::registerEndpoints
    );
  }

jetty+jersey 服务的启动

DremioServer 类中

public void startDremioServer(
    SingletonRegistry registry,
    DACConfig config,
    Provider<CredentialsService> credentialsServiceProvider,
    String uiType,
    Consumer<ServletContextHandler> servletRegistrer
  ) throws Exception {
    this.credentialsServiceProvider = credentialsServiceProvider;
    try {
      if (!embeddedJetty.isRunning()) {
       // 创建jetty 的connector 
        createConnector(config);
      // 添加handlers,包含了不少dremio 内部的服务
        addHandlers();
      }
 
      if (config.verboseAccessLog) {
        accessLogFilter = new AccessLogFilter();
       // 此处servletContextHandler 是在addHandlers 中初始化的
        servletContextHandler.addFilter(
          new FilterHolder(accessLogFilter),
          "/*",
          EnumSet.of(DispatcherType.REQUEST));
      }
 
      if (config.serveUI) {
        final String basePath = "rest/dremio_static/";
        final String markerPath = String.format("META-INF/%s.properties", uiType);
       // dremio 自己的一个servlet
        final ServletHolder fallbackServletHolder = new ServletHolder("fallback-servlet", registry.lookup(DremioServlet.class));
        addStaticPath(fallbackServletHolder, basePath, markerPath);
        servletContextHandler.addServlet(fallbackServletHolder, "/*");
      }
 
      if (servletRegistrer != null) {
        servletRegistrer.accept(servletContextHandler);
      }
 
      if (!embeddedJetty.isRunning()) {
        embeddedJetty.start();
      }
 
      setPortFromConnector();
      logger.info("Started on {}://localhost:" + port, config.webSSLEnabled() ? "https" : "http");
 
      serviceStarted = true;
    } catch (Exception ex) {
      throw new ServerErrorException(ex);
    }
  }

其他api endpoint 的注册

WebServer 类中,基于了DremioServer 提供的一个函数接口,注册了不少dremio 的api 接口
使用了jetty 提供的ServletHolder 动态的servlet 注册接口,同时利用了ResourceConfig

 
protected void registerEndpoints(ServletContextHandler servletContextHandler) {
  // security header filters
  SecurityHeadersFilter securityHeadersFilter = new SecurityHeadersFilter(registry.provider(OptionManager.class));
  servletContextHandler.addFilter(new FilterHolder(securityHeadersFilter), "/*", EnumSet.of(DispatcherType.REQUEST));
 
  // Generic Response Headers filter for api responses
  servletContextHandler.addFilter(GenericResponseHeadersFilter.class.getName(), "/apiv2/*", EnumSet.of(DispatcherType.REQUEST));
  servletContextHandler.addFilter(GenericResponseHeadersFilter.class.getName(), "/api/*", EnumSet.of(DispatcherType.REQUEST));
 
  // add the font mime type.
  final MimeTypes mimeTypes = servletContextHandler.getMimeTypes();
  mimeTypes.addMimeMapping("woff2", "application/font-woff2; charset=utf-8");
  servletContextHandler.setMimeTypes(mimeTypes);
 
  // WebSocket API
  final SocketServlet servlet = new SocketServlet(registry.lookup(JobsService.class), registry.lookup(TokenManager.class),
    registry.provider(OptionManager.class));
  final ServletHolder wsHolder = new ServletHolder(servlet);
  wsHolder.setInitOrder(1);
  servletContextHandler.addServlet(wsHolder, "/apiv2/socket");
 
  // Rest API
  ResourceConfig restServer = restServerProvider.get();
 
  restServer.property(RestServerV2.ERROR_STACKTRACE_ENABLE, config.sendStackTraceToClient);
  restServer.property(RestServerV2.TEST_API_ENABLE, config.allowTestApis);
  restServer.property(RestServerV2.FIRST_TIME_API_ENABLE, isInternalUS);
 
  restServer.register(dremioBinder);
  restServer.register((DynamicFeature) (resourceInfo, context) -> context.register(DremioServer.TracingFilter.class));
 
  final ServletHolder restHolder = new ServletHolder(new ServletContainer(restServer));
  restHolder.setInitOrder(2);
  servletContextHandler.addServlet(restHolder, "/apiv2/*");
 
  // Public API
  ResourceConfig apiServer = apiServerProvider.get();
  apiServer.register(dremioBinder);
  apiServer.register((DynamicFeature) (resourceInfo, context) -> context.register(DremioServer.TracingFilter.class));
 
  final ServletHolder apiHolder = new ServletHolder(new ServletContainer(apiServer));
  apiHolder.setInitOrder(3);
  servletContextHandler.addServlet(apiHolder, "/api/v3/*");
  }

dremio 自己的实现

包含了APIServer以及RestServerV2

  • 参考类图

基于了ResourceConfig 进行了动态扩展

 

 


有一个灵活的设计是,dremio 基于了注解实现动态注册,比如api 以及rest 都包含了自己的注解扩展

 
protected void init(ScanResult result) {
    // FILTERS
    register(JSONPrettyPrintFilter.class);
    register(MediaTypeFilter.class);
 
    // RESOURCES
   // 基于APIResource 注解,通过调用register 动态注册接口服务
    for (Class<?> resource : result.getAnnotatedClasses(APIResource.class)) {
      register(resource);
    }
 
    // FEATURES
    register(DACAuthFilterFeature.class);
    register(DACJacksonJaxbJsonFeature.class);
    register(DACExceptionMapperFeature.class);
 
    // EXCEPTION MAPPERS
    register(JsonParseExceptionMapper.class);
    register(JsonMappingExceptionMapper.class);
 
    // PROPERTIES
    property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true");
    property(RestServerV2.TEST_API_ENABLE, "true");
 
    final String disableMoxy = PropertiesHelper.getPropertyNameForRuntime(CommonProperties.MOXY_JSON_FEATURE_DISABLE,
      getConfiguration().getRuntimeType());
    property(disableMoxy, true);
  }

说明

以上是一个简单的dremio webserver 服务介绍,基于此可以了解dremio api的运行机制,可以更好的进行扩展,实际上dremio 的api 部分还包含了
认证、日志以及一些其他服务,可以通过阅读源码查看学习

参考资料

dac/backend/src/main/java/com/dremio/dac/server/WebServer.java
dac/backend/src/main/java/com/dremio/dac/server/DremioServer.java
dac/backend/src/main/java/com/dremio/dac/server/DremioServlet.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java

标签:dremio,register,final,webserver,new,servletContextHandler,class,backend
From: https://www.cnblogs.com/rongfengliang/p/17063363.html

相关文章

  • dremio daemon 的admin 管理cli 简单说明
    admincli提供了对于dremio维护的能力,包含了备份,清理元数据,导出profile,nessie维护,恢复,更新kv存储、重置密码。。。修复acl(企业版特性)参考代码处理基于了注解以及......
  • dremio DACModule 模块简单说明
    DACModule核心是进行dac一个帮助类,进行一些依赖的处理,方便在DACDaemon中使用,同时官方为了支持自定义基于动态类创建进行了扩展(DremioDaemon处理的)接口定义参考类图......
  • dremio DACDaemon 简单说明
    通过DremioDaemon我们知道dremio服务的启动时通过DACDaemon处理的DACDaemon的启动<wiz_code_mirror>       //包含了DACConfig,模块的类......
  • dremio DremioDaemon 简单说明
    DremioDaemon的核心是启动dremio服务同时进行一些依赖的注入简单启动说明包含了自动更新处理(主要是kv存储的,后边会介绍dremio一些任务)查找DACModule创建类,并初始化......
  • dremio 的配置处理简单说明
    dremio的配置基于了typesafe的config参考配置模块级别的配置sabot-module.conf dremio.classpath.scanning{base.classes+="com.dremio.dac......
  • dremio DACModule 模块加载简单说明
    dremioDACModule主要是模块加载初始化以及组合,是一个比较重要的模式,同时也支持基于配置进行加载(有点很多了,后边简单介绍)加载机制支持配置加载可以通过dremio运行配......
  • Caddy-用Go写的新一代可扩展WebServer
    前几天用Netmaker的时候发现它用Caddy替换掉了Nginx,用了后发现确实简单好用,就安利一下。Caddy是一个强大的、可扩展的平台,用Go编写,可以为你的站点、服务和应用程......
  • iDRAC8内网访问webserver没有任何问题,但是通过公网访问或者二级代理请求访问出现400访
    服务器名:R730XDiDRAC版本:2.83.83.83问题原因的诞生iDRAC提供的webserver很好用,但是在iDRAC2.80.80.80版本后就不能通过外网IP或者二级代理访问了,只要你访问的地址不是......
  • TinyWebserver项目简述
    webserver总结前言:最近做毕设刚好看了这个项目,所以做了一个总结,同时也希望可以帮到其他人。如果本文中有一些概念看不懂,比如说epoll之类的概念,可以自行百度,对这些概念的......
  • dremio distribution 模块简单说明
    以下简单说明下dremiodistribution,distribution核心是进行项目的发布,这种模式经常在apache类似项目中看到参考项目结构  简单说明jdbc-driver还是是对于jdbc......