产品文档

最佳实践

2023-04-24 03:55:11

Java单体服务迁移至京东云kubernetes案例

简介:

本文档基于开源的java单体服务(开源问卷系统、DWSurvey)为例,国内码云地址(https://gitee.com/wkeyuan/DWSurvey),github地址(https://github.com/wkeyuan/DWSurvey),演示java 单体服务从源码如何进行源代码编译、容器镜像构建、在京东云创建RDS、并自编写yam文件将服务运行在京东云托管的kubernetes环境。

本文档所涉及使用的软件环境如下:

RDS: 京东云托管数据库,京东云官方文档:https://docs.jdcloud.com/cn/rds/product-overview
Kubernetes:京东云kubernetes集群环境、完全兼容社区版本,京东云官方文档:https://docs.jdcloud.com/cn/jcs-for-kubernetes/product-overview

Dockerfile及yaml文件:

本文档使用DWSurvey源代码、Dockerfile及yaml文件已经全部上传至github,地址如下:
https://github.com/zhangshijle/dwsurvey-to-jdcloud-kubernetes.git

实现步骤:

一:RDS:
	1、在京东云创建RDS,如果需要其它中间件也可以按照京东云官方文档创建。
	2、在RDS创建数据库账户并进行账户授权
二:java源代码编译:
	1、准备Java编译环境
	2、Clone Java源代码
	3、修改源代码中的RDS连接信息、账户及密码
	4、RDS数据初始化
	5、编译Java源代码并进行制品测试
三:容器镜像构建:
	1、编写Dockerfile构建容器镜像并测试
四:在kubernetes部署web服务并验证
	1、编写yam文件,在kubernetes运行web服务并进程状态验证
	2、编写yaml文件,在kubernetes集群创建service并进行访问测试

一:创建RDS:

在京东云控制台创建RDS、创建普通数据库账户并进行账户授权,Java服务将使用此普通账户连接RDS。

1.1:在控制台点击RDS:

image.png

1.2:选择配置:

image.png

1.3:选RDS网络及参数:

RDS所在的网络尽量与后期部署的web 服务在同一个VPC,如果不在同一个VPC则需要打通跨VPC的通信。
image.png

1.4:确认RDS处于运行状态:

image-20230406105634945.png

1.5:获取RDS内网或外网域名:

此域名为RDS的内网或外网户名,内网域名将被解析为RDS的内网IP,外网域名将被解析为RDS的外网IP,外网域名默认未开启、需要单独开启,如果只在京东云内部访问RDS、推荐使用内网域名,相对更加安全。
image-20230406110045141.png

1.6:创建数据并授权:

创建一个数据库和一个数据库账户,用于Java应用程序连接RDS使用。

1.6.1:创建数据库:

image-20230406114108774.png

1.6.2:指定库名和字符集:

按照实际需求,指定库名和字符集。

image-20230406115626456.png

1.6.3:创建RDS账户:

按照实际需求,创建RDS账户并指定密码。

user:DWSurvey
password:DWSurvey123456

image-20230406114800619.png

1.6.4:修改账户权限:

按照实际需求,为账户授予RDS的访问权限

1.6.4.1:修改账户权限:

点击指定账户的 修改权限 菜单。

image-20230406114336957.png

1.6.4.2:选择权限:

为账户选择合适的权限,并点击确定。
image-20230406114405570.png

1.6.5:验证授权:

验证账户权限和数据库是否对应。
image-20230406114423936.png

1.7:测试账户连接:

确认可以使用RDS普通账户远程连接到RDS。

[root@20220530-instance ~]# yum install -y mariadb

连接信息为之前步骤获取到的RDS连接地址、创建的RDS账户及指定的密码:
地址: mysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com
库名:dwsurvey
账户:DWSurvey
密码:DWSurvey123456

[root@20220530-instance ~]# mysql -hmysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com -uDWSurvey -pDWSurvey123456

image-20230406115327777.png

二:Java源代码编译:

基于maven等于Java源代码进行编译,构建为jar包,后续再将jar包构建为容器镜像。

2.1:JDK环境准备:

[root@20220530-instance ~]# yum install java-1.8.0-openjdk
[root@20220530-instance ~]# java  -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-b08)
OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode

2.2:maven环境准备:

[root@20220530-instance apps]# tar xvf apache-maven-3.6.3-bin.tar.gz 

[root@20220530-instance apps]# ln -sv /apps/apache-maven-3.6.3 /apps/maven
‘/apps/maven’ -> ‘/apps/apache-maven-3.6.3’

[root@20220530-instance apps]# vim /etc/profile
	export PATH=/apps/maven/bin/:$PATH

[root@20220530-instance apps]# source  /etc/profile
[root@20220530-instance apps]# mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /apps/maven
Java version: 1.8.0_362, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"

2.3:修改源代码RDS连接地址:

~# git clone https://gitee.com/wkeyuan/DWSurvey.git
~# cd DWSurvey/

#修改RDS连接信息:
[root@20220530-instance DWSurvey]# vim src/main/resources/application-test.yml
  web:
    # 后端文件存储目录,默认即在安装包同级目录下
    file-path: dwfile/dwsurvey/
    # 使用哪种部署模式,后期可能会去掉,可以先保持默认
    static-type: static
    # 站点访问地址,如果配置有域名则为域名地址
    site-url: http://www.myserver.com:8081
    # 资源访问地址,便于存储模式的切换,目前可以保持与site-url一样
    resource-url: http://www.myserver.com:8080
    # 站点信息配置,会出现在底部footer区
    
  # 数据库配置
  datasource:
    #type: com.alibaba.druid.pool.DruidDataSource
    # 连接URL
    url: jdbc:mysql://mysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com:3306/dwsurvey?useUnicode=true&characterEncoding=utf8
    # 连接账号
    username: DWSurvey
    # 连接密码
    password: PASSWORD
    
[root@20220530-instance DWSurvey]# vim src/main/resources/application-prod.yml
  web:
    file-path: diaowen/file/
    static-type: static
    site-url: http://www.myserver.com:8080
    resource-url: http://www.myserver.com:8080
    #    site-url: http://ent82.surveyform.cn
    info:
      site-name: 调问网
      site-url: http://www.myserver.com:
      site-icp: 京ICP备13050030号-3
      site-mail: service@diaowen.net
      site-phone: 18888888888
      
  datasource:
    #type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://mysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com:3306/dwsurvey?useUnicode=true&characterEncoding=utf8
    username: DWSurvey
    password: PASSWORD
    type: com.alibaba.druid.pool.DruidDataSource

2.4:执行源代码编译:

基于maven对Java源代码进行编译

[root@20220530-instance apps]# cd /root/DWSurvey/
[root@20220530-instance DWSurvey]# mvn clean install package -Dmaven.test.skip=true
2.4.1:编译过程中:

image.png

2.4.2:编译完成:

image.png

2.5:验证编译完成的制品:

编译完成的jar包通常保存到源代码目录下的target目录中,此jar包将用于运行web服务及构建容器镜像:

[root@20220530-instance DWSurvey]# ll target/
total 165912
drwxr-xr-x 6 root root      4096 Apr  6 13:15 classes
-rw-r--r-- 1 root root 153230407 Apr  6 13:15 dwsurvey-oss-vue-v.5.3.0-Beta.jar #编译完成的制品
-rw-r--r-- 1 root root  16642040 Apr  6 13:15 dwsurvey-oss-vue-v.5.3.0-Beta.jar.original
drwxr-xr-x 3 root root      4096 Apr  6 13:15 generated-sources
drwxr-xr-x 2 root root      4096 Apr  6 13:15 maven-archiver
drwxr-xr-x 3 root root      4096 Apr  6 13:15 maven-status

2.6:RDS初始化:

导入提前准备好的sql文件,对RDS进行初始化。

[root@20220530-instance DWSurvey]# mysql -uDWSurvey -pDWSurvey123456 -hmysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com  dwsurvey < ./target/classes/conf/sql/dwsurvey.sql

#验证数据库数据:
[root@20220530-instance DWSurvey]# mysql -hmysql-cn-north-1-9cfa743ab2154809.rds.jdcloud.com -uDWSurvey -pDWSurvey123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3347
Server version: 5.7.33-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> use dwsurvey;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [dwsurvey]> show tables;
+----------------------+
| Tables_in_dwsurvey   |
+----------------------+
| t_an_answer          |
| t_an_checkbox        |
| t_an_chen_checkbox   |
| t_an_chen_fbk        |
| t_an_chen_radio      |
| t_an_chen_score      |
| t_an_comp_chen_radio |
| t_an_dfillblank      |
| t_an_enumqu          |
| t_an_fillblank       |
........................

2.6:基于java命令启动:

在可以连接RDS的测试环境启动jar包,验证服务是否可以正常运行:

[root@20220530-instance DWSurvey]# java  -jar target/dwsurvey-oss-vue-v.5.3.0-Beta.jar

image.png

2.8:登录验证:

通过浏览器访问服务器web界面,验证Java服务是否启动正常。

2.8.1:登录首页:

image-20230406142121497.png

2.8.2:输入登录账户名密码:
初始账号:service@diaowen.net
密码:123456

image-20230406142225636.png

2.8.3:登录成功后的页面:

登录成功后即可进行查看、配置等业务管理,不同的业务代码功能不一样,此处只作为部署参考,到此步骤即实现了java源代码的的编译步骤,接下来即可进行容器镜像构建并将APP运行在kubernetes环境的目的。

image-20230406142438158.png

三:容器镜像构建:

基于dockerfile,将上一步骤编译好的java程序构建成docker镜像,实现基于容器运行java app。

3.1:编写Dockerfile

根据实际需求,编写Dockerfile,将上一步骤编译好的jar包构建为容器镜像

[root@20220530-instance DWSurvey]# pwd
/root/DWSurvey

[root@20220530-instance DWSurvey]# mkdir -p  k8s/dockerfile
[root@20220530-instance DWSurvey]# cd k8s/dockerfile/
[root@20220530-instance dockerfile]# docker pull openjdk:8u312-buster #基于开源jdk镜像

[root@20220530-instance dockerfile]# cp ../../target/dwsurvey-oss-vue-v.5.3.0-Beta.jar ./ #拷贝jar包

[root@20220530-instance dockerfile]# ll
total 149652
-rwxr-xr-x 1 root root       175 Apr  6 15:22 build-command.sh
-rwxr-xr-x 1 root root        64 Apr  6 15:02 docker-entrypoint.sh
-rw-r--r-- 1 root root       245 Apr  6 15:36 Dockerfile
-rw-r--r-- 1 root root 153230407 Apr  6 14:56 dwsurvey-oss-vue-v.5.3.0-Beta.jar


#验证Dockerfile内容
[root@20220530-instance dockerfile]# cat Dockerfile 
FROM openjdk:8u312-buster 

RUN mkdir /apps

ADD docker-entrypoint.sh /usr/local/bin/
RUN ln -s /usr/local/bin/docker-entrypoint.sh /entrypoint.sh
ADD dwsurvey-oss-vue-v.5.3.0-Beta.jar /apps/ 

EXPOSE 8080

ENTRYPOINT ["docker-entrypoint.sh"]


#docker镜像启动服务的内置脚本
[root@20220530-instance dockerfile]# cat docker-entrypoint.sh 
#!/bin/bash

java  -jar /apps/dwsurvey-oss-vue-v.5.3.0-Beta.jar


#镜像构建脚本
[root@20220530-instance dockerfile]# cat build-command.sh 
#!/bin/bash

docker build -t myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1 .


docker push myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1


[root@20220530-instance dockerfile]# bash build-command.sh

image.png

3.2:验证镜像:

在可以连接RDS的主机,基于上一步骤构建的镜像创建测试容器,验证容器可以正常启动:

[root@20220530-instance dockerfile]# docker run -it -p 8080:8080 --rm myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1

image.png

四:在京东云kubernetes集群部署web服务并验证:

编写yaml文件,然后将java服务运行在kubernetes环境并验证是否可以通过外网访问

4.1:编写yaml文件:

基于编写yaml文件部署web服务

[root@20220530-instance DWSurvey]# pwd
/root/DWSurvey

[root@20220530-instance DWSurvey]# mkdir -p  k8s/yaml

[root@20220530-instance DWSurvey]# cd k8s/yaml/
[root@20220530-instance yaml]# cat 1.DWSurvey-deployment.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-dwsurvey-deployment-label
  name: myserver-dwsurvey-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-dwsurvey-selector
  template:
    metadata:
      labels:
        app: myserver-dwsurvey-selector
        project: myserver
    spec:
      containers:
      - name: myserver-dwsurvey-container
        image: myserver-cn-north-1.jcr.service.jdcloud.com/myserver/dwsurvey:v1 
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
      imagePullSecrets:
      - name: jcr-pull-secret

4.2:部署web服务:

#部署web服务
[root@20220530-instance yaml]# kubectl  apply -f 1.DWSurvey-deployment.yaml 
deployment.apps/myserver-dwsurvey-deployment created

#验证pod状态
[root@20220530-instance yaml]# kubectl  get pod -n myserver
NAME                                            READY   STATUS    RESTARTS   AGE
myserver-dwsurvey-deployment-7dc99c7ccd-b5qsd   1/1     Running   0          7m27s

4.3:创建service并验证:

当service创建成功后,即可通过service的公网IP访问运行在京东云kubernetes环境中的web服务了。

4.3.1:创建LoadBalancer类型的service:

LoadBalancer类型的service会创建一个带公网IP的SLB,用于从公网访问SLB后kubernetes集群中的web服务。

[root@20220530-instance yaml]# cat 2.DWSurvey-service.yaml 
kind: Service
apiVersion: v1
metadata:
  namespace: myserver
  name: myserver-dwsurvey-slb
  labels:
    k8s-app: myserver-dwsurvey-slb
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 31080
  type: LoadBalancer
  selector:
    app: myserver-dwsurvey-selector
    project: myserver

[root@20220530-instance yaml]# kubectl apply -f 2.DWSurvey-service.yaml 
service/myserver-dwsurvey-slb created

[root@20220530-instance yaml]# kubectl  get svc -n myserver
NAME                         TYPE      CLUSTER-IP            EXTERNAL-IP         PORT(S)        AGE
myserver-dwsurvey-slb   LoadBalancer   10.10.61.33   10.10.48.8,116.196.66.49   80:31080/TCP   2m55s
4.3.2:控制台验证SLB类型:

image-20230406180831114.png

4.4:访问验证:

可以将域名解析到SLB的公网IP(需提前备案)或使用公网IP访问测试。

初始账号:service@diaowen.net
密码:123456
4.4.1:登录界面:

image-20230406161542730.png

4.4.2:登录成功后的页面:

image-20230406161556931.png

按照以上步骤,即可完成java 单体服务到京东云kubernetes环境的整体迁移,其中Java服务以容器的形式运行在京东云kubernetes环境中、而业务数据则保存到京东云的RDS中。

文档反馈

开始与售前顾问沟通

可直接拨打电话 400-098-8505转1

我们的产品专家为您找到最合适的产品/解决⽅案

在线咨询 5*8⼩时

1v1线上咨询获取售前专业咨询

点击咨询
企微服务助手

专业产品顾问,随时随地沟通