quic最先是由google提出并完善的,18年google cloud支持了quic协议,我尝试在google上部署一套自己的应用,并使其支持quic协议

google的文档还是非常完善的,只是类似的文档有点多反而不好选择了。在部署过程中遇到不少问题,都会在博客里记录下来,最后会把自己成功部署的操作分享出来

google app engine

在以提供物理资源为目的的 IaaS ( Infrastructure as a Service )领域里, Amazon EC2是当之无愧的领先者。而在以提供平台为目标的 PaaS( Platform as a Service)领域里, Google App Engine 的美誉度是非常高的。

Google App Engine(GAE) 是 Google 的平台即服务(PaaS)产品,允许开发人员和企业使用 Google 的高级基础架构构建和运行应用程序,并自动根据应用所承受的负载来对应用进行扩展,免去用户对应用和服务器等的维护工作。

Google App Engine: Java版应用服务器和Python版基本一致,也是基于标准的Java Web容器,而且选用了轻量级的Jetty技术,并跑在Java 6上。

简单来说, Amazon EC2只是提供了最基础的虚拟机器,需要什么我们都要自己在上面安装部署。
而Google App Engine 提供的是平台服务,它帮我们封装了很多操作命令以便开发者快速进行部署,比方说实例的维护和扩容,自动将web应用部署在web服务器里等 。

部署spring-boot应用到google cloud (app engine)

一开始按照google的文档尝试了多次,但是最后都没有部署成功,有的部署成功了但是无法正常访问,最后按照文档提供的官方示例成功部署了
代码示例
java-docs-samples/appengine-java8/springboot-helloworld

1. 下载Google Cloud SDK

https://cloud.google.com/sdk/docs/install

安装成功后双击Google Cloud Shell启动,按照上面的提示操作

  • gcloud init: 初始化cloud sdk
  • 初始化后会咨询你是否需要选择部署区域,根据自己的需要选择即可

2.在当前的google cloud项目里创建一个app engine 应用

gcloud app create

3.创建自己的app engine 项目

项目的创建方式和普通的spring-boot项目一样(我部署的是war包),创建完成后需要修改如下配置:

1) 在pom.xml添加 App Engine Maven插件

<plugin><groupId>com.google.cloud.tools</groupId><artifactId>appengine-maven-plugin</artifactId><version>2.2.0</version><configuration><!--你在google cloud创建的项目id--><projectId>myProjectId</projectId><!--GCLOUD_CONFIG表示自增长的App Engine版本,也可以用具体的版本号来代替--><version>GCLOUD_CONFIG</version></configuration>
</plugin>

2) 添加app engine配置文件

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"><threadsafe>true</threadsafe><runtime>java8</runtime>
</appengine-web-app>
  1. 启动和部署应用

本地运行: mvn package appengine:run
部署到google cloud: mvn package appengine:deploy
部署成功后可以看到如下日志信息:

app engine其他部署方式

除了前面成功的部署,我还尝试过使用其他办法部署,有的一开始没有成功,不过多次尝试后最终也都成功了,记录一下, 在部署期间还是有一些小问题,如果有人能帮忙解答下就更好了

通过Google Cloud SDK 部署

参照的文档如下:
使用入门:设置开发环境

  1. 安装Google Cloud SDK和App Engine Java 组件
  2. 向账户授权 gcloud auth application-default login
  3. 创建新目录,并初始化新的app-engine应用
mvn archetype:generate -Dappengine-version=1.9.59 -Djava8=true -DCloudSDK_Tooling=true -Dapplication-id=quic-test-303806
  1. 在pom.xml中添加插件
         <plugin><groupId>com.google.cloud.tools</groupId><artifactId>appengine-maven-plugin</artifactId><version>2.2.0</version><configuration><projectId>your-project-ID</projectId><version>1</version></configuration></plugin>
  1. 添加对应的配置文件,在src/main/appengine/app.yaml 目录下:
