springboot dubbo应用的链路信息采集——skywalking运行环境搭建

本文已参与腾源会发起的「开源摘星计划」

  • 视频教程一

    skywalking8.7.0搭建之centos7安装

  • 视频教程二

    skywalking8.7.0搭建之es+oap

  • 安装规划

skywalking java agent用于采集链路信息,kafak用于信息缓存,skywalking oap cluster(Observability Analysis Platform观测性分析平台)用于链路数据分析,并将数据存储到elasticsearch中,最终提供查询。需要用到:ElasticSearch7.9.1,Zookeeper3.6.2,Kafka2.5.0,Skywalking8.2.0。准备6个虚拟机节点:node1,node2,node3,内存为1G。3台安装springboot应用,包括一个dubbo提供者,一个消费者;同时node1,node2,node3也安装zookeeper集群,kafka集群。另外3台(node4、node5、node6)安装skywalking oap集群和es集群,内存为3G。

  1. Springboot应用在node1安装sprintboot dubbo consumer,node2上安装sprintboot dubbo provider,node3上安装。
  2. Skywalking java agent在3个机器上分别安装,分别安装在node1,node2,node3上。
  3. Kafak安装3个节点集群,分别安装在node1,node2,node3上。
  4. ElasticSearch安装3个节点集群,分别安装在node4,node5,node6上。
  5. Skywalking oap(服务端)3个节安装在node4,node5,node6上。

安装准备:我的pc机有32G内存、24个处理器。安装了oracle虚拟机管理器,和secureCRT。更具生产版本下载各个开源软件安装包:

CentOS-7-x86_64-Everything-2009

apache-skywalking-apm-es7-8.2.0.tar

elasticsearch-7.9.1-linux-x86_64.tar

kafka_2.12-2.5.0

node-v16.15.0-linux-x64.tar

apache-zookeeper-3.6.3-bin.tar.gz

网络规划:node1-6地址分别为192.168.0.201-206

  • 安装步骤
    • 最小安装centos7

设置好root密码,网络,主机名node1

cd /etc/sysconfig/network-scripts/

vi ifcfg-enp0s3

service network restart

hostname node1

vi /etc/hostname

node1

BOOTPROTO=static

ONBOOT=yes

IPADDR=192.168.0.201

NETMASK=255.255.255.0

GATEWAY=192.168.0.1

vi /etc/resolv.conf

nameserver 192.168.0.1

vi /etc/hosts

192.168.0.201 node1

192.168.0.202 node2

192.168.0.203 node3

192.168.0.204 node4

192.168.0.205 node5

192.168.0.206 node6

关闭防火墙:

systemctl stop firewalld.service

systemctl disable firewalld.service

安装基础命令:

yum -y install net-tools.x86_64

yum -y install java

yum -y install httpd-tools

yum -y install wget

传输安装包

把node1 java agent配置文件改好

复制虚拟机完成node2,node3,node4,node5,node6

启动修改IP地址。

    • Zookeeper集群安装:

下载安装包

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz --no-check-certificate

cd apache-zookeeper-3.6.3-bin

mv conf/zoo_sample.cfg conf/zoo.cfg

vi conf/zoo.cfg

新增配置:

server.1=node1:12888:13888

server.2=node2:12888:13888

server.3=node3:12888:13888

在目录/tmp/zookeeper下新建myid文件,写入一个数字代表Server编号。三个虚拟机分别是1,2,3

三个节点都操作。

cd /root/apache-zookeeper-3.6.3-bin

#启动集群:

bin/zkServer.sh start

#查看状态:

bin/zkServer.sh status

#登录命令行:

bin/zkCli.sh -server

    • kafka集群安装:

解压安装包,编辑配置文件:

cd /root/kafka_2.12-2.5.0

vi config/server.properties

改下面,broker.id改为节点号,node3就改为3。集群中不能重复。

broker.id=3

listeners=PLAINTEXT://node1:9092

zookeeper.connect=node1:2181,node2:2181,node3:2181

启动zookeeper后20秒再启动kafka。

https://stackoverflow.com/questions/39759071/error-while-starting-kafka-broker/47884301

启动:

cd /root/kafka_2.12-2.5.0

nohup bin/kafka-server-start.sh config/server.properties &

tail -f nohup.out

观察日志:

tail -f logs/server.log

[2022-05-11 02:20:21,680] INFO [KafkaServer id=3] started (kafka.server.KafkaServer)

#查看kafka topic命令

