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>
- 启动和部署应用
本地运行: mvn package appengine:run
部署到google cloud: mvn package appengine:deploy
部署成功后可以看到如下日志信息:
app engine其他部署方式
除了前面成功的部署,我还尝试过使用其他办法部署,有的一开始没有成功,不过多次尝试后最终也都成功了,记录一下, 在部署期间还是有一些小问题,如果有人能帮忙解答下就更好了
通过Google Cloud SDK 部署
参照的文档如下:
使用入门:设置开发环境
- 安装Google Cloud SDK和App Engine Java 组件
- 向账户授权
gcloud auth application-default login
- 创建新目录,并初始化新的app-engine应用
mvn archetype:generate -Dappengine-version=1.9.59 -Djava8=true -DCloudSDK_Tooling=true -Dapplication-id=quic-test-303806
- 在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>
- 添加对应的配置文件,在
src/main/appengine/app.yaml
目录下:
# 不知道为什么不能使用Java8,部署的时候会报错:
# Cannot process application with runtime: java8 -
runtime: java11
- 需要使用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插件部署(标准环境)
- 安装IDEA Cloud Code插件 File > Settings > Plugins, 安装完成后重启idea
- 创建新项目,使用 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>
- 启动项目,有如下报错提示:
于是我修改了项目生成时的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 解决了这个问题