play_playbook - CSDN
精华内容
参与话题
  • Play! 是一种高效率的 Java 和 Scala Web 应用程序框架,它能够用来开发「响应式」 Web 应用,同时它也集成了现代 Web 应用程序开发所需的组件和 API。本文将介绍一下 Play! 的基本性质以及利用该框架开发 Web 程序...

    Play! 是一种高效率的 Java Scala Web 应用程序框架,它能够用来开发「响应式」 Web 应用,同时它也集成了现代 Web 应用程序开发所需的组件和 API。本文将介绍一下 Play! 的基本性质以及利用该框架开发 Web 程序的优势。

    响应式 Web 开发框架


    Play! 抛弃了传统的 Java Web 框架的模式,而是选择拥抱「响应式」(Reactive)应用的理念,从头开始设计,这使得 Play! 可以够构建出即使在高负载下也能够对用户行为进行实时响应的 Web 应用。 Play! 作为一个全栈「响应式框架」主要有如下特点:

    1. 响应式(Responsive—— 在用户层面,Play! 能够快速响应用户的行为
    2. 可伸缩(Scalable—— 在负载层面,Play! 能实现良好的水平扩展
    3. 事件驱动(Event-driven—— Play! HTTP Server 就是基于事件模型实现的

    接下来我们就 Play!的这几个主要的特点进行介绍。

    事件模型 Web 服务器(Evented Web Application Server

    Play 2.6.x 之前,Play! HTTP Server 是基于 Netty 实现的,最新版的 Play 2.6.x 是基于 Akka HTTP 实现的,在介绍 Play! HTTP Server 的优势之前,我们先看一下传统的 Java Web 框架所采用的 HTTP Server 是怎样的。

    当前比较主流的实现 HTTP Server 的模型主要有两类——「线程模型」以及「事件模型」。

    线程模型服务器(THREADED SERVERS

    传统的 Java Web 框架所采用的服务器就是基于线程模型来实现的,比如非常流行的 Apache Tomcat,该模型的工作方式如下图所示:


    「接收者线程」(Accpter thread)接受客户端的 HTTP 请求,然后将这些请求分配给「请求处理线程」进行处理。

    这种模型的弊端就是,「工作线程」(也就是上面提到的「请求处理线程」)是有限的,而客户端发来的请求数量往往会大于「工作线程」的数量。当此种情况发生时,那些没有得到处理的线程就会一直处于阻塞和等待状态,反映到用户层面就是页面迟迟得不到响应,如果等待时间过长,耐心的用户最终会看到请求超时(Request timeout)的信息,急性子的用户就会关掉这个页面。

    另外采用线程这种方式也非常地耗费资源,如果某个请求很耗费时间,那么处理该请求的工作线程大概是这样工作的:


    其中绿色是程序运行时间,红色是等待时间,可以看到由于 I/O 操作比较慢,所以这个线程的工作时间大部分都在等待,极大地消耗了资源,如果是采用多线程,那消耗的资源将会多倍增加。

    事件模型服务器(EVENTED SERVERS

    Play! HTTP Server 是基于 Netty 或者 Akka HTTP 实现的,这两个框架都具有异步非阻塞的优点。我们先看一下 Play! 的事件模型服务器是如何工作的:


    我们知道,当用户发送一个请求的时候,往往这个请求包含了许多操作,而 Play! 则能将这些请求分割为一个一个的事件,然后异步去处理这些事件。例如,当某一个事件正在被操作系统处理的时候,这个过程可能会花费一些时间,之前说过,如果线程一直等待这个事件执行完然后再去执行下一个事件就有点浪费资源了,所以在这个等待时间里,event loop(消息线程)可以去执行事件队列中的其他事件。当某个事件执行完之后,就会发出一个中断,这个中断也算一个事件,然后加入到事件队列中,等待执行。这种异步非阻塞的模式使得 Play! 能够以较少的资源应对大流量的访问。反映在用户层面就是,Play! 能够快速地对用户的行为作出响应。

    为了与「线程模型」进行对比,我们画一个类似的图来解释为什么「事件模型」消耗的资源更少而处理的请求更多:


    图中绿色的部分为事件的执行时间,橙色部分为「空闲时间」,注意这里是「空闲时间」而非前面所说的「等待时间」,在这个空闲时间内,event loop 可以去执行其他事件而不必等待前面某个事件执行完成,当某个事件执行完成之后,会发出中断,这个中断也会产生一个新的事件,最终 event loop 也会执行这个事件。这就是「事件模型」处理某个请求的流程,可以看到,没有了等待时间,大大提高了程序运行的效率,也使得系统能够以较少的资源处理大量的请求。

    异步非阻塞

    Play! 通过重新设计并实现了自己 HTTP Server 这使得 Play! 能够以「异步」的方式去处理每一个请求。在利用 Play! 进行开发的时候,Play! 默认配置的 controller 就是异步的,所以我们可以利用 Play! 很方便地写出异步非阻塞的代码。我们知道,在 Java8 之前,要编写异步非阻塞的代码往往需要使用回调,但是当业务逻辑变得复杂,回调变多的时候就会出现传说中的 "回调地狱",这使得代码的可读性极差。而 Scala 语言引入了 Future ,极大地简化了多个回调的处理,使代码看上去优雅很多(关于如何在 Play! 中利用Future实现异步逻辑,我们将会在后面的文章中进一步的介绍)。所以在 Play! 中利用 scala 编写异步代码将会变得非常高效。

    无状态(Stateless

    Play! 框架抛弃了 Servlet/JSP Session 等概念,内置没有提供方法将对象与服务器实例进行绑定,在每次 HTTP Request 之间不会在 Server 端存储状态,所需的状态都需要在 HTTP Request 之间传递,这样做的好处就是使得应用在负载层面实现了良好的水平扩展,接下来我们分别介绍一些有状态的部署方式与无状态的部署方式。

    有状态部署


    如果我们在 session 中保存了大量与客户端的「状态信息」的话,为了防止某台机器宕机而导致用户与服务器保存的会话状态丢失,我们需要在各个节点之间共享这些「状态信息」。比较常见的做法是采用集群,比如采用 tomcat 或者 jboss 的集群功能,采用此种方式并不能通过增加节点来解决系统负载过大的问题,因为随着节点增加,各个节点之间 session 的通信会增加,从而使系统开销增大。所以采用有状态的部署方式不能使系统具有良好的伸缩性。

    无状态部署


    如图所示,采用无状态的部署方式,每个节点不保存诸如 session 之类的状态信息,各个节点之间也没有共享状态,它们彼此都是独立的。当系统的负载增加时,我们只需要增加一个节点,然后在前端通过均衡负载就可以使系统的性能提高。这样就使得系统具有良好的伸缩性。当然,没有了 session,那 Play! 如何来保存状态呢,我们可以使用 Play! 中基于 Cookie 的客户端用户会话以及「外部缓存」(这些在之后的文章中会介绍)。

    ROR风格

    对于很多公司而言,快速地开发出一款产品并上线非常重要,由于 ROR Ruby on Rails 风格的框架在开发效率上面非常高,所以很多公司在快速构建应用时往往会选择这类框架,而不是传统的 Java 框架。


    通过上图可以对比一下 Play! 与传统的 Java EE 框架的区别,可以看到 Play! 在架构上更加清晰简洁。在 Play! 之前,相比于 ROR 风格的框架,传统的 Java Web 框架在开发网页应用的时候往往耗时比较长,原因主要有两个:

    1、依赖 Servlet

    传统的 Java Web 框架都是基于 Servlet 来构建的,开发人员开发的应用也需要在 Servlet 容器中运行,但是这就带来了一个后果,开发人员每次修改完代码之后,都需要重新启动 Web 服务器才能看到修改后的效果。如果某一个项目规模较小,那重启以及编译的时间还能接受,但是如果项目很大,那开发过程中所花的大部分时间都浪费在重启以及编译上面了。

    Play! 框架通过 ClassLoader 在源代码修改的时候动态加载类,解决了修改代码需要重启服务器的问题,使得开发效率变高。

    2复杂的 XML 配置文件

    传统的 Java Web 框架在开发某个 Web 应用的时候需要引入大量的 XML 配置文件,这些文件在配置起来比较麻烦,如果数量很多且分散在不同的文件下面会使得维护成本增加。

    Play! 框架深谙 ROR 之道,采用约定优于配置,只有一个全局的配置文件 application.conf,其他大部分配置都是默认的,我们只需要按照它约定的去做好了。

    RESTFul

    传统的 Java Web 框架利用 Servlet Http协议隐藏了起来,也就是说开发者不能很直观地看到某一个请求对应的某个操作。而 Play! 在设计上拥抱了 Http 协议,比如我们要获取一个用户列表,我们就可以在 route 文件中这样写:

    GET /customer/list controllers.CustomerController.list

    那么 /customer/list 这个 URL 对应的就是 CustomerController 中的 list 方法。

    这样看上去更加直观。

    强类型模板

    Play! 2 开始, Play! 的模板就全面拥抱了 Scala,所以 Play! 的模板都是可以编译的 Scala 函数,这就意味着我们可以在编译的时候直接在浏览器或者控制台中看到模板的错误信息,而不用等到将应用部署,调用页面之后才能发现错误。

    展开全文
  • Play!框架学习笔记(一)

    千次阅读 2018-06-01 08:31:27
    本人很菜,首次接触Play框架,还在云里雾里的状态。在这里,我结合自己的学习思路(就是哪里不懂马上查),把从网上收集的资料整合起来,方便自己学习。...

    本人很菜,首次接触Play框架,还在云里雾里的状态。在这里,我结合自己的学习思路(就是什么不懂查什么),把从网上收集的资料整合起来,方便自己学习。

    一、Play框架下载安装

    (1)进入官网:点击打开链接
    划到下面,选择下载.zip安装包
    (2)解压到适当位置(如E:\play-2.2.6),并将此路径添加到Path环境变量中。
    (3)打开cmd,进入Play跟某(即E:\play-2.2.6),输入Play,将出现如下画面,表示Play可以正常运行。

    二、创建一个新应用/项目

    (1)打开cmd,切换至你希望放置helloworld项目的目录,输入“play new helloworld”。
    根据提示需要再输入一遍项目名,然后需要选择创建Scala还是Java,我选择java。

    (2)cd helloworld进入项目。输入“play”,当出现[helloworld] $时表示已经入play控制台;然后输入“run”,服务器将被启用,自动重载功能启动,Play!将检查项目,需要重新编译源代码。如果直接输入的是“play run”,则直接启动应用,最后停留画面如下:
    可以知道启动服务器在9000端口

    (3)在浏览器键入http://localhost:9000/看到Play应用程序的默认页面:

    三、Play框架是什么?

    1、Play Framwork是一个轻快的REST风格的J2EE Full-stack框架。
    (1)RESTrepresentational State Transfer,表述性状态转移)
    REST定义了应该如何正确地使用Web标准(如HTTP和URI),如果你在设计应用程序时能坚持REST原则,你将会得到一个使用了优质Web架构的系统。五条关键原则如下:
    • 为所有“事物”定义ID
    • 将所有事物链接在一起
    • 使用标准方法
    • 资源多重表述
    • 无状态通信

    (2)SSHStruts+Spring+Hibernate)的整合就是Full-stack框架。

    Full-stack 的设计,意味着各层能够无缝的集成在一起,遵循DRY原则(don't repeat yourself),将各层共用的东西,抽取出来,并通过自顶向下的设计,无缝的集成在一起,粘合在一起,达到更高层次、更粗粒度的重用,同时为了保证灵活的可扩展性,在更高、更粗的粒度上遵守开放-封闭的原则,在各层的各个关键点,要提供诸多的钩子,回调的接口,供使用者扩展。full-stack的设计,在层与层之间,并不一味的追求松散的机制,而是相反,在层与层之间增强一定的内聚性,粘合力,以此来达到粗粒度的封装与重用。

    可以说full-stack 的设计,其爆发出的威力是巨大的,相对普通的单一层面的设计,在开发效率上不是一个层次上的,基于28原理的设计,可以满足80的调用者直接开发,19%的调用者,通过扩展点进行扩展来满足需求,对于1%钻角尖的需求,自己去造轮子。

    spring, ruby on rails, Zend都是这样的工业级强度的full-stack的设计,我们的设计如果以他们为中心,生产力得到了极大的提高。

    2、Play框架的优点(先写几个容易理解的,在今后的实验中切身感受到其他优点的时候再进行补充)

    • 快——哪里快?
    • 没有配置文件——指没有web.xml等配置文件(如果自己组合SSH,得配置web.xml,spring和struts的配置文件,要配很多bean,注入以及过滤器
    • 更新代码将自动刷新浏览器。我们不需要重新启动服务器,而是在浏览器中直接看到最新效果。

    展开全文
  • play框架入门操作

    千次阅读 2018-07-14 21:56:43
    Play的基本特性: 1.Play框架使用宁静的开发风格,不用严格按照复杂的J2EE规范,是Java的敏捷开发的首选。 2.Play框架提供多种支持:NIO,JPA的,Groovy以及各种工具类。 3.Play框架会自动编译的Java源文件,而...
    Play的基本特性:

            1、Play框架使用REST的开发风格,不用严格按照复杂的J2EE规范,是Java敏捷开发的首选。

       2、Play框架提供多种支持:NIO,JPA,Groovy以及各种工具类。

       3、Play框架会自动编译Java源文件,而不用重新启动Web服务器将代码热加载至JVM。

       4、简单的无状态(各自维护各自状态)MVC架构。

       5、Play框架提供完整,直接的方式去访问HTTP,是Play框架和其他Java Web框架最根本的差异。

    Play安装与配置:

            1、下载Play框架,配置环境变量

       2、打开cmd,cd到Play框架所在的目录,使用play new命令创建一个新的应用。

       3、使用 play 运行命令来启动项目。

       4、访问端口9000即可访问到play应用 。

    Play项目引入到IDE:

         1、play eclipsify 命令可以将play应用转化为Eclipse的项目

       2、play neatbeansify命令可以将play应用转化为Netbeans的项目。

       3、play idealize命令可以将play应用转化为IDEA项目。

       使用IDE引入项目的方式引入play项目即可。

    Play的生命周期:

            1、Play应用服务器接收客户端的HTTP请求.

       2、通过路由找到请求对应的动作处理方法。

       3、进行应用自定义的逻辑操作。

       4、将处理结果转换成http响应返回客户端。

    Play项目的目录结构:

       1、app :存放的是应用的逻辑代码,一些java代码(使用java开发),视图,实体类,控制器等。

       2、conf :应用有关的所有配置文件,例如:系统配置文件,路由配置文件,xml配置文件等。

       3、lib :存放了应用所需的类库。

       4、public :存放系统静态资源,图片,js,css等。

    路由的配置:

       1、Play应用中通过配置路由将http请求映射到用户自定义方法,执行对应的逻辑处理

       2、配置步骤 :路由的配置分为三部分,HTTP方法类型,URI和映射的动作路径,具体写法:

        POST   /myapp/findAllUsers  controllers.AppUserController.findAllUsers

       3、HTTP方法类型根据请求方法的类型定义,GET 和 POST 方法比较常见。

       4、如果请求需要传递参数,则可以通过这样的方式进行传参

        GET   /myapp/findUser/:userId     controllers.AppUserController.findUserByUserId(user:String)

       5、配置中还可以使用正则表达式进行参数匹配,比较灵活。




    展开全文
  • Play2 for Java(二:开始)

    千次阅读 2017-12-06 11:20:53
    2. Module2 开始从本模块开始,我们开始学习Play。我们会从Play2官网下载最新的Play,并配置环境变量,并使用命令行来生成一个基础的Play应用 2.1 下载最新的PlayPlay从2.3版本开始就不支持play命令行的方式了,我们...

    2. Module2 开始

    从本模块开始,我们开始学习Play。我们会从Play2官网下载最新的Play,并配置环境变量,并使用命令行来生成一个基础的Play应用
    

    2.1 下载最新的Play

    Play从2.3版本开始就不支持play命令行的方式了,我们采用官方SBT方式来开始我们的Play之旅。
    首先,java版本必须是1.8的。
    然后呢,官方目前提供了很多的demo,都含有一个叫做./sbt和sbt.bat的启动器的启动器,可以用于Unix和Windows系统,即使你不预先安装SBT,它也是可以帮你下载所需的项目依赖包。
    当然学习的目的就是要比别人多会一点,我们还是下载SBT。
    

    这里写图片描述

    msi的安装应该是很简单的~
    
    Step:1
    

    这里写图片描述

    Step2:
    

    这里写图片描述

    Step3:
    

    这里写图片描述

    Step4:
    

    这里写图片描述

    Step5:环境变量(配置path的我就省了,基本跟喂嘴里没啥区别了吧)
    

    这里写图片描述

    Step6:下面开始以模板形式创建我们的Play引用
    
    sbt new playframework/play-java-seed.g8
    命令行执行如上的命令,不需要进入sbt console,直接运行即可,然后参考下面的来做,就是一步一步的带你进行:
    

    这里写图片描述

    Step7:run
    
    method 1:
    cd play.enjoy
    sbt
    [play-enjoy] $ run
    //下面是拓展
    [play-enjoy] $ compile  编译
    [play-enjoy] $ test     执行测试
    
    method 2:
    sbt run

    这里写图片描述

    访问localhost:9000即可。
    
    play是具有热部署的功能的.(Google浏览器一直502,没办法只能用火狐截的图,上述的两种run方法,我建议用第一种,它会检测你的build文件,并为你下载完整的包。第二种虽然也会下载依赖包,但是有时会出问题)
    

    2.2 IDE

    我用的是IDEA,其实比较方便:
    Step1:
    

    这里写图片描述

    Step2:
    

    这里写图片描述

    Step3:
    

    这里写图片描述

    2.3 工程结构

    如果您使用过任何常见的MVC材料、框架和其他语言,比如ASP.NET MVC或Ruby on Rails,以及Spring MVC,你可能会发现一个Play!应用程序的结构相当熟悉。
    

    这里写图片描述

    工程结构中的关键文件夹是app文件夹、conf文件夹、project文件夹、public文件夹和test文件夹。该结构在应用程序的不同方面提供了清晰的分离。
    
    app文件夹是存储应用程序源代码的主要位置。因此,控制器(controller)、视图(View)和模型(Model)代码通常都存在于这个文件夹中。我们刚刚生成的应用程序已经遵循我们约定,为我们生成了controller和view文件夹(也可以说是package)。虽然不需要强制的遵循这个模式,但是有一些约定,尽管它们是可配置的,这些约定它们依赖于一个特定的文件夹结构,为了打破常规的约定,那么您必须改变它。
    
    conf文件夹负责持有与应用程序的配置相关的非源文件。这包括重要的application.conf文件,以及应用程序的默认或者主要的配置数据的来源。它还包含路由文件,它是应用程序的所有路由或端点的中心定义,以及它们所需的参数(你可以类似的想象为Spring MVC中的@RequestMapping)。
    
    project文件夹包含用于定义构建和运行应用程序所需的项目和配置的文件。您会注意到构建文件实际上是一个Scala文件。这是因为底层构建系统是SBT;这个简单的构建工具使用Scala和类似于Scala的DSL来构建定义。现在,我们应该忘记这些文件实际上是Scala,忽略了可能出现的问题。我们将把它当作一个特殊的DSL来配置项目构建。
    
    public文件夹是一个包含应用程序锁想要的所有静态资产,例如图像、javascript和CSS的文件夹。生成的项目骨架生成了若干带有资产的文件夹。值得注意的是,这个约定不需要遵循,而文件夹和文件可以根据您的个人喜好更改。
    
    最后,是test文件夹。test文件夹是创建在应用程序的演进过程中创建的任何测试用例的默认保存位置。这些可以从单元测试到验收测试。这个文件夹还可以包含您可能需要的任何测试特定资源。同样,这个约定是可配置的。
    

    2.4 配置

    application.conf是应用程序最主要的配置文件。我们所生成的项目的配置文件,通过注解的方式指导你如何调整更常见的基于常规的配置。
    
    我们可以在配置文件中配置一下全局变量(使用Spring的应该知道@Value的作用吧,一样的),然后在我们的代码中,就可以通过Play的帮助方法,获取到我们所配置的值。
    

    2.5 错误处理(Error Handler)

    这里写图片描述

    这里写图片描述

    这里写图片描述
    这是你在使用Play!时遇到的另一个重要概念是描述性的错误处理。当Play!报告错误时,它尝试尽可能地描述错误。

    这里写图片描述

    这里写图片描述

    我们在上面列出了正确的执行结果页面,那么现在假如,如果我们故意在route中创建一个错误的状态,我们将在编译阶段得到错误通知。或者如果应用程序已经运行,这时我们修改route,那么Play!将将通过一个HTML的错误页面通知我们。
    
    在这门课的route模块中,我们将看到为什么会发生这样的事情,但是现在已经足够了解Play!提供的错误检查和类型安全不仅在常见的controller、model和service有用,而且在容易出现拼写错误或者类似问题的地方,比如route和view。
    
    PS:下面Play!的依赖会很慢,准备好梯子,最好在网速比较好的情况下开始
    请原谅我用的Scala版本~~
    
    展开全文
  • 教你下载google play 上的某个APK

    万次阅读 2018-09-05 14:56:21
    访问: https://apps.evozi.com/apk-downloader/ 进入该网站后,输入google play 的apk 所在详情页面地址,如 https://play.google.com/store/apps/details?id=com.xxx ,然后就能直接下载啦。...
  • 前提:自己准备fanqiang的梯子是chrome重度用户,一直想用电脑手机同步使用,但是手机上安装chrome登陆谷歌帐号的时候一直提示:您必须先更新google play服务,然后才能运行...各种搜索解决方法无果....后面灵机一动...
  • 国内从google play下载软件

    万次阅读 2020-08-06 16:48:46
    https://apkpure.com/cn/
  • 有的android应用程序需要安装google play services才能使用,网上大部分方法尝试过都无法解决本人遇到的问题。 但具体问题具体分析,很多时候需要多尝试,下面方法是亲测有效的,如果你尝试了很多方法还是不行,...
  • 访问 ... 进入该网站后,输入google play 的apk 所在详情页面地址,如 https://play.google.com/store/apps/details?id=com.xxx ,然后就能直接下载啦。 上述网站如果无法访问请连接VPN
  • 打开出现:你的设备不支持Google Play服务,因此你无法运行的情况; 解决方案: 既然没有安装,我们手动安装不就完事了; 这里介绍一个简单易操作的方法: 通过GG服务框架安装器进行安装; 操作步骤: 1. ...
  • 对于Google的应用来说,一直提醒这个问题
  • 最新 在线下载谷歌play apk 地址

    万次阅读 2018-10-12 14:34:11
    https://www.allfreeapk.com/merge-plane,15013685/what-is-happy.html
  • 我之前以为是校园网的问题,排查了一下,无意中解决了。 在使用某些加速器的模式X的时候,会安装OpenVPN这个软件,会在网络适配器中添加一个名为TAP-WINDOWS Adapter V9的本地连接 直接禁用掉即可。...
  • googlePlay 找不到发布的应用

    万次阅读 热门讨论 2019-09-24 16:50:13
    布初次上架googlePlay 很容易遇到,我们已经发布的应用,但是不能在googlePlay找不到我们的app,尽管我们按照appid 去搜索还是找不到,遇到这个问题我们不要着急,首先我们要确定是否发布成功,在控制后台可以直接...
  • 打开小米应用商店 → 搜索“gmail”,如图: 安装gmail,如果你的手机没有安装Google Play服务,会自动提示安装,如图: 这样就可以安装最新版Google Play服务了。 ...
  • 可将google play上的app下载到本地

    万次阅读 2019-04-23 18:41:11
    可将google play上的app下载到本地 https://apps.evozi.com/apk-downloader/?id=free.vpn.unblock.proxy.turbovpn id后为google play id=后的key google play连接 ...
  • 华为手机如何安装google play, chrome等

    万次阅读 2019-08-13 17:37:38
    1.在设置 权限里面,关闭检查 2.下载谷歌安装器55M 3.安装google play, 其中第二步,那个复选框:检查...,不要选
  • 从 Google Play 下载 APK 文件

    万次阅读 2018-10-03 11:52:48
    网址1 网址2 网址3 随便点击以上任一链接,输入应用在google play上的网址就可以获取下载链接。
  • 怎么找到google play下载的apk文件

    万次阅读 2012-07-08 23:01:46
    google play(andriod marker)下载的apk,自动安装了,无法拿出安装下载的apk文件。其实会安装在系统的data/app目录下,用root browser切换到此目录下,在这里可以看到很多安装的apk文件,copy出来,就可以蓝牙共享...
  • google改变了google play service库的下载方式,要找到还真不容易,加上防火墙,下载也不方便,到哪下载google play service最新版本的库都搞的好麻烦。所以特意记下google play service 最新版本库下载地址,也就是...
1 2 3 4 5 ... 20
收藏数 302,523
精华内容 121,009
关键字:

play