为了账号安全,请及时绑定邮箱和手机立即绑定

dropwizard-core模块解析

标签:
深度学习

简介

Dropwizard是一款开发运维友好、高效、RESTful web服务的框架。Dropwizard将稳定、成熟的java生态系统中的库整合为一个简单的、轻量级的包,即跨越了库和框架之间的界限,使得我们可以更关注于业务本身。
Dropwizard 集成的三方包:Jersey,Jetty,Jackson,metrics,其他

HelloWorld

学习程序的常规操作,helloworld。了解大致的应用启动流程。

dropwizard-core

该模块是dropwizard的核心模块,掌握了这个模块,对dw的基本运行机制等大部分的常用功能基本就了解了。
core官方文档

Application

Application类是dw的核心类,使用dw的应用必须需要继承该类,比如helloworld.
Application的核心函数为run,在该部分会完成应用初始化和启动

    public void run(String... arguments) throws Exception {        //注意创建bootstrap对象时赋的其他对象,比如默认使用的ConfigurationSourceProvider为FileConfigurationSourceProvider
        final Bootstrap<T> bootstrap = new Bootstrap<>(this);        //添加默认的command,只有check和server。
        addDefaultCommands(bootstrap);        //调用app的init方法,在这里可以addBundle,addCommand,设置configuration的替换方法,由应用自身实现
        initialize(bootstrap);        //注册metrics,为监控服务器做准备
        bootstrap.registerMetrics();        //创建命令执行器,Cli类解析命令行输入参数并执行命令
        final Cli cli = new Cli(new JarLocation(getClass()), bootstrap, System.out, System.err);        //根据输入参数执行command,比如利用server Command为应用启动HTTP 服务器
        if (!cli.run(arguments)) {            // only exit if there's an error running the command
            onFatalError();
        }
    }

Configuration类

Configuration类是core的核心类之一,YAML配置文件的对象表示
Configuration主要功能实现在dropwizard-confiugration模块实现
dropwizard-confiugration模块的主要功能是加载、解析、绑定和验证配置文件。核心接口ConfigurationFactory

Bootstrap类

Bootstrap类是core模块的核心类之一,官方定位为application的预启动环境。我个人将其作用理解为完成application启动前的环境准备和初始化,比如添加Bundles、Commands或者注册Jackson modules,这样就能允许我们把一些自定义的类型加载到配置中。
其实,根据Bootstrap的构造器我们能大致看出类的功能,Bootstrap主要负责构造器里的对象的管理(get和set),然后提供addBundle和addCommand功能。

    public Bootstrap(Application<T> application) {        this.application = application;        //Jackson的主要类,用于Java对象和Json对象相互转换
        this.objectMapper = Jackson.newObjectMapper();        //维护bundle的列表
        this.configuredBundles = new ArrayList<>();        //维护command的列表
        this.commands = new ArrayList<>();        //Validator负责配置文件解析后的验证功能
        this.validatorFactory = Validators.newValidatorFactory();        //度量对象,用于@Timed等
        this.metricRegistry = new MetricRegistry();        //配置文件的读取方式,具体见dropwizard-configuration模块
        this.configurationSourceProvider = new FileConfigurationSourceProvider();        this.classLoader = Thread.currentThread().getContextClassLoader();        this.configurationFactoryFactory = new DefaultConfigurationFactoryFactory<>();        //HealCheck,负责应用状态检查,可以查看应用是否正在工作
        this.healthCheckRegistry = new HealthCheckRegistry();
    }
.........    public void addCommand(ConfiguredCommand<T> command) {
        commands.add(command);
    }
.........//注意,init()添加bundle时进行了初始化
    public void addBundle(ConfiguredBundle<? super T> bundle) {
        bundle.initialize(this);
        configuredBundles.add(bundle);
    }

Environment类

Environment类是dropwizard的应用环境。包含应用提供的所有的的 Resources, servlets, filters, Health Checks, Jersey providers, Managed Objects, Tasks, and Jersey properties。
Environment类的属性如下

    private final String name;    private final MetricRegistry metricRegistry;    private final HealthCheckRegistry healthCheckRegistry;    private final ObjectMapper objectMapper;    private Validator validator;    private final JerseyContainerHolder jerseyServletContainer;    private final JerseyEnvironment jerseyEnvironment;    private final MutableServletContextHandler servletContext;    private final ServletEnvironment servletEnvironment;    private final LifecycleEnvironment lifecycleEnvironment;    private final MutableServletContextHandler adminContext;    private final AdminEnvironment adminEnvironment;    private final ExecutorService healthCheckExecutorService;

属性基本全部为final修饰,主要方法几乎全部为get方法,只有唯一一个set方法。所有,你可以直接把Environment理解为提供各种服务环境或者对象的一个容器,并且维护的对象只有Validator 可变。

dw应用的Jetty服务器是如何起来的run sever x.yml

dropwizard-core的cli包负责执行传入的命令,入口为Cli.run(String... arguments)
Cli.run->ConfiguredCommand.run->EnvironmentCommand.run

    protected void run(Bootstrap<T> bootstrap, Namespace namespace, T configuration) throws Exception {        final Environment environment = new Environment(bootstrap.getApplication().getName(),
                                                        bootstrap.getObjectMapper(),
                                                        bootstrap.getValidatorFactory(),
                                                        bootstrap.getMetricRegistry(),
                                                        bootstrap.getClassLoader(),
                                                        bootstrap.getHealthCheckRegistry());        //为注册器registry配置生命周期,同app生命周期
        //@Timed @Metered 产生的报告和生命周期关联
        configuration.getMetricsFactory().configure(environment.lifecycle(),
                                                    bootstrap.getMetricRegistry());        //配置Envrionment.
        //调用DefaultServerFactory.configure
        // 的Registering jersey handler,Registering admin handler。jetty sevrer 必备属性
        configuration.getServerFactory().configure(environment);        // 运行bundles,Bundle实现ConfiguredBundle,实现run方法和init方法
        bootstrap.run(configuration, environment);        //应用自定义的run方法。用于向environment注册Resource,设置鉴权等
        application.run(configuration, environment);        //Runs the command with the given {@link Environment} and {@link Configuration}
        //一般为server command--产生并启动app的服务器
        run(environment, namespace, configuration);
    }

执行完run(environment, namespace, configuration),Jetty服务器就启动成功了。

dropwizard-core模块Server的核心接口为ServerFactory,实现类为DefaultServerFactory。
启动Jetty Server为命令为server command,启动类为ServerCommand

    protected void run(Environment environment, Namespace namespace, T configuration) throws Exception {        final Server server = configuration.getServerFactory().build(environment);        try {
            server.addLifeCycleListener(new LifeCycleListener());
            cleanupAsynchronously();
            server.start();
        }

为了更好的理解应用启动过程,需要对Jetty做一些了解。

原文出处:https://www.cnblogs.com/ilovena/p/9864836.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消