learn.lianglianglee.com/专栏/Serverless 技术公开课(完)/22 通过 IDEMaven 部署 Serverless 应用实践.md.html
2022-09-06 22:30:37 +08:00

263 lines
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>22 通过 IDEMaven 部署 Serverless 应用实践.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/Serverless 技术公开课(完)/01 架构的演进.md.html">01 架构的演进</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/02 Serverless 的价值.md.html">02 Serverless 的价值</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/03 常见 Serverless 架构模式.md.html">03 常见 Serverless 架构模式</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/04 Serverless 技术选型.md.html">04 Serverless 技术选型</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/05 函数计算简介.md.html">05 函数计算简介</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/06 函数计算是如何工作的?.md.html">06 函数计算是如何工作的?</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/07 函数粘合云服务提供端到端解决方案.md.html">07 函数粘合云服务提供端到端解决方案</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/08 函数计算的开发与配置.md.html">08 函数计算的开发与配置</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/09 函数的调试与部署.md.html">09 函数的调试与部署</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/10 自动化 CI&amp;CD 与灰度发布.md.html">10 自动化 CI&amp;CD 与灰度发布</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/11 函数计算的可观测性.md.html">11 函数计算的可观测性</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/12 典型案例 1函数计算在音视频场景实践.md.html">12 典型案例 1函数计算在音视频场景实践</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/13 典型案例 3十分钟搭建弹性可扩展的 Web API.md.html">13 典型案例 3十分钟搭建弹性可扩展的 Web API</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/14 Serverless Kubernetes 容器服务介绍.md.html">14 Serverless Kubernetes 容器服务介绍</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/15 Serverless Kubernetes 应用部署及扩缩容.md.html">15 Serverless Kubernetes 应用部署及扩缩容</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/16 使用 Spot 低成本运行 Job 任务.md.html">16 使用 Spot 低成本运行 Job 任务</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/17 低成本运行 Spark 数据计算.md.html">17 低成本运行 Spark 数据计算</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/18 GPU 机器学习开箱即用.md.html">18 GPU 机器学习开箱即用</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/19 基于 Knative 低成本部署在线应用,灵活自动伸缩.md.html">19 基于 Knative 低成本部署在线应用,灵活自动伸缩</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/20 快速构建 JenkinsGitlab 持续集成环境.md.html">20 快速构建 JenkinsGitlab 持续集成环境</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/21 在线应用的 Serverless 实践.md.html">21 在线应用的 Serverless 实践</a>
</li>
<li>
<a class="current-tab" href="/专栏/Serverless 技术公开课(完)/22 通过 IDEMaven 部署 Serverless 应用实践.md.html">22 通过 IDEMaven 部署 Serverless 应用实践</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/23 企业级 CICD 工具部署 Serverless 应用的落地实践.md.html">23 企业级 CICD 工具部署 Serverless 应用的落地实践</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/24 Serverless 应用如何管理日志&amp;持久化数据.md.html">24 Serverless 应用如何管理日志&amp;持久化数据</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/25 Serverless 应用引擎产品的流量负载均衡和路由策略配置实践.md.html">25 Serverless 应用引擎产品的流量负载均衡和路由策略配置实践</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/26 Spring CloudDubbo 应用无缝迁移到 Serverless 架构.md.html">26 Spring CloudDubbo 应用无缝迁移到 Serverless 架构</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/27 SAE 应用分批发布与无损下线的最佳实践.md.html">27 SAE 应用分批发布与无损下线的最佳实践</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/28 如何通过压测工具+ SAE 弹性能力轻松应对大促.md.html">28 如何通过压测工具+ SAE 弹性能力轻松应对大促</a>
</li>
<li>
<a href="/专栏/Serverless 技术公开课(完)/29 SAE 极致应用部署效率.md.html">29 SAE 极致应用部署效率</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>22 通过 IDEMaven 部署 Serverless 应用实践</h1>
<h3>SAE 应用部署方式</h3>
<h4>1. SAE 概述</h4>
<p><img src="assets/2020-09-07-110109.png" alt="img" /></p>
<p>首先,简单介绍一下 SAE。SAE 是一款面向应用的 Serverless PaaS 平台,支持 Spring Cloud、Dubbo、HSF 等主流开发框架,用户可以零代码改造直接将应用部署到 SAE并且按需使用、按量计费、秒级弹性。SAE 充分发挥 Serverless 的优势为用户节省闲置资源成本在体验上SAE 采用全托管、免运维的方式,用户只需聚焦核心业务的开发,而应用生命周期管理、微服务管理、日志、监控等功能交由 SAE 完成。</p>
<h4>2. SAE 应用部署方式</h4>
<p><img src="assets/2020-09-07-105849.png" alt="png" /><img src="assets/2020-09-07-105851.jpg" alt="png" /></p>
<p>在使用 SAE 时,您可以在控制台上看到 SAE 支持三种部署方式,即可以通过 WAR 包、JAR 包和镜像的方式进行部署,如果您采用 Spring Cloud、Dubbo、HSF 这类应用,可以直接打包上传,或者填入包的地址便可以部署到 SAE 上;对于非 Java 语言的场景,您也可以使用镜像直接来部署,后续我们也会支持其他语言直接上传包的形式进行部署。</p>
<p>SAE 除上述控制台界面部署的方式之外,还支持通过 Maven 插件或者 IDE 插件的方式进行部署这样您无需登录控制台就可以执行自动化部署操作同时可以集成如云效、Jenkins 等工具实现 CICD 流程。</p>
<h3>Maven 插件部署</h3>
<p><img src="assets/2020-09-07-110027.jpg" alt="png" /></p>
<p>如何使用 Maven 插件进行部署?首先需要为应用添加 Maven 依赖 toolkit-maven-plugin接下来需要编写配置文件来配置插件的具体行为这里定义了三个配置文件</p>
<ul>
<li><strong>toolkit_profile.yaml 账号配置文件</strong>,用来配置阿里云 ak、sk 来标识阿里云用户,这里推荐使用子账号 ak、sk 以降低安全风险。</li>
<li><strong>toolkit_package.yaml 打包配置文件</strong>,用来声明部署应用的类型,可以选择 war、jar、url 以及镜像的方式来进行部署,若采用 war、jar 的方式,则会将当前应用进行打包上传,而 url 或者镜像的方式则要显示的填写对应的包地址或者镜像地址进行部署。</li>
<li><strong>toolkit_deploy.yaml 部署配置</strong>,即可以配置该应用的环境变量、启动参数、健康检查等内容,这与控制台上的配置选项是一致的。</li>
</ul>
<p>这三个文件都有对应的模板,具体的模板选项可以查看<a href="https://help.aliyun.com/document_detail/110639.html?spm=a2c4g.11186623.6.611.5a3473c76owo99">产品文档</a>,接下来通过运行 Maven 打包部署命令 mvn clean package toolkit:deploy 即可自动化部署到 SAE 上。</p>
<h3>IDE 插件部署</h3>
<p><img src="assets/2020-09-07-110135.jpg" alt="img" /></p>
<p>再看一下如何通过您的 IDE 直接进行部署,这个是借助 Alibaba Cloud Toolkit IDE 插件的能力,它可以在主流的 Java IDE IDEA 和 Eclipse 上面安装,这里以 IDEA 为例,您可以在 IDEA 插件市场中搜索并安装。之后重启 IDEA 后即可看到 Cloud Toolkit 的选项。下面我们要做的配置和刚才的 Maven 插件部署的配置比较类似,先要配置阿里云账号信息,即 ak、sk。接下来选择部署到 SAE 这个选项里面有多种部署方式Maven 打包、上传文件、镜像,同时在高级选项中可以配置应用的环境变量、启动参数、健康检查等内容。</p>
<h3>总结</h3>
<p>相信您通过本文已经了解了 SAE 的几种部署方式和基本使用,在这里也推荐您选用 SAE在不改变当前开发运维方式的同时享受 Serverless 技术带来的价值。</p>
<p><strong>相关文档:</strong></p>
<p><a href="https://help.aliyun.com/document_detail/110639.html?spm=a2c4g.11186623.6.611.5a3473c76owo99">通过 Maven 插件自动部署应用</a> <a href="https://help.aliyun.com/document_detail/110665.html?spm=a2c4g.11186623.6.612.77f16905iduxEH">通过 IntelliJ IDEA 插件部署应用</a> <a href="https://help.aliyun.com/document_detail/110664.html?spm=a2c4g.11186623.6.613.616144e2vDAuFc">通过 Eclipse 插件一键部署应用</a></p>
<h3>课程推荐</h3>
<p>为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课让你即学即用轻松拥抱云计算的新范式——Serverless。</p>
<p>点击即可免费观看课程:<a href="https://developer.aliyun.com/learning/roadmap/serverless">https://developer.aliyun.com/learning/roadmap/serverless</a></p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/Serverless 技术公开课(完)/21 在线应用的 Serverless 实践.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/Serverless 技术公开课(完)/23 企业级 CICD 工具部署 Serverless 应用的落地实践.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997487ef813d60","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>