专栏首页李想的专栏从零开始搭建腾讯云上的SpringBoot容器化应用
原创

从零开始搭建腾讯云上的SpringBoot容器化应用

由于最近容器技术的火热,各大云计算厂商都已经提供了独立的容器服务,腾讯云也不例外。腾讯云容器服务的官方文档提供了一个基于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.com/xianl/UserProvider

需要提到的是application.yml文件和项目根目录下的MAVEN配置文件pom.xml

application.yml 中通过${userprovider_mysql} 来获取环境变量中配置好的数据库地址传给jdbc,后面会演示如何通过腾讯云的容器服务来传入这个参数到容器内。

server:
  port: 8090
spring:
  jpa:
    hibernate:
      ddl-auto: create
  datasource:
    url: jdbc:mysql://${userprovider_mysql}/userdb
    username: springuser
    password: Test01!
info:
  app:
    name: @project.artifactId@
    encoding: @project.build.sourceEncoding@
    java:
      source: @java.version@
      target: @java.version@

pom.xml 需要引入JPAmysql的依赖包,同时加入docker-maven-plugin用于直接打包生成docker镜像。

    <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>

			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<configuration>
					<imageName>userprovider</imageName>
					<baseImage>java</baseImage>
					<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
					<resources>
						<resource>
							<targetPath>/</targetPath>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
			</plugin>

		</plugins>
	</build>

首先在本地进行调试,创建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 /opt
git clone https://github.com/xianl/UserProvider.git
cd UserProvider
mvn clean package docker:build -DskipTests

执行docker images 可以看到刚才生成的userprovider镜像。

[root@VM_1_13_centos ~]# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
userprovider                                latest              53cdf5acf3a4        2 hours ago         673.6 MB
docker.io/java                              latest              d23bdf5b1b1b        11 months ago       643.1 MB

腾讯云的镜像仓库服务是包含在容器服务内而不像其他云厂商专门列出一项服务,使用前需要先开通。

开通镜像服务

通之后按照惯例先login再打tag最后上传。

	[root@VM_1_13_centos UserProvider]# docker login --username=xxxxxxxxx ccr.ccs.tencentyun.com
	Password: 
	Login Succeeded
	[root@VM_1_13_centos UserProvider]# docker tag userprovider:latest  ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1
	[root@VM_1_13_centos UserProvider]# docker images
	REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
	ccr.ccs.tencentyun.com/mydocker/userimage   0.0.1               53cdf5acf3a4        13 minutes ago      673.6 MB
	userprovider                                latest              53cdf5acf3a4        13 minutes ago      673.6 MB
	docker.io/java                              latest              d23bdf5b1b1b        11 months ago       643.1 MB
	[root@VM_1_13_centos UserProvider]# docker push ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1
	The push refers to a repository [ccr.ccs.tencentyun.com/mydocker/userimage]
	04e86a77317a: Pushed 
	35c20f26d188: Pushed 
	c3fe59dd9556: Pushed 
	6ed1a81ba5b6: Pushed 
	a3483ce177ce: Pushed 
	ce6c8756685b: Pushed 
	30339f20ced0: Pushed 
	0eb22bfb707d: Pushed 
	a2ae92ffcd29: Pushed 
	0.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/v1beta1
	kind: Deployment
	metadata:
	  name: userprovider
	spec:
	  replicas: 1
	  template:
	    metadata:
	      labels:
	        app: userprovider
	    spec:
	      containers:
	      - name: userprovider
	        image: ccr.ccs.tencentyun.com/mydocker/userimage:0.0.1
	        ports:
	        - containerPort: 8090
	        env:
	        - name: userprovider_mysql
	          value: 10.98.1.9
	---
	apiVersion: v1
	kind: Service
	metadata:
	  name: userprovider
	spec:
	  type: NodePort
	  ports:
	  - nodePort: 30010
	    port: 8090
	    targetPort: 8090
	  selector:
	    app: userprovider

腾讯云容器服务为用户提供了更为方便的操作方法,只需在添加服务界面进行一定配置就能进行服务部署,等于是把ymal文件的配置做了可视化,减轻了用户的工作量。

注意一下环境变量的部分,我们这里指定了userprovider_mysql为我们内网数据库的地址10.98.1.9。

新建容器服务

因为我们选取了发布服务到公网,系统会自动创建LB将公网端口8080映射到容器的服务端口8090, 查看LB详情可以看到自动生成的域名。

LB详情

通过访问绑定的域名的8080端口,接口测试成功。

通过LB接口测试

总结

从上面的测试步骤可以看到,腾讯云的容器服务从最大程度上做到了人性化,用户甚至可以在完全不用登陆群集节点的情况下快速进行容器服务部署。同时腾讯云容器服务本身就是基于k8s做服务编排并兼容kubernetes标准API,又使得其通用性和易用性更强。本例提供的生成镜像的方法还是以手动为主,在客户的实际环境中如果结合Jenkins等CI/CD的工具就能够进一步提高效率和自动化程度。另外本文未提及的日志管理、监控告警功能也能为用户提供更多的便利,使开发人员将时间更多的投入在业务逻辑本身,也使运维人员能更多的把时间投入在应用本身的异常上面。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用腾讯云无服务器云函数(SCF)分析天气数据

    无服务器云函数(SCF)是腾讯云提供的Serverless执行环境,也是国内首款FaaS(Function as a Service,函数即服务) 产品。其核心...

    李想
  • 使用腾讯云“自定义监控”监控 GPU 使用率

    本文旨在通过使用腾讯云的“自定义监控”服务来自行实现对 GPU 服务器的 GPU 使用率的监控。

    李想
  • 腾讯云负载均衡CLB的那些“独门利器”

    今天就聊一聊腾讯云的负载均衡提供给客户的那些独有的特性,大家也可以了解下腾讯云负载均衡器的优势所在。

    李想
  • 理解 CRLF,LF

    CRLF, LF 是用来表示文本换行的方式。CR(Carriage Return) 代表回车,对应字符 '\r';LF(Line Feed) 代表换行,对应字符...

    yuxiaofei93
  • 容器中Secret的基础使用教程

    背景:我们都知道yaml文件中可以定义启动容器时使用的镜像所在地址,这里分为两种情况,即公有镜像和私有仓库镜像。

    keepyan
  • Python开源项目大集合:15个领域,181个项目 | 硬核干货

    互联网、音频、视频、图形、游戏、生产力、组织、通讯、教育、科学、CMS、ERP、静态站点、开发和其他。

    量子位
  • Docker系列——4.docker中运行nginx镜像

    由于我之前有运行镜像,且服务器上运行的镜像太多,我们先使用如下命令停止容器并删除容器,由于是运维开给我们的测试服务器,所以可以随便玩耍。

    陈琛
  • Docker容器迁移速度快不快?

    在虚拟云为主的云计算时代,想迁移一个应用或数据库,废尽周折,一般会采用重新部署或者采用专业的迁移工具进行打包迁移。在Docker时代,迁移速度、效率会超越你的想...

    希望的田野
  • 什么是微服务

    在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 p...

    前朝楚水
  • 什么是微服务?

    在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团...

    芋道源码

扫码关注云+社区

领取腾讯云代金券