背景

提供使用JAVA语言 + Spring Boot框架搭建后端API Server的DEMO案例,展示从开发到部署的项目全生命周期。将整个后端项目都托管在微信云托管之上,并且通过CI/CD流水线实现快速迭代和持续交付。

DEMO中通过公共接口读取腾讯新闻的热点新闻TOP排行榜,为前端提供HTTP接口,返回可供小程序、H5、APP、web等各种前端实现一个简单的新闻应用。

代码仓库地址

这里是代码仓库地址:https://github.com/TCloudBase/springboot_demo

项目中包含源代码+Dockerfile+container.config.json,可用于搭建CI/CD流水线。

准备工作

GitHub帐号准备

微信云托管也支持使用GitLab、Gitee。本案例中采用GitHub。

GitHub帐号注册

本地安装Git工具

安装教程

本地安装Docker

在部署时,微信云托管提供了自动构建镜像功能。但您仍需要在本地安装Docker便于在本地调试。

Docker Desktop for Windows[点击下载](https://desktop.docker.com/win/stable/Docker Desktop Installer.exe) Docker Desktop for Mac点击下载

CentOS

$ yum install -y yum-utils device-mapper-persistent-data lvm2

$ yum-config-manager --add-repo http://mirrors.tencent.com/docker-ce/linux/centos/docker-ce.repo # 设置docker源 $ yum install docker-ce # 安装容器

$ systemctl start docker # 启动容器

创建云环境

推荐创建两个云环境,一个用于开发测试,一个用于线上生产。如何创建环境,请参见创建环境文档

操作指南

代码编写

选择自己喜欢的IDE工具,参考源码创建一个新的Spring Boot项目。

以下是本项目的核心代码,展示如何实现后端http接口。

上面这段代码,可以看到SpringBoot使用RestController注解表明此类处理http请求,并在每个RequestMapping对应的方法上都返回json格式的数据。RequestMapping注解的作用是为每个方法映射一个url。@RequestMapping注解可以作用在控制器类上,也可以作用在其下的某个方法上。当在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有方法上。而方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。

Dockerfile编写

Dockerfile 背景知识

查看 Dockerfile 官方文档 了解语法,并查看 编写 Dockerfile 的最佳做法 中的提示了解如何将这些语法整合在一起。Dockerfile 通常从基础镜像(例如 FROM golang:1.11)开始。您可以在 Docker Hub 上找到由操作系统和语言作者维护的基础镜像。

Dockerfile内容

在您的代码目录下创建Dockerfile文件。推荐放置在根目录中。(Dockerfile文件位置不影响部署。只要在部署时正确填写了Dockerfile名字,微信云托管会自动在您的整个代码目录中查找Dockerfile。)

分支管理

分支develop,对应开发测试阶段代码;分支master,对应生产部署阶段代码。

每次都在develop分支修改代码,触发持续部署到开发测试环境。开发测试环境验证完毕后,将代码合并到master分支,触发持续部署到线上生产环境。

新建代码仓库

微信云托管支持使用GitHub、GitLab、Gitee仓库。此处我们以GitHub为例。

进入Github首页,点击New repository新建一个项目,确定项目名称。

创建成功后,会默认存在一个master分支。我们还需要额外创建一个develop分支。

创建服务

本案例中采用的是单体服务的架构,因此只需要创建一个云托管服务即可。未使用到数据库,因此无需开通MySQL。

在开发测试环境和生产部署环境中,各新建一个名为「qqnews」的服务。如何创建服务,请参见新建服务文档

版本配置

在流水线部署模式中,通过代码仓库中的container.config.json文件定义全部版本参数,无需在控制台手动操作。如果变更container.config.json文件,也会触发流水线重新部署,且后续所有版本都会沿用新的版本参数。

关于container.config.json文件详细介绍,请参见文档

新建CI/CD流水线

进入开发测试环境中的「qqnews」服务,创建流水线。

完成代码仓库授权后,选择之前创建的项目,分支选择develop,默认勾选分支代码变更时触发流水线。发布策略选择“全量发布”。

再进入线上生产环境中的「qqnews」服务,创建流水线。

完成代码仓库授权后,选择之前创建的项目,分支选择master,默认勾选分支代码变更时触发流水线。发布策略选择“全量发布”。

如果要进一步使用灰度发布功能,请参考灰度发布文档

开发测试环境调试验证

通过本地git工具/git命令,将代码推送到github仓库develop分支,触发流水线自动从代码仓库拉取代码、构建镜像、完成版本的部署和全量发布。

调试并验证服务,如果有需要还可以将镜像下载到本地进行调试,找出代码中的具体问题。请参见本地调试指南

线上生产部署

通过本地git工具/git命令,将代码推送到github仓库master分支,触发流水线自动从代码仓库拉取代码、构建镜像、完成版本的部署和全量发布。

至此,整个后端项目的部署就全部完成,且后续可以快速迭代并进行持续部署。

前端调用

微信小程序前端通过wx.callcontainer方式调用http接口;

var c1 = new wx.cloud.Cloud({
  resourceEnv: "云环境 ID",
});
await c1.init();

// 返回值同 wx.request
const res = await c1.callContainer({
  path: "/",
  method: "POST",
  header: {
    'X-WX-SERVICE': 'qqnews',
  }
  data:{
    top: 1
  }
});

console.log(res);

其他平台小程序前端、APP前端、web前端,可以通过公网域名方式调用http接口。公网域名可以在“服务详情”中找到。使用默认的公网域名无需进行域名备案。

费用估算

本项目采用的容器规格为0.25C0.5GB,模式为“低成本”,无接口调用时会缩容到0不产生任何费用。不考虑因业务量增长产生的扩容,不考虑任何折扣、资源包使用,假设每天运行6个小时,则每日花费为(0.055 x 0.25+0.032 x 0.5)x 6 = 0.1785元,每月花费为 0.1785 x 30 = 5.355元。