# 不知道为什么不能使用Java8,部署的时候会报错:
# Cannot process application with runtime: java8 -
runtime: java11
  1. 需要使用jar包的方式部署,指定main-class
    <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.xx.xx.App</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin>

否则会报如下错误:

通过IDEA Cloud Code插件部署(标准环境)

参考文档:创建适用于 App Engine 标准环境的应用

  1. 安装IDEA Cloud Code插件 File > Settings > Plugins, 安装完成后重启idea
  2. 创建新项目,使用 App Engine 标准环境 (我第一次安装Cloud Code插件后其创建页面并不是这样的,后面的项目部署也不成功,我也不知道为什么,卸载插件后重新安装就ok了,具体的错误信息我列在最后了)

    3.点击项目右键 添加框架支持(Add Framework Support) 这里我已经在创建项目的时候使用了Google App Engine Standard,所以就不需要再添加了,我只是添加了一个maven的框架支持

项目的pom.xml如下 ,就是正常maven项目的配置:

  <properties><spring.boot.version>1.4.3.RELEASE</spring.boot.version><jdk.version>1.8</jdk.version></properties><packaging>war</packaging><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>19.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><encoding>${file.encoding}</encoding><source>${jdk.version}</source><target>${jdk.version}</target><showWarnings>true</showWarnings></configuration></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>2.6</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins><finalName>quic</finalName></build>
  1. 启动项目,有如下报错提示:

    于是我修改了项目生成时的appengine-web.xml的文件位置,改为src\main\webapp\WEB-INF\appengine-web.xml 目录下,再次运行就可以成功部署了

怎么使应用支持quic协议

部署完应用之后,可以在App Engine的管理页面里看到对应的版本和实例信息

接下来就需要部署对应的外部Https负载均衡器,配置页面
https://console.cloud.google.com/net-services/loadbalancing/

配置对应的后端: 类型选择 无服务器网络端点组,协议选择HTTPS (这里配置的就是我之前部署的springboot项目)

配置前端: 开启quic, 协议选择https, 添加证书,这里的ip是自动生成的
证书的申请在另一篇博客里都有说明:不花一分钱申请免费域名和ssl证书

配置完成后就可以通过域名进行访问了

除了通过app engine部署应用(app engine会帮助我们自动扩缩容,所以就不需要搭建应用集群了),还可以使用原始的实例来部署,感兴趣的可以参考以下文章: 如何在Google Cloud上创建负载均衡器?

部署一个实例组,然后创建指向该实例组的负载均衡器。

最后的问题

部署成功后,访问域名发现目前google cloud只能支持h3-Q050等协议,不能支持h3-29

部署踩坑

在使用Idea的Cloud Code插件部署项目时,一开始安装插件后其新建Google App Engine项目的页面和文档的不太一样,创建后的项目部署起来也总是有问题

使用Flexible 柔性环境部署后会访问项目会出现如下提示:

500 Server Error\br
Error: Server Error
The server encountered an error and could not complete your request.
If the problem persists, please report your problem and mention this error message and the query that caused it.

在google cloud的控制台观察其实例也发现其及其不稳定,经常处理健康检查失败的状态

后面就尝试使用了标准环境来部署,部署后的实例状态看上去到是正常,但是在通过google 部署后提供的域名访问应用的时候一直提示404

最后我是通过卸载插件并重新安装插件重启IDEA 解决了这个问题

参考资料:

外部 HTTP(S) 负载平衡概览

