作者:小傅哥

博客:https://bugstack.cn

沉淀、分享、成长,让自己和他人都能有所收获!

这位同学,你比上一位面试者好多了,你的简历中做的几个项目都不错。既有业务项目,也有技术项目,看得出你对编程开发是有一定的经验积累的。那么我还想了解下,这些项目在运行中的一个数据效果是怎么样的。比如;tps、qps、响应时间、数据库负载等,都是什么情况,你用的什么监控工具。另外你这里还些了微服务的架构,那么微服务间的链路调用是怎么监控的。

咋样,是不一下就慌了。张口就喊:“java 崩盘!” 以前靠背题吹牛逼就能入职,现在得把吹的牛逼落地了。而越来越多的面试官也更喜欢用结果推过程,从过程中再考察细节。一上来就问八股文的越来越少了。

所以,做完项目,最好在配上对应的数据,这样才更有说服力。—— 所以本文小傅哥会教会你,如何配置一套全链路监控系统,并完成测试获取系统运行的数据。此外这是整套《@小傅哥 Java 简明教程》其中的一节,更多内容可以进入这里学习;https://bugstack.cn/md/road-map/road-map.html

一、章节目的

本章节通过 Docker 方式部署一套 skywalking 非入侵的全链路监控系统,并在对应的测试工程中通过 skywalking-agent 字节码增强组件,采集系统运行时的各项信息到 skywalking-ui 监控平台观察数据。

二、基本环境

  • Docker version 1.13.1
  • Docker compose - 用于在云服务器环境中执行的 docker-compose 文件
  • Portainer Docker 容器管理面板

以上内容安装,参考【Java简明教程/发布部署】https://bugstack.cn/md/road-map/road-map.html - 发布部署

三、监控配置

skywalking 的安装,需要 elasticsearch - 存放数据、skywalking-oap 接收数据、skywalking-ui 界面展示。以及还需要一个 skywalking-agent 用于配置到应用程序中,采集监控数据。注意这些内容在官网中,都已提供,地址:https://skywalking.apache.org/downloads/

因为小傅哥这里提供了Docker的自动部署以及下载好了 skywalking-agent 所以你就不需要一个个去下载安装了。接下来小傅哥会分别介绍在本地环境云服务器两套环境安装,这样可以更加方便小伙伴做测试验证。

在进行下面的步骤前,请先下载 skywalking 监控工程;https://gitcode.net/KnowledgePlanet/road-map/skywalking

1. 本地环境

脚本/road-map/skywalking/docs/dev-ops/skywalking - 你可以打开工程找到这个位置,查看最新脚本。