bin/kafka-topics.sh --list --bootstrap-server node2:9092

    • ElasticSearch集群安装

#文件打开数量调整

vi /etc/security/limits.conf

* hard nofile 65536

* soft nofile 65536

#内存使用调整

vi /etc/sysctl.conf

vm.max_map_count = 655360

vm.swappiness=1

sysctl -p #生效

#因为以 root 用户启动不了ES,需要新建用户:

chmod 777 /root

useradd es

passwd es

c

tar -xzf elasticsearch-7.9.1-linux-x86_64.tar.gz #用es用户解压

修改配置文件elasticsearch.yml

cd /root/elasticsearch-7.9.1

vi config/elasticsearch.yml

http.port: 9200

cluster.name: psbc-es

node.name: node4

network.host: node4

discovery.seed_hosts: ["node4", "node5", "node6"]

cluster.initial_master_nodes: ["node4"]

复制虚拟机node5、node6。同样修改配置。

#如果启动锁错误,就删除data目录:rm -rf /root/elasticsearch-7.9.1/data/

启动elasticsearch:

su - es

/root/elasticsearch-7.9.1/bin/elasticsearch -d

tail -f /root/elasticsearch-7.9.1/logs/psbc-es.log

安装es管理界面elasticsearch head。

在windows上解压es-head.rar

在chrome浏览器上安装,设置->扩展程序->加载已解压的扩展程序。点击地址栏右边插

件图标,选择elasticsearch head,再界面中输入http://192.168.0.204:9200/

    • skywalking oap集群安装

先安装oap。oap启动时会连接kafka并自动创建多个topic。

参考第二节的方法先启动zookeeper集群。查看端口2181

参考第三节启动kafka

参考第四节启动elasticsearch

配置方法参考官网:
https://skywalking.apache.org/docs/main/v8.6.0/en/setup/backend/backend-cluster/

cd /root

tar -xzf apache-skywalking-apm-es7-8.2.0.tar.gz

cd /root/apache-skywalking-apm-bin-es7/

vi config/application.yml

#配置zookeeper集群管理

cluster:

  selector: ${SW_CLUSTER:zookeeper}

hostPort: ${SW_CLUSTER_ZK_HOST_PORT:node1:2181}

#配置elasticsearch存储elasticsearch7

storage:

  selector: ${SW_STORAGE:elasticsearch7}

  elasticsearch:

    nameSpace: ${SW_NAMESPACE:""}

clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:node4:9200,node5:9200,node6:9200}

#配置kafka

selector: ${SW_KAFKA_FETCHER:default}

kafka-fetcher:

  selector: ${SW_KAFKA_FETCHER:default}

  default:

bootstrapServers: ${SW_KAFKA_FETCHER_SERVERS:node1:9092,node2:9092,node3:9092}

启动oap集群:

cd /root/apache-skywalking-apm-bin-es7/

bin/startup.sh

tail -f logs/skywalking-oap-server.log

初次启动会初始化elasticsearch、新建kafak主题

    • 应用安装,开发见《springboot dubbo应用开发》

首先配置skywalking java agent provider:

配置方法见:

Advanced Reporters | Apache SkyWalking

cd /root/apache-skywalking-apm-bin-es7/

cp -r agent agent-provider

vi agent-provider/config/agent.config

agent.service_name=${SW_AGENT_NAME:psbc_provider}

collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:node1:9092,node2:9020,node3:9020}

安装kafka插件:

mv optional-reporter-plugins/kafka-reporter-plugin-8.2.0.jar plugins/

同理配置skywalking java agent consumer。

Java agent 配置坑:启动应用后发现“追踪”视图里有VNode:表示有应用跨度丢失。Consumer启动应用时候,链接kafka后,get topic超时导致。

Get KAFKA topic:skywalking-managements error. java.util.concurrent.TimeoutException

可以修改配置文件:
plugin.kafka.get_topic_timeout=${SW_GET_TOPIC_TIMEOUT:20}

启动应用:

nohup java -javaagent:/root/skywalking-agent-provider/skywalking-agent.jar -jar /root/psbc-provider-1.0-SNAPSHOT.jar &

sleep 20

nohup java -javaagent:/root/skywalking-agent-consumer/skywalking-agent.jar -jar /root/psbc-consumer-1.0-SNAPSHOT.jar &

tail -f nohup.out

启动成功会和provider建立长连接:dubbo service com.psbc.api.IHelloService from url ubbo://node2:20880/

在node3上安装postgresql:

