365bet地区将365bet地区应用程序部署到Google Cloud

365bet地区了解如何将365bet地区应用程序部署到与Google Cloud Storage和Google Cloud SQL集成的Google App Engine Java灵活环境

s塞尔吉奥·德尔·阿莫·马修·莫斯

365bet地区版本 3.3.0

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

365bet地区在本指南中,您将部署365bet地区应用程序到Google App Engine弹性环境将图像上传到谷歌云存储并使用由提供的MySQL数据库云端SQL.

费用

本指南使用了付费服务,您可能需要在Google Cloud中启用计费功能才能完成本指南中的某些步骤

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 正确配置了JAVA HOME的JDK或更高版本

如何完成

要开始,请执行以下操作

下载并解压缩源代码或克隆Git存储库

git clone https github com grails指南grails谷歌云git

365bet地区指南存储库包含两个文件夹

  • 初始365bet地区初始项目一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是通过完成指南介绍的步骤并将这些更改应用于初始文件夹的结果

要完成指南,请转到初始文件夹

cd首字母

并按照下一节中的说明进行操作

或者您可以直接转到完成的示例

光盘完成

尽管您可以直接转到完成的示例以部署应用,但是您需要在Google Cloud中完成几个配置步骤

  • 注册Cloud SDK并安装Cloud SDK

  • 在当前的Google Cloud项目中初始化App Engine应用程序

  • 在Cloud SQL实例中创建Mysql数据库

  • 为项目启用Cloud Datastore API

此外,您需要修改您的配置以指向正确的Cloud SQL数据库和Cloud Storage Bucket签出指南步骤以了解更多详细信息

编写应用程序

域类

365bet地区我们希望将一些测试数据保留在Cloud SQL数据库中。初始项目包括要映射的365bet地区域类实例到MySQL表

365bet地区域类满足Model View Controller MVC模式中的M,并表示映射到基础数据库表上的持久实体。在365bet地区中,域是位于grails应用程序域目录中的类。

365bet地区应用程序域演示书groovy
演示 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
  {
    FeaturedImageUrl文件名静态的约束名称独特: FeaturedImageUrl可为空: 文件名可为空: 
    }
}

种子数据

当应用程序启动时,我们将添加一些种子数据。特别是,我们会保留一本书籍清单

修改BootStrap常规.

365bet地区应用程序初始化演示BootStrap groovy
演示 常规转换CompileStatic

静态编译
  {
    定义初始化ServletContext保存全部 (: '365bet地区365bet地区应用程序开发实用指南'),
             (: '365bet地区谈到365bet地区',),
             (: '权威指南'),
             (: '365bet地区行动中的365bet地区'),
             (: '365bet地区365bet地区快速入门指南'),
             (: '365bet地区编程365bet地区')
        )
    }
    定义破坏

显示书籍

作为应用程序的主页,我们希望在应用程序启动时显示那些保存在其中的书籍BootStrap常规

我们映射要解决的主页BookController通过修改UrlMappings常规

更换

grails应用程序控制器演示UrlMappings groovy

查看索引

grails应用程序控制器演示UrlMappings groovy

控制器书

365bet地区我们对365bet地区静态脚手架命令的输出做了一些修改全部产生为域类提供CRUD功能.

你可以找到代码BookController, BookGormService初始项目中的GSP和GSP视图

云端SDK

注册Google Cloud Platform并创建一个新项目

建立专案
建立专案

我们为项目命名grailsgooglecloud

安装云端SDK适用于您的操作系统

安装SDK之后,在终端中运行init命令

gcloud初始化

它将提示您选择要使用的Google帐户和项目

Google App引擎

365bet地区我们将把本指南中开发的365bet地区应用程序部署到Google App Engine弹性环境

App Engine使开发人员可以专注于做自己最擅长的代码编写工作。基于Google Compute Engine,App Engine灵活的环境会自动上下缩放您的应用程序,同时平衡负载微服务授权SQL和NoSQL数据库流量拆分日志记录版本控制安全性扫描和内容交付网络均本地支持

运行命令

gcloud应用创建

初始化当前Google Cloud项目中的App Engine应用程序

您将需要选择App Engine应用程序所在的区域

Google App Engine Gradle插件

要部署到App Engine,我们将使用Google App Engine Gradle插件.

将插件添加为构建脚本依赖

建立gradle
buildscript存储库mavenLocal maven url"https repo grails org grails核心"依赖类路径"org grails grails gradle插件$grails版本"类路径"com bertramlabs插件资产管道gradle"类路径"org grails插件休眠${gormVersion"发布"}"类路径'com google cloud tools appengine gradle插件'
    }
}

应用插件

建立gradle
应用插入: 'com google cloud tools appengine'

应用程序部署配置

要部署到Google App Engine,我们需要添加文件src主appengine应用yaml

它描述了应用程序的部署配置

