Eric

Eric 查看完整档案

上海编辑湖北工业大学  |  计算机科学与技术 编辑优尔高科  |  Java研发工程师 编辑 segmentfault.com/u/eric11 编辑
编辑

许涛,Java后端研发,web端研发经验丰富,主要负责pc端和移动端的企业级业务处理系统定制化开发,如:综合网管、ERP系统、故障处理平台、电子工单系统、辅助监控系统等。
参与过多个大型项目,对大数据处理,高并发等技术有较为丰富的经验。

个人动态

Eric 发布了文章 · 2020-12-31

docker+jenkins实现自动化部署

背景

早上来到公司,我们做的第一件事情就是从源码库签出最新的源码,然后进行单元测试,如果发现失败的测试,会找相关的同事一起调试,修复错误代码。接着回到自己的工作上来,编写自己的产品代码。忙到午饭时间,代码编写得差不多了,测试也通过了,开心地享用午餐,然后休息。谁料QA小组又发过来了几个bug,没办法,先本地重现再说,于是熟练地用IDE生成了一个WAR包,部署到Web容器下,启动容器。看到熟悉的界面了,遵循bug报告,一步步重现了bug,快下班的时候,bug修好了,提交代码,在愉快中结束了一天的工作。仔细总结一下,我们会发现,除了编写源代码,我们每天有相当一部分时间花在了编译、打包和部署等烦琐且不起眼的工作上。如果我们现在还手工这样做,那成本也太高了,于是有人用软件的方法让这一系列工作完全自动化,使得软件的构建可以像全自动流水线一样,只需要一条简单的命令,所有烦琐的步骤都能够自动完成。
image.png

工具介绍

image.png
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,通过提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
image.png
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
image.png
Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。

docker安装

操作系统:centos7.5
使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh

使用yum命令安装
安装命令如下:
yum install -y docker
设置阿里仓库地址:
echo '{"registry-mirrors": ["https://3laho3y3.mirror.aliyuncs.com"]}' > /etc/docker/daemon.json
启动:systemctl start docker
设置开机自启:systemctl enable docker

rancher安装

命令:
docker run -d --name rancher-server -p 8080:8080 --restart=unless-stopped -e DEFAULT_CATTLE_CATALOG_URL='{"catalogs":{"library":{"url":"http://git.oschina.net/rancher/rancher-catalog.git","branch":"k8s-cn"}}}' rancher/server:stable && sudo docker logs -f rancher-server

-d(可选)在后台运行容器(即“分离”模式)并输出容器ID。如果您不指定此选项, 则在终端窗口中输出正在运行的此容器的Docker日志。
-p 8080:8080 映射(例如“发布”)rancher-server容器的端口8080到主机上的端口8080。 第一个数字代表主机上的端口,而最后一个代表容器的端口。
-e DEFAULT_CATTLE_CATALOG_URL='{"catalogs":{"library":{"url":"http://git.oschina.net/rancher/rancher-catalog.git","branch":"k8s-cn"}}}' 设置环境变量,默认的rancher商店地址国内访问缓慢

Jenkins安装

命令:
docker run \
-u root \
-d --name jenkins \
-p 8081:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean && sudo docker logs -f jenkins