version: '3.8'
services:
elasticsearch:
image: elasticsearch:7.16.2
container_name: elasticsearch
ports:
- "9200:9200"
healthcheck:
test: [ "CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/es_data:/usr/share/elasticsearch/data oap:
image: apache/skywalking-oap-server:8.9.0
container_name: oap
depends_on:
elasticsearch:
condition: service_healthy
links:
- elasticsearch
ports:
- "11800:11800"
- "12800:12800"
healthcheck:
test: [ "CMD-SHELL", "/skywalking/bin/swctl ch" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
SW_HEALTH_CHECKER: default
SW_TELEMETRY: prometheus
JAVA_OPTS: "-Xms1024m -Xmx1024m" skywalking-ui:
image: apache/skywalking-ui:8.9.0
container_name: skywalking-ui
depends_on:
oap:
condition: service_healthy
links:
- oap
ports:
- "9090:8080"
environment:
SW_OAP_ADDRESS: http://oap:12800
  • 在 Docker 安装并正确启动后,你就可以点击这个按钮了。它会帮你自动运行安装出整套的 skywalking 监控系统。非常方便。
  • 如果你点击红圈下面的单个按钮,那么代表的是只安装当前一个应用。
  • 你可以通过命令执行 skywalking-docker-compose.yml 的安装:/usr/local/bin/docker-compose -f /docs/dev-ops/skywalking/skywalking-docker-compose.yml up -d - 在云服务器端也是使用这个命令安装。

访问验证:http://localhost:9090/ - 我设置的端口是9090,如果你是其他的则需要修改。

2. 云服务器

  • 准备一台2核4G的云服务器,整个服务启动后会占用2-3G左右
  • 下载 ssh 工具,用于连接云服务。这里小傅哥推荐使用 Termius 非常好用!
  • docker-compose 安装,参考:https://bugstack.cn/md/road-map/road-map.html - 发布部署,Docker#7

2.1 文件上传

通过 ssh 的 sftp 工具,把 skywalking/docs 全部上传到云服务器。

2.2 执行脚本

[root@dev-ops ~]# cd /docs/
[root@dev-ops docs]# ls
dev-ops skywalking-agent sql
[root@dev-ops docs]# cd dev-ops/
[root@dev-ops dev-ops]# ls
environment skywalking
[root@dev-ops dev-ops]# cd skywalking/
[root@dev-ops skywalking]# ls
skywalking-docker-compose.yml
[root@dev-ops skywalking]# /usr/local/bin/docker-compose -f /docs/dev-ops/skywalking/skywalking-docker-compose.yml up -d
[+] Building 0.0s (0/0)
[+] Running 3/3
Container elasticsearch Healthy 0.5s
Container oap Healthy 1.0s
Container skywalking-ui Running 0.0s

安装完成记得开放端口;

  • 9090 端口;skywalking-ui 界面端口
  • 11800 端口;监控数据上报端口

安装完成后就可以访问监控界面了;http://180.76.138.**:9090/ - 替换为你的IP地址

四、数据上报

监控数据的上报使用的是 Javaagent 技术,在程序编译时候通过字节码增强技术,在需要监控的位置自动加上额外的监控代码,来采集系统的运行数据。所以我们这里可以把 Javaagent 配置到程序启动上,也可以配置到 Docker 镜像打包上。

1. 程序启动 - 加入探针

配置到 IDEA 程序启动中,VM Options 参数:-javaagent:/Users/fuzhengwei/1024/KnowledgePlanet/road-map/skywalking/docs/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking-app-dev -Dskywalking.collector.backend_service=127.0.0.1:11800

  • 注意修改;地址应用名IP【如果是云服务,就配置云服务的IP地址】

2. 镜像打包 - 加入探针

当程序需要运行在云服务的 Docker 容器了,就不能这样配置了,需要把配置打包到镜像里,更加方便执行。

# 基础镜像
FROM openjdk:8-jre-slim
# 作者
MAINTAINER xiaofuge
# 配置
ENV PARAMS=""
# 时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加应用
ADD /target/skywalking-app.jar /skywalking-app.jar
## 在镜像运行为容器后执行的命令
ENTRYPOINT ["java", "-Xmx512m", "-javaagent:/docs/skywalking-agent/skywalking-agent.jar", "-Dskywalking.agent.service_name=skywalking-app", "-Dskywalking.collector.backend_service=180.76.138.41:11800", "-jar", "/skywalking-app.jar"]
  • 注意;/docs/skywalking-agent/skywalking-agent.jar 这个是通过 SFTP 工具上传到云服务器端的。但不在 Docker 容器里,等部署程序的时候还需要做一次文件映射。

五、启动服务

如果你希望在把应用程序部署到云服务端,一种是通过 IDEA 连接 Docker 服务,另外一种是把应用程序的镜像发布到Docker Hub。这里我们通过 IDEA 连接 Docker 服务。参考:https://bugstack.cn/md/road-map/road-map.html - 开通 2375 端口,用完记得关闭。

脚本skywalking/src/bin/main/start.sh

CONTAINER_NAME=skywalking-app
IMAGE_NAME=fuzhengwei/skywalking-app:1.0
PORT=9091 echo "容器部署开始 ${CONTAINER_NAME}" # 停止容器
docker stop ${CONTAINER_NAME} # 删除容器
docker rm ${CONTAINER_NAME} # 启动容器 skywalking-agent 下载:https://archive.apache.org/dist/skywalking/java-agent/8.9.0/apache-skywalking-java-agent-8.9.0.tgz
docker run --name ${CONTAINER_NAME} \
-p ${PORT}:${PORT} \
-v /docs/skywalking-agent/:/docs/skywalking-agent/ \
-d ${IMAGE_NAME} #docker run --name skywalking-app \
#-p 9091:9091 \
#-v /docs/skywalking-agent/:/docs/skywalking-agent/ \
#-d fuzhengwei/skywalking-app:1.2 echo "容器部署成功 ${CONTAINER_NAME}" docker logs -f ${CONTAINER_NAME}
  • 你可以在云服务执行 start.sh 脚本,或者直接复制 docker run 命令,去执行启动。
  • 注意;-v /docs/skywalking-agent/:/docs/skywalking-agent/ \ 是你的映射地址,只有这样才能拿到 skywalking-agent
  • 另外记得按照 MySQL【environment-docker-compose.yml】 到云服务以及执行 road-map.sql 文件。

面试官:“同学,你做的这几个项目都不错。但怎么问QPS你就胡说呢?”的更多相关文章

  1. 面试官:怎么做JDK8的内存调优?

    面试官:怎么做JDK8的内存调优? 看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题.擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说: 在内存调优之前,需要先了解JDK8的 ...

  2. 面试官:怎么做JDK8的垃圾收集器的调优?

    面试官:怎么做JDK8的垃圾收集器的调优? 看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题.擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说: 在JDK8中有Serial收 ...

  3. 面试官:说一说Zookeeper中Leader选举机制

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 今天又是一个阳光明媚的一天,我又 ...

  4. 我是面试官--"自我介绍"

    工作10余年,经历过很多次面试,也面试了N多人.这些年来,已经有好些位朋友(或同事)与我聊起相关话题,涉及面试,更关乎职业生涯规划.感触颇多,就借助自媒体的浪潮,与更多的程序员一起共谈面试经历,希望可 ...

  5. 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)

    本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公司你选,两厢便利. 毕 ...

  6. [Interview]读懂面试问题,在面试官面前变被动为主动

    面试是供需双方心理的较量,作为求职者来说,了解对方问题的内涵,做到“明明白白他的心”,就能变被动为主动.因此,读懂面试问题,掌握面试考官的提问的目的,有准备.有针对性地回答,对提高应聘的成功率是有很大 ...

  7. RabbitMQ系列(六)--面试官问为什么要使用MQ,应该怎么回答

    如果简历中有写到使用过RabbitMQ或者其他的消息中间件,可能在MQ方面的第一个问题就是问:为什么要使用MQ 面试官期望的回答 1.项目中有什么业务场景需要用到MQ 2.但是用了MQ,会带来很多问题 ...

  8. Redis——面试官考题

    总结: 本文在一次面试的过程中讲述了 Redis 是什么,Redis 的特点和功能,Redis 缓存的使用,Redis 为什么能这么快,Redis 缓存的淘汰策略,持久化的两种方式,Redis 高可用 ...

  9. CURD系统怎么做出技术含量惊艳面试官

    在<CURD系统怎么做出技术含量--怎样引导面试>有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧.这里我解释一下,怕大家对DDD领域驱动设计有什么误解. DDD是为解决软件复杂性 ...

  10. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

随机推荐

  1. [整理] FFmpeg官方文档树

    扫了一遍官方文档,整理张官文树. 当然还有很多细节,可以慢慢沿着树根填,有需要可以联系我要ProcessON源文件,我尽量给个最新的出来. 官文 : http://ffmpeg.org/documen ...

  2. python之re详解

    import re# .匹配任何一个字符,除了换行#[]匹配里面任意一个字符# \d匹配一个数字0-9# \D匹配不是一个数字# \s 匹配一个空格和tab# \S 匹配非空格和tab一个字符# \w ...

  3. 6.Get和Post

    1.概述 URL是一个资源描述符,一个URL用于描述一个网上资源 Get用于获取/查询资源信息,Post用于更新资源信息 2.联系和区别 2.1.Get后退刷新无害,Post需要重新提交: 2.2.G ...

  4. Java设计模式 —— 享元模式

    14 享元模式 14.1 享元模式概述 Flyweight Pattern: 运用共享技术有效地支持大量细粒度对象的复用. 当系统中存在大量相同或相似的对象时,它通过共享技术实现相同或相似的细粒度对象 ...

  5. Redis(三)jedis与锁

    1 Jedis 引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis ...

  6. Disruptor-源码解读

    前言 Disruptor的高性能,是多种技术结合以及本身架构的结果.本文主要讲源码,涉及到的相关知识点需要读者自行去了解,以下列出: 锁和CAS 伪共享和缓存行 volatile和内存屏障 原理 此节 ...

  7. SpringBoot 使用 Sa-Token 完成权限认证

    一.设计思路 所谓权限认证,核心逻辑就是判断一个账号是否拥有指定权限: 有,就让你通过. 没有?那么禁止访问! 深入到底层数据中,就是每个账号都会拥有一个权限码集合,框架来校验这个集合中是否包含指定的 ...

  8. ping功能实现(ICMP)

    简单记录下项目中ping功能实现 笔记:ping功能实现 void Handler::handlePingDepot(const char *ip) { int mSize=50*1024; bzer ...

  9. ClickHouse主键索引最佳实践

    在本文中,我们将深入研究ClickHouse索引.我们将对此进行详细说明和讨论: ClickHouse的索引与传统的关系数据库有何不同 ClickHouse是怎样构建和使用主键稀疏索引的 ClickH ...

  10. flink之Sink to MySQL和Redis

    前言 下面这篇文章是使用Flink的Sink 写出数据到Redis和MySQL Flink之Sink写入Redis和MySQL Flink需要添加Sink的时候,需要自己去添加写Sink,我们可以实现 ...