src主appengine应用yaml
运行爪哇大约柔性运行时配置:
    杰克OpenJDK服务器码头健康检查:
    启用健康检查资源:
    中央处理器: 1
    记忆体: 2.3

手动缩放:
    实例: 1

这里应用程式Yaml指定应用程序使用的运行时并进行设置env flex指定应用使用灵活的环境.

最小的应用程式Yaml上面显示的应用程序配置文件足以满足一个简单的365bet地区应用程序的需要,具体取决于应用程序所使用的大小复杂性和功能,您可能需要更改和扩展此基本配置文件。应用程式Yaml请看使用app yaml配置您的应用指南

有关Java运行时如何工作的更多信息,请参见Java Jetty运行时.

春季靴跳船

如之前的应用引擎配置文件所示,我们正在使用Jetty

365bet地区365bet地区建立在SpringBoot的基础上。按照SpringBoot的文档,我们需要对进行以下更改部署到Jetty而不是Tomcat.

更换

建立gradle
编译"org springframework boot spring boot starter tomcat"

建立gradle
提供"org springframework boot spring boot starter jetty"
重要的是您设置弹簧靴启动器码头依赖为提供.

我们也需要排除几个依赖

建立gradle
配置编译排除模组: "Tomcat 7月"编译排除模组: "春季启动启动器tomcat"编译排除: "用谷歌番石榴", 模组: "番石榴"
}

云端SQL

365bet地区本指南中开发的365bet地区应用程序将使用通过以下方式创建的MySQL数据库:云端SQL

Cloud SQL是一项完全托管的数据库服务,可轻松在云中设置维护,管理和管理关系PostgreSQL BETA和MySQL数据库Cloud SQL提供高性能的可伸缩性和便利性托管在Google Cloud Platform上Cloud SQL为应用程序提供了数据库基础架构在任何地方运行

启用Cloud SQL API

如果尚未启用云端SQLCloud SQL API已经转到您的项目仪表板并启用它们

cloudsql
cloudsql
cloudsql
cloudsql
cloudsqlapi

创建Cloud SQL实例

我们准备去创建Cloud SQL的新实例关联到我们之前创建的同一项目

转到控制台的“ Cloud SQL”部分

cloudsql

下一个屏幕截图说明了该过程

cloudsql
cloudsql
cloudsql
cloudsql

实例准备好后,我们将创建一个数据库

cloudsql
cloudsql
cloudsql

使用Cloud SQL的数据源

如使用中所述云端SQL通过灵活的环境文档,我们需要添加几个运行时依赖项,并将生产URL配置为使用我们之前创建的Cloud SQL MySQL数据库

添加MySQL依赖项JDBC库和Cloud SQL MySQL套接字工厂

建立gradle
运行'MySQL连接器'运行'com google cloud sql mysql mysql socket factory connector j'

更换生产环境数据源配置以指向Cloud SQL MySQL数据库

grails应用配置会议应用yml
环境:
    生产:
        数据源:
            方言: org休眠方言MySQL InnoDBDialect
            driverClassName: com mysql cj jdbc驱动程序
            dbCreate: 更新
            网址: jdbc mysql google grailsgooglecloud socketFactory com谷歌云sql mysql SocketFactory cloudSqlInstance内部主题我们中央grailsgooglecloud useSSL true
            用户名: 
            密码: grailsgooglecloud

生产数据源URL使用由几个组件构建的自定义URL

jdbc mysql google DATABASE NAME socketFactory com google google sql mysql SocketFactory cloudSqlInstance实例名称useSSL true

  • 数据库名称使用创建数据库时使用的数据库名称

  • 实例名称您可以在Cloud SQL实例详细信息中找到实例名称

cloudsql
  • 用户名密码在本指南中,我们使用用户名以及创建SQL实例时输入的密码,请参见前面的部分

用于JDBC驱动程序的Cloud SQL套接字工厂Github存储库包含一个工具实例入门可以帮助生成JDBC URL并验证可以建立连接

云储存

我们允许用户上传书籍封面图片,以便将图片存储在云端谷歌云存储

Google Cloud Storage是面向开发人员和企业的统一对象存储,从实时数据服务到数据分析ML到数据归档

启用Cloud Storage API如果尚未启用该项目

云储存
云储存
云储存

您可以创建云存储桶,如下图所示。我们将其命名为存储桶grailsbucket

云储存
云储存
云储存

将Cloud Storage依赖性添加到您的项目依赖性

建立gradle
编译'com google cloud谷歌云存储'

我们需要排除与谷歌番石榴番石榴jdk

建立gradle
配置编译排除模组: "Tomcat 7月"编译排除模组: "春季启动启动器tomcat"编译排除: "用谷歌番石榴", 模组: "番石榴"
}

将这些配置Cloud Storage Bucket和Project id参数附加到

grails应用配置会议应用yml
谷歌云:
    项目编号grailsguide176214
    云储存:
        grailsguidebucket

这些配置参数由以下描述的服务使用

365bet地区创建365bet地区命令对象以管理文件上传参数

grails应用程序控制器演示FeaturedImageCommand groovy
演示 grails验证有效
 组织springframework网站multipart MultipartFile

 FeaturedImageCommand 实施可验证的MultipartFile FeaturedImageFilelongIDlong静态的约束ID可为空: 可为空: FeaturedImageFile验证器MultipartFile val FeaturedImageCommand obj如果小时空值 ) {
                返回 
            }
            如果空值返回 
            }

            ['jpeg', 'jpg', 'PNG'任何扩展名val originalFilename到更低的情况下以扩展名结尾

将两个控制器动作添加到BookController:

365bet地区应用控制器演示BookController groovy
UploadBookFeaturedImageService uploadBookFeaturedImageService交易性只读)
定义 editFeaturedImage(本书回应书动态编译
定义 uploadFeaturedImageFeaturedImageCommand cmd如果cmd hasErrors响应cmd错误模型: [指令视图: 'editFeaturedImage')
        返回
    }

    定义书籍uploadBookFeaturedImageService uploadFeaturedImage cmd如果空值未找到返回
    }

    如果书籍hasErrors回应书籍错误模型: [视图: 'editFeaturedImage')
        返回请求withFormat表单multipartForm闪存消息消息: '默认更新消息', args信息: '书标签', 默认: ''书号重定向书'*'回应书状态

先前的控制器操作使用服务来管理我们的业务逻辑UploadBookFeaturedImageService groovy:

grails应用程序服务演示UploadBookFeaturedImageService groovy
演示 groovy util日志记录Slf j
 常规转换CompileStatic

自我
静态编译
 UploadBookFeaturedImageServiceBookGormService bookGormService GoogleCloudStorageService googleCloudStorageService私人的 静态的 fileSuffix 日期格式'YYYY MM dd HHmmssSSS')
    }

    uploadFeaturedImage FeaturedImageCommand cmd文件名"${cmd FeaturedImageFile originalFilename}${fileSuffix}"日志信息"云存储文件名$文件名"

        fileUrl googleCloudStorageService storeMultipartFile fileName cmd FeaturedImageFile日志信息"云存储媒体网址$fileUrl"

        定义本书bookGormService updateFeaturedImageUrl cmd id cmd版本fileName fileUrl如果书籍book hasErrors googleCloudStorageService deleteFile fileName书籍

与Cloud Storage交互的代码封装在服务中

grails应用程序服务演示GoogleCloudStorageService groovy
演示 com google cloud storage Acl
 com google cloud storage BlobId
 与谷歌云存储BlobInfo
 com google cloud storage存储
 com google cloud storage StorageOptions
 grails config配置
 365bet地区grails核心支持365bet地区ConfigurationAware
 组织springframework网站multipart MultipartFile
 常规转换CompileStatic

禁止警告('365bet地区365bet地区S​​tatelessService')
静态编译
 谷歌云存储服务 实施365bet地区365bet地区ConfigurationAware存储存储StorageOptions defaultInstance服务Google Cloud Platform项目编号
    projectId云存储桶
    覆写
    虚空setConfiguration Config co projectId co getRequiredProperty'谷歌云项目ID', 桶公司getProperty'谷歌云云存储桶', projectIdstoreMultipartFilefileName MultipartFile multipartFile storeInputStream fileName multipartFile inputStreamstoreInputStream文件名输入流inputStream BlobInfo blobInfo存储创建可读的BlobInfo存储桶文件名inputStream blobInfo mediaLink伟大的字节文件名字节[]字节BlobInfo blobInfo存储创建可读的BlobInfo存储桶fileName字节blobInfo mediaLink私人的 静态的BlobInfo可读的BlobInfofileName BlobInfo newBuilder存储桶fileName修改访问列表,以允许所有具有链接的用户读取文件setAclAclAcl所有用户的用户Acl角色阅读器构建布尔值删除文件fileName BlobId blobId存储区fileName的BlobId存储删除blobId

如果将图片成功上传到Google Cloud,我们将对媒体URL的引用保存在我们的域类中

将此方法添加到BookGormService

365bet地区应用服务演示BookGormService groovy
禁止警告('线长')
updateFeaturedImageUrllongIDlong文件名FeaturedImageUrl布尔值齐平) {
    获取ID如果返回 空值书籍版本版本书籍fileName文件名称书籍FeaturedImageUrl FeaturedImageUrl储存齐平同花顺

我们需要添加一个GSP文件来呈现上传表单

grails应用程序视图书editFeaturedImage gsp


    
        "布局"内容"主要" />
        <G有一套"实体名称""${信息: '书标签', 默认: '')}" />