更多腾讯海量技术文章,请关注云+社区:https://cloud.tencent/developer
作者:李想
由于最近容器技术的火热,各大云计算厂商都已经提供了独立的容器服务,腾讯云也不例外。腾讯云容器服务的官方文档提供了一个基于node.js的简单案例供大家上手,考虑到官方的文档并没有提供基于java的上手教程,再加上容器/微服务技术在java领域的各种衍生开源组件--如springcloud家族的各种神器应用极其广泛,今天有空拿一个简单的带增删改查接口功能的springboot应用外接腾讯云cdb for mysql来把玩容器服务,正好以此来演示如何从零开始在腾讯云上搭建基于springboot的容器化应用。关于为啥选用springboot框架,我想原因也不必多说,主要还是因为其本身就是一个为容器而生的框架,自带tomcat服务器而且能以极简的配置构建web服务(相对于springmvc而言)。
这里以一个提供用户管理的微服务为例进行搭建,为了简化步骤仅考虑用户数据的增删改查功能不考虑实际业务逻辑。微服务本身基于springboot框架,数据库保存在腾讯云cdb for mysql上,同时利用spring的jpa作为orm框架,最终发布可以对用户数据进行增删改查的restful接口。
1. 创建springboot 项目
intellij idea默认可以创建springboot应用,新建项目里面选择spring initializer。
创建springboot项目
修改对应的名字,我们这里就叫userprovider
项目配置
修改项目的组织架构如图所示,各部分功能如下:
controller/userprovidercontroller.java: http请求的监听入口,为了简化程序不再写service层,直接调用dao层
dao/userinfodao.java: dao层,直接使用jpa实现
model/userproviderapplication.java: entity层,映射到数据库,为了简化程序只定义了名字,年龄,性别几个字段
项目组织架构
代码本身不再做过多的解释,都是最基础的springboot代码,大家可以从下面的地址获取代码。https://github/xianl/userprovider
需要提到的是application.yml文件和项目根目录下的maven配置文件pom.xml。
application.yml 中通过${userprovider_mysql} 来获取环境变量中配置好的数据库地址传给jdbc,后面会演示如何通过腾讯云的容器服务来传入这个参数到容器内。
server:port: 8090spring:jpa:hibernate:ddl-auto: createdatasource:url: jdbc:mysql://${userprovider_mysql}/userdbusername: springuserpassword: test01!info:app:name: @project.artifactid@encoding: @project.build.sourceencoding@java:source: @java.version@target: @java.version@
pom.xml 需要引入jpa和mysql的依赖包,同时加入docker-maven-plugin用于直接打包生成docker镜像。
org.springframework.bootspring-boot-starter-data-jpamysqlmysql-connector-javaorg.springframework.bootspring-boot-maven-plugincom.spotifydocker-maven-pluginuserproviderjava[java, -jar, /${project.build.finalname}.jar]/${project.build.directory}${project.build.finalname}.jar
首先在本地进行调试,创建userdb数据库并赋予用户springuser对数据库的访问权限。同时需要设置本地环境变量userprovider_mysql的值为127.0.0.1。
mysql> create database userdb;query ok, 1 row affected (0.00 sec)mysql> create user 'springuser'@'%' identified by 'test01!';query ok, 0 rows affected (0.00 sec)mysql> grant all on userdb.* to 'springuser'@'%';query ok, 0 rows affected (0.00 sec)
访问本地的8090端口,调用add接口插入一条数据,再次通过users接口可以获取之前插入的数据。表明程序本身没有问题,本地调试成功之后可以进行后续的操作。
本地调试
2. 生成docker镜像并上传到腾讯云镜像仓库
在一台安装好git+java+maven+docker的linux主机上执行下面的命令生成docker镜像。由于我们的application.yml文件需要读取环境变量来获取数据库的地址,所以我们在打包jar包和docker镜像的时候需要指定参数-dskiptests,否则在测试的时候会报数据库连接的错误。
cd /optgit clone https://github/xianl/userprovider.gitcd userprovidermvn clean package docker:build -dskiptests
执行docker images 可以看到刚才生成的userprovider镜像。
[root@vm_1_13_centos ~]# docker imagesrepository tag image id created sizeuserprovider latest 53cdf5acf3a4 2 hours ago 673.6 mbdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 mb
腾讯云的镜像仓库服务是包含在容器服务内而不像其他云厂商专门列出一项服务,使用前需要先开通。
开通镜像服务
通之后按照惯例先login再打tag最后上传。
[root@vm_1_13_centos userprovider]# docker login --username=xxxxxxxxx ccr.ccs.tencentyunpassword:login succeeded[root@vm_1_13_centos userprovider]# docker tag userprovider:latest ccr.ccs.tencentyun/mydocker/userimage:0.0.1[root@vm_1_13_centos userprovider]# docker imagesrepository tag image id created sizeccr.ccs.tencentyun/mydocker/userimage 0.0.1 53cdf5acf3a4 13 minutes ago 673.6 mbuserprovider latest 53cdf5acf3a4 13 minutes ago 673.6 mbdocker.io/java latest d23bdf5b1b1b 11 months ago 643.1 mb[root@vm_1_13_centos userprovider]# docker push ccr.ccs.tencentyun/mydocker/userimage:0.0.1the push refers to a repository [ccr.ccs.tencentyun/mydocker/userimage]04e86a77317a: pushed35c20f26d188: pushedc3fe59dd9556: pushed6ed1a81ba5b6: pusheda3483ce177ce: pushedce6c8756685b: pushed30339f20ced0: pushed0eb22bfb707d: pusheda2ae92ffcd29: pushed0.0.1: digest: sha256:30361f7235797976d196473374a4b16c39fe614753d1801b329be7ea55a7e6fa size: 2212
登录管理界面也能看到刚才上传的userimage镜像。
镜像列表
3. 搭建容器群集并部署服务
腾讯云上的容器集群搭建非常之简单,可以任意添加新建的节点甚至已有的cvm虚拟机。具体步骤我这里不再赘述,官方文档上写的都很清楚大家可以查看。
群集管理
同时我们在容器集群所在的vpc内部再建立一台mysql数据库,按照之前处理本地数据库的步骤同样创建userdb数据库和用户springuser,数据库的内网地址为10.98.1.9,后面我们需要把这个地址传进容器服务里。
mysql实例
对于k8s集群,一般来说我们可以使用kubectl来下发如下的yml文件来进行部署,yml文件中主要指定了镜像的地址,端口号以及我们需要配置的环境变量等。
---apiversion: apps/v1beta1kind: deploymentmetadata:name: userproviderspec:replicas: 1template:metadata:labels:app: userproviderspec:containers:- name: userproviderimage: ccr.ccs.tencentyun/mydocker/userimage:0.0.1ports:- containerport: 8090env:- name: userprovider_mysqlvalue: 10.98.1.9---apiversion: v1kind: servicemetadata:name: userproviderspec:type: nodeportports:- nodeport: 30010port: 8090targetport: 8090selector:app: userprovider
腾讯云容器服务为用户提供了更为方便的操作方法,只需在添加服务界面进行一定配置就能进行服务部署,等于是把ymal文件的配置做了可视化,减轻了用户的工作量。
注意一下环境变量的部分,我们这里指定了userprovider_mysql为我们内网数据库的地址10.98.1.9。
新建容器服务
因为我们选取了发布服务到公网,系统会自动创建lb将公网端口8080映射到容器的服务端口8090, 查看lb详情可以看到自动生成的域名。
lb详情
通过访问绑定的域名的8080端口,接口测试成功。
通过lb接口测试
总结
从上面的测试步骤可以看到,腾讯云的容器服务从最大程度上做到了人性化,用户甚至可以在完全不用登陆群集节点的情况下快速进行容器服务部署。同时腾讯云容器服务本身就是基于k8s做服务编排并兼容kubernetes标准api,又使得其通用性和易用性更强。本例提供的生成镜像的方法还是以手动为主,在客户的实际环境中如果结合jenkins等ci/cd的工具就能够进一步提高效率和自动化程度。另外本文未提及的日志管理、监控告警功能也能为用户提供更多的便利,使开发人员将时间更多的投入在业务逻辑本身,也使运维人员能更多的把时间投入在应用本身的异常上面。