-d(可选)在后台运行容器(即“分离”模式)并输出容器ID。如果您不指定此选项, 则在终端窗口中输出正在运行的此容器的Docker日志。
-p 8081:8080 映射(例如“发布”)jenkinsci/blueocean 容器的端口8080到主机上的端口8081。 第一个数字代表主机上的端口,而最后一个代表容器的端口。
-p 50000:50000(可选)将 jenkinsci/blueocean 容器的端口50000 映射到主机上的端口50000。
-v jenkins-data:/var/jenkins_home(可选,但强烈建议)映射在容器中的/var/jenkins_home 目录到具有名字 jenkins-data 的volume。 如果这个卷不存在,那么这个 docker run 命令会自动为你创建卷。 如果您希望每次重新启动Jenkins(通过此 docker run ... 命令)时保持Jenkins状态,则此选项是必需的 。 如果你没有指定这个选项,那么在每次重新启动后,Jenkins将有效地重置为新的实例。
-v /var/run/docker.sock:/var/run/docker.sock(可选 /var/run/docker.sock 表示Docker守护程序通过其监听的基于Unix的套接字。 该映射允许 jenkinsci/blueocean 容器与Docker守护进程通信, 如果 jenkinsci/blueocean 容器需要实例化其他Docker容器,则该守护进程是必需的。 如果运行声明式管道,其语法包含agent部分用 docker

Jenkins安装过程

image.png
image.png
image.png
image.png
image.png
image.png

Jenkins插件安装

image.png
image.png
1、在系统管理中的插件管理;
2、然后点击选插件,在右上角输入Git Parameter和Publish Over SSH,找到Git Parameter和Publish Over SSH后点击左下方的的直接安装

Publish Over SSH配置

image.png
image.png

Maven配置文件设置

image.png
image.png

Jenkins配置一个自由风格的项目

image.png
1、登录jenkins,点击新建任务
image.png
2、输入任务名称,然后有两项选择,一是选择构建一个自由风格的软件项目,确定即可;二是克隆已有项目,输入该项目名称,确定即可。
3、创建成功后会打开该任务的配置页面,如果选择的是2中的第二个选项,则已经有克隆目标任务的配置项,在此基础上进行修改即可。配置项页面说明如下:
(1)General:git项目选择参数化构建过程,填写内容参考下图;svn项目可不填写此项;
(2)源码管理:git项目选择git,svn项目选择svn,填写项目地址以及有权限的用户名和密码。
(3)构建触发器:可不填。
(4)构建环境:可不填。
(5)构建:(此步骤为maven打包)点击增加构建步骤,选择调用顶层maven目标,maven版本选择mm(预先设置),目标选择打包命令即可,一般为clean package,如果是多环境配置,则需要加上环境参数如-Pdemo;
(6)构建后操作:(此步骤为上传war及执行部署命令)点击添加构建后操作步骤,选择Send build artifacts over SSH,选择项目部署目标服务器(要提前配置,目前已配置好),并按如下填写部署属性及部署命令。多节点可多次添加构建后操作。
命令示例:
停掉tomcat的docker容器
docker stop tomcat_sdso
备份当前war包
mv /home/gcuser/dockercompose/sdso/tomcat/webapps/*.war /home/gcuser/dockercompose/sdso/tomcat/webapps/sdso.war.date +%Y%m%d%H%M%S
将上传过来的war包拷贝到目标路径,此处为tomcat的docker容器中webapps目录映射到主机上的目录
mv /home/gcuser/sdso.war /home/gcuser/dockercompose/sdso/tomcat/webapps/sdso.war
启动tomcat的docker容器
docker start tomcat_sdso

配置项-General

image.png

配置项-源码管理

image.png

配置项-构建

image.png

配置项-构建后操作

image.png

jenkins手动触发构建

image.png

查看原文

赞 0 收藏 0 评论 0

Eric 回答了问题 · 2020-12-30

mysql查看哪个语句占用了连接

登录数据库所在服务器上用命令可以查连接的pid和相关信息

关注 2 回答 1

Eric 发布了文章 · 2020-12-30

mycat+mysql+tidb冷热数据分离——优化查询效率

mycat简介
Mycat Server相当于一个超级分布式数据库,支持1000亿数据
image.png
TiDB简介:PingCAP设计的开源分布式数据库
image.png
业务改造前逻辑
image.png
案例来源:中移物联网集团三费稽核系统
image.png
业务改造后逻辑
image.png
案例来源:中移物联网集团三费稽核系统
image.png

查看原文

赞 0 收藏 0 评论 0

Eric 回答了问题 · 2020-12-29

数据表有默认值,sql插入数据时不传值报错

这种情况我之前也遇到过,和Java编译器有关。目前不知道你用的jdk是什么版本的。大致应该是部署在Linux服务器上的程序,通过jdk编译后的程序在对数据库进行操作时会默认进行sql调整。

关注 3 回答 1

Eric 关注了用户 · 2020-12-29

已注销 @liao111

关注 1

Eric 回答了问题 · 2020-12-29

mysql允许一条sql的最大执行时间

一般来说,mysql(默认设置)好像没有所谓明确的sql最大执行时间。mysql会一直执行sql直到完成后会自动commit。所以就会出现两种情况:1、mysql提示正在执行,等待一会后会提示sql执行完成,并在控制台显示提示。
2、mysql提示正在执行,但一直是执行状态,实际上已经挂死,这时再操作sql涉及的这张表会提示资源正忙,结束的方法只能是kill掉这个sql执行的线程。

关注 3 回答 2

Eric 关注了用户 · 2020-12-29

汝何不上九霄 @ruhebushangjiuxiao

关注 6

Eric 关注了问题 · 2020-12-29

内网数据库1和外网数据库2如何做某些表的数据同步?

前提
  • 内网A部署了文档项目(Spring Boot),外网B部署了Information项目(对外工单相关)
已知限制条件:
  • 文档项目无法开启外网,后台框架为Spring Boot
  • Information项目和文档项目不在同一个服务器

现在需要在官方站点C(有外网)中使用到文档项目中的某些接口

目前的蠢办法是Information复制一遍接口,可是Information数据库和内网数据库质检如何保持数据同步呢?

关注 4 回答 3

Eric 赞了回答 · 2020-12-29

内网数据库1和外网数据库2如何做某些表的数据同步?

这个可以用程序通过binlog同步实现。

按题主说的这个,主要是为了做两个表之间的数据同步,要实现的就是一个表有变化要通知出来,然后去更新另一张表。

使用binlog同步的原理把程序伪装成一个从库,每当表有更新的时候都会发binlog消息。程序接收到binlog消息后,可以按需求处理,比如上面说的更新另一张表。实时性比较好

推荐个binlog同步的工具包binlogportal,可以直接加载到在现有的springboot项目中,使用简单。

关注 4 回答 3

Eric 发布了文章 · 2020-12-29

系统卡顿及PDF生成问题排查

最近在项目开发过程中遇到了个问题,通过查找资料和与同事沟通,目前已解决,下面梳理下问题详情及解决方式和思路。
系统卡顿排查
卡顿现象回顾

现象描述:
生产环境中,在业务高峰期时,批量的进行一个业务操作,比如生成报告、审核、审批。操作时间明显增加,由之前的2-3s
延长至7-8s。如果此时仍有大量用户进行操作,相应操作时间还会持续增加。到了一个阀值,就会出现部分用户操作没有反应,
由于前端是ajax同步请求,进而浏览器锁住不能任何操作,最后出现奔溃提醒。如果此时不做任何处理,大批用户就会出现系
统卡顿不能正常业务操作。
系统框架:
springboot +web 前后端分离
面向用户:
省院 + 安徽16个地市检验机构
临时处理方案:
用jstack导出堆栈信息,截断保存当时的接口日志文件,然后重启下接口服务。
人工盯梢:
由于接口服务是部署的四个节点,出现这类问题,会导致四个节点相继卡死宕机。在问题未处理之前,业务高峰期时,派人盯
着这四个节点,出现问题就立即按照临时处理方案进行处理。

问题分析

1、分析堆栈日志:
从堆栈日志分析来看,主要状态为:WAITING、TIMED_WAITING。日志文件较大,有2M左右。
有两处报错指向了项目中具体的代码行数(见下图)。
image.png
此时我们知道流程平台查询当前环节参与者出错了。
2、分析系统日志:
经过几次卡顿重启,每此卡顿的时候,系统日志打印的最后一行是BwpServiceImpl中getCurrentActInfo。似乎问题已经明
朗,是这个方法的异常引起的。
3、业务处理逻辑梳理:
业务每个环节的操作,调用流程平台引擎服务,调用
成功后,进行处理系统内业务数据。
流程平台配置了流程完成后触发事件,通过httpPost
方式将当前环节信息和下一环节信息发送给检验接口服务。
通过查询流程平台日志,业务高峰,这个方法耗费了12s
以上。
image.png
这整个处理逻辑,增加了事物@Transactional注解。

问题解决

总结:
从以上的三个切入点可知:问题出在流程平台查询当前环节。业务系统调用流程平台,流程平台调用业务系统。这种环环相扣的情况下,而当业务系统卡死宕机,流程平台调用业务系统的方法,都是等待中,一直到达到超时时间。此时业务系统其他节点调用流程平台也处于等待状态。业务系统重启后,才会释放所有的连接。
处理办法:
1、流程平台查询当前环节,改为直接从数据库中进行查询。查询不到的会从接口中再处理查询一次。
2、流程平台回调方法改为异步处理,缓解流程平台压力。
3、流程平台回调方法单独部署一个节点,与生产环境隔离处理,释放生产环境服务压力。
4、接口实现类的定义,由类中定义一次改为方法内需要的时候才定义。

PDF生成问题

PDF生成方法:
phantomjs + window7及以上操作系统
PDF生成原理:
1、下载phantomjs,放在window目录中,并在系统环境变量中配置对应的路径。
2、 在window环境中部署一个tomcat,放置生成方法的代码的war包,启动tomcat。要想不被系统拦截,需要关闭系统防火
墙。
3、需要生成PDF的时候,调用这个tomcat服务。
4、 phantomjs生成PDF本地文件,利用ftp将本地文件夹上传至服务器中保存,将对应的路劲保存于业务表中。
问题描述:
生产环境,每天需要生成原始记录和检验报告总共约2000+。在相同的环境中,生成的PDF结果不一致。部分生成的PDF中缺少用户签名图片,签名区直接展示空白。
问题排查1:
由于生成PDF是插件,并没有日志来供我们查询排查问题。
所以我们只能大胆的进行几个设想:
1、签名图片太大没有加载出来就生成了PDF文件
2、签名图片加载失败了
论证猜想:
方法1、把签名图片统一进行压缩处理,保证每个签名图片不超过10k。签名图片其实是一个img标签进行展示,增加onerror
属性,将默认图片放在window本地。
方法2、在1的基本上,将图片以base64的方式保存在img中的src路径中。
结果:
还是会出现缺少签名的PDF签名出现。
问题排查2:
根据排查1,我们可以得出有个结论:签名图片加载方式/有无图片,并不能影响结果。
猜想:
方法1、是不是生成PDF的时候,此时img标签src内容为空或者根本没有增加img标签。
结果:
我们在后台增加一个方法,把整个待生成PDF的html内容转化为Document对象,查找签名的位置,如果签名位置img标签不存在,则马上补一个上去。更新到生产环境,发现还是会出现缺少签名的PDF签名出现,但是丢失的概率会降低。
问题排查3:
根据排查2,我们可以得出有个结论:签名图片就算补全,还是没能解决根本的问题。
再来猜想:
方法:是不是生成PDF的时候,一下子并发很多,导致phantomjs 出现卡顿,加载不完整。
结果:
吸取前两次经验,我们现在做了两个处理:
1、页面html加载好之后,我们增加了延迟时间,7秒后再来执行phantomjs导出方法;
2、增加了几个window服务节点,让一个节点变成多个节点来工作;
3、增加一个小算法,平均每个节点工作量一致,每个节点都有在运行的任务;
4、调用这些节点的时候,后台增加一个判断,必须上一次导出工作完成,才能进行下一次的调用。保证每个节点上,phantomjs只有一个导出程序在工作。
通过这些调整,最终我们发现,不存在签名图片丢失,问题圆满解决。

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 1 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-12-14
个人主页被 1.5k 人浏览