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

首发于:https://cloud.tencent.com/developer/article/1017063

由于最近容器技术的火热,各大云计算厂商都已经提供了独立的容器服务,腾讯云也不例外。腾讯云容器服务的官方文档提供了一个基于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。
这里写图片描述
修改对应的名字,我们这里就叫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,后面我们需要把这个地址传进容器服务里。
这里写图片描述

对于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详情可以看到自动生成的域名。
这里写图片描述
通过访问绑定的域名的8080端口,接口测试成功。
这里写图片描述


总结

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值