使用ab(Apache benchmark)

ab -n3000 -c30 http://node2:8085/hello

  • 后续工作
  1. 为了高度还原生产系统,需要和生产环境进行对比。首先确保逻辑结构一致。如各个部分的版本、配置文件参数、相互连接关系,也包括操作系统参数都要对齐(张明悦);其次要保持和生产环境数据结构一致。例如我们新核心产生的调用链路、调用耗时要精确模拟。最后找出无法实现的差异,做到心中有数。比如机器性能、容量以及我们没有的定制化软件。
  2. 对比生产系统的定制部分,例如数据计算加工、视图的定制,这就是我们要具备相关开发能力。从而实现工作目标:二次开发。
  3. 优化完善测试环境配置,解决拓扑图错误问题。
  4. 按照逻辑结构,对各个部分进行配置对比、压力测试,学习怎样观察系统运行状态;怎样对系统进行扩缩容量;模拟故障场景,并进行处理。

  • 快速启动方法

节点1,3:

cd /root/apache-zookeeper-3.6.3-bin

bin/zkServer.sh start

sleep 20

cd /root/kafka_2.12-2.8.1

nohup bin/kafka-server-start.sh config/server.properties &

tail -f nohup.out

节点2:

cd /root/apache-zookeeper-3.6.3-bin

bin/zkServer.sh start

sleep 20

cd /root/kafka_2.12-2.5.0

nohup bin/kafka-server-start.sh config/server.properties &

nohup java -javaagent:/root/skywalking-agent-provider/skywalking-agent.jar -jar /root/psbc-provider-1.0-SNAPSHOT.jar &

nohup java -javaagent:/root/skywalking-agent-consumer/skywalking-agent.jar -jar /root/psbc-consumer-1.0-SNAPSHOT.jar &

tail -f nohup.out

节点4,5,6:

su - es

/root/elasticsearch-7.9.1/bin/elasticsearch -d

#tail -f /root/elasticsearch-7.9.1/logs/psbc-es.log

exit

#等待es启动到黄色状态执行下面

cd /root/apache-skywalking-apm-bin/

bin/startup.sh

tail -f logs/skywalking-oap-server.log

  • 代码学习

  1. 下载解压8.7.0
  2. 学习protobuf
    1. 加入protobuf源码
    2. Protobuf是用来序列化通讯数据的。
    3. 使用方法是
  1. 编辑.proto文件类似这样:

syntax = "proto3";

option java_package = "com.test";

option java_outer_classname = "GpsDataProto";

message gps_data {

    int64 id = 1;

    string terminalId = 2;

    string dataTime = 3;

    double lon = 4;

    double lat = 5;

    float speed = 6;

    int32 altitude = 7;

    int32 locType = 8;

    int32 gpsStatus = 9;

    float direction = 10;

    int32 satellite = 11;

}

  1. 编译成java代码:

protoc -I=src/main/resource/proto --java_out=src/main/java gps_data.proto

  1. 代码中进行序列化和反序列化

GpsDataProto.gps_data gps_data = gps_builder.build();

gps_data.toByteArray()

GpsDataProto.gps_data.parseFrom(gps_data.toByteArray()

  1. 从agent开始,premaim开始

  1. Javaagent原理,静态启动,使用-javaagent参数在系统启动时候挂载。

源码概览介绍:Skywalking:源码阅览 - 简书

Java agent:Java Agent 调试,Java agent debug_汪小哥的博客-CSDN博客_javaagent调试

Java aop:https://www.jianshu.com/p/602f9f42891f

拦截函数入口,出口得到参数、返回值等,可以计算耗时

Skywalking java agent 启动流程:

  1. 先用启动命令行参数,初始化配置。
  2. 载入所有的插件,以及插件的配置。
  3. 构建java agent

Oap代码读解

预备知识:javaagent原理;aop面向切面编程,classloader,spi,opentracing,

java classloader:

bootstrapclassloader加载JAVA_HOME/lib/rt.jar中的类;extensionclassloader加载JAVA_HOME/lib/ext/*.jar;appclassloader加载classpath中的jar。Classloader是一个类隔离器,也是一个容器。一个classloader容器内的类是需要唯一的。而且可以从classloader可以从父类中共享类。

skywalking-segments topic 是处理segment的通道。segment是跨度(span)的集合。它包含一次请求中的所有跨度。Agent应该一次性报告一个请求的所有跨度。通常,在Java中,一个segment代表同一线程中一个请求的所有跟踪(跨度)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值