通过google app engine 在google cloud 部署支持quic的Java web 应用(多种方式)相关推荐

  1. 使用Google App Engine、Google Closure Library与Clojure编写HTML5应用

    上周,Freiheit.com的CTO Stefan Richter在慕尼黑举办的Google开发者日上谈到了他对于使用HTML 5与Google App Engine编写富Internet应用的愿景 ...

  2. 探索Google App Engine背后的奥秘

    探索Google App Engine背后的奥秘(1)--Google的核心技术 作者: ikewu | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明 网址: http://w ...

  3. Google App Engine 的简易教程(转载)

    源地址:http://peopleyun.com/?p=868 本文将通过一个简单的例子,来介绍大家如何创建一个简单App Engine程序,首先,给大家介绍一下Google App Engine. ...

  4. Google App Engine技术架构之Google App Engine的简介

    通过前面两篇Google的核心技术和Google整体架构猜想,大家应该对Google强大的基础设施有一定的了解.本篇开始介绍构筑在这强大基础设施之上的Google App Engine. Google ...

  5. Google App Engine JAX-RS REST服务

    在本文中,您将学习如何使用JAX-RS参考实现(Jersey)创建REST服务并将其部署在Google AppEngine上. 先决条件 对于本教程,您将需要: Google AppEngine帐户 ...

  6. Google App Engine上的Spring MVC和REST

    前段时间,我写了一篇关于如何使用Spring MVC实现Restful Web API的文章 . 阅读我以前的文章以了解它. 在那篇文章中,开发了一个简单的Rest示例. 为了测试该应用程序,将文件复 ...

  7. Google App Engine教程

    Google App Engine是一个用于在现有Google基础架构中托管Web应用程序的云计算平台,它易于扩展,管理和免费使用多达预定义的已消耗资源,并且支持Java. 有关其他费用,请参阅此GA ...

  8. 探索Google App Engine背后的奥秘(3)- Google App Engine的简介

    通过前面两篇介绍,大家应该对Google强大的基础设施有一定的了解.本篇开始介绍构筑在这强大基础设施之上的Google App Engine. Google App Engine的介绍 由于发布S3和 ...

  9. google app engine for java 的web应用程序

    在IT业步入"云"时代的时候,Google App Engine无疑是引领"云"技术潮流的一支生力军.但在App Engine诞生后的很长一段时间里,它都只支持 ...

最新文章

  1. 从 Servlet 入手带你看架构和框架设计的套路
  2. 找出和为某个数的连续正整数序列
  3. 清华唐杰:GPT-3表示能力已经接近人类了,但它有一个阿喀琉斯之踵 | MEET 2021...
  4. Delphi CxGrid 汇总(3)
  5. 详细介绍React模态框组件react-modal
  6. pycharm怎么修改语言为中文?(不用汉化包)
  7. 『信息收集』GoogleHacking快速定位目标网站
  8. python数据处理不用编程_用Python玩转数据数据处理相关小例编程题
  9. 四种方式下创建线程启动的区别
  10. 使用笛卡尔积 cross join解决傻傻的问题
  11. 【专栏精选】实战:使用LeanCloud上传玩家分数,实现排行榜
  12. spring boot 发邮件
  13. 【评论】第一财经周刊:失败的埃洛普
  14. Go 日志库 zerolog 大解剖
  15. 拔剑金三银四:大厂面试流程、面试套路分享!你准备好“进厂拧螺丝”了吗?
  16. java则么实现md5解密_java的md5解密
  17. java rrd 读取_rrd4j的使用详解1–数据保存入rrd文件 | 学步园
  18. 信息系统安全管理架构
  19. oracle rman crosscheck,rman 之crosscheck 与delete expired
  20. php判断区间数字,如何快速判断数字在那个区间?

热门文章

  1. 组合模式源码解析(jdk+mybatis)
  2. SpringBoot 模版渲染
  3. php如何获取百度快照,PHP获取某网站的百度快照日期方法
  4. java的虚拟机不支持在鲲鹏上_屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!...
  5. MySQL执行原理,逻辑分层、更改数据库处理引擎
  6. 网站防止SQL注入方法
  7. UEFI Shell 常用命令
  8. Xamarin.Form 初学 之 服务引用-WCF服务引用
  9. understanding shader mat4 * vec4 calculation​
  10. StreamTokenizer输入中的用法