首页 > 其他 > 详细

zipkin微服务调用链分析

时间:2019-12-20 17:53:23      阅读:100      评论:0      收藏:0      [点我收藏+]

一,概述

zipkin的作用

在微服务架构下,一个http请求从发出到响应,中间可能经过了N多服务的调用,或者N多逻辑操作,
如何监控某个服务,或者某个逻辑操作的执行情况,对分析耗时操作,性能瓶颈具有很大价值,
zipkin帮助我们实现了这一监控功能。

 

二、安装zipkin

环境说明

操作系统:centos 7.6

ip:192.168.31.232

配置:2核4g

python版本:3.5.2

 

启动zipkin

docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin

 

访问zipkin

http://192.168.31.232:9411

 

效果如下:

技术分享图片

 

 

三、python实现zipkin

使用py_zipkin模块来实现,这里以flask项目来测试。

安装模块

pip3 install  py_zipkin pymysql flask

 

创建项目

新建demo.py

mkdir -p /data/flask_demo/
cd /data/flask_demo/
vim demo.py

内容如下:

技术分享图片
import requests
from flask import Flask
from py_zipkin.zipkin import zipkin_span,create_http_headers_for_new_span
import time

app = Flask(__name__)

app.config.update({
    "ZIPKIN_HOST":"127.0.0.1",
    "ZIPKIN_PORT":"9411",
    "APP_PORT":5000,
    # any other app config-y things
})


def do_stuff():
    time.sleep(2)
    headers = create_http_headers_for_new_span()
    requests.get(http://localhost:6000/service1/, headers=headers)
    return OK


def http_transport(encoded_span):
    # encoding prefix explained in https://github.com/Yelp/py_zipkin#transport
    #body = b"\x0c\x00\x00\x00\x01"+encoded_span
    body=encoded_span
    zipkin_url="http://127.0.0.1:9411/api/v1/spans"
    #zipkin_url = "http://{host}:{port}/api/v1/spans".format(
     #   host=app.config["ZIPKIN_HOST"], port=app.config["ZIPKIN_PORT"])
    headers = {"Content-Type": "application/x-thrift"}

    # You‘d probably want to wrap this in a try/except in case POSTing fails
    r=requests.post(zipkin_url, data=body, headers=headers)
    print(type(encoded_span))
    print(encoded_span)
    print(body)
    print(r)
    print(r.content)


@app.route(/)
def index():
    with zipkin_span(
        service_name=webapp,
        span_name=index,
        transport_handler=http_transport,
        port=5000,
        sample_rate=100, #0.05, # Value between 0.0 and 100.0
    ):
        with zipkin_span(service_name=webapp, span_name=do_stuff):
            do_stuff()
        time.sleep(1)
    return OK, 200

if __name__==__main__:
    app.run(host="0.0.0.0",port=5000,debug=True)
View Code

 

新建server1.py

技术分享图片
from flask import request
import requests
from flask import Flask
from py_zipkin.zipkin import zipkin_span,ZipkinAttrs
import time
import pymysql

app = Flask(__name__)
app.config.update({
    "ZIPKIN_HOST":"127.0.0.1",
    "ZIPKIN_PORT":"9411",
    "APP_PORT":5000,
    # any other app config-y things
})


def do_stuff():
    time.sleep(2)
    with zipkin_span(service_name=service1, span_name=service1_db_search):
        db_search()
    return OK


def db_search():
    # 打开数据库连接
    db = pymysql.connect("127.0.0.1", "username", "psw", "db", charset=utf8)
    # 使用cursor()方法获取操作游标
    cursor = db.cursor()
    # 使用execute方法执行SQL语句
    cursor.execute("SELECT VERSION()")
    # 使用 fetchone() 方法获取一条数据
    data = cursor.fetchone()
    print("Database version : %s " % data)
    # 关闭数据库连接
    db.close()

def http_transport(encoded_span):
    # encoding prefix explained in https://github.com/Yelp/py_zipkin#transport
    #body = b"\x0c\x00\x00\x00\x01" + encoded_span
    body=encoded_span
    zipkin_url="http://127.0.0.1:9411/api/v1/spans"
    #zipkin_url = "http://{host}:{port}/api/v1/spans".format(
    #    host=app.config["ZIPKIN_HOST"], port=app.config["ZIPKIN_PORT"])
    headers = {"Content-Type": "application/x-thrift"}

    # You‘d probably want to wrap this in a try/except in case POSTing fails
    requests.post(zipkin_url, data=body, headers=headers)


@app.route(/service1/)
def index():
    with zipkin_span(
        service_name=service1,
        zipkin_attrs=ZipkinAttrs(
            trace_id=request.headers[X-B3-TraceID],
            span_id=request.headers[X-B3-SpanID],
            parent_span_id=request.headers[X-B3-ParentSpanID],
            flags=request.headers[X-B3-Flags],
            is_sampled=request.headers[X-B3-Sampled],
        ),
        span_name=index_service1,
        transport_handler=http_transport,
        port=6000,
        sample_rate=100, #0.05, # Value between 0.0 and 100.0
    ):
        with zipkin_span(service_name=service1, span_name=service1_do_stuff):
            do_stuff()
    return OK, 200

if __name__==__main__:
    app.run(host="0.0.0.0",port=6000,debug=True)
View Code

 

运行demo.py

python3 demo.py

 

运行server1.py

python3 server1.py

 

访问5000端口

技术分享图片

四、查看调用链

点击查证,点击下面的结果

技术分享图片

 

 效果如下:

技术分享图片

 

可以看到,有webapp和services两个service,5个span标签,可以清楚看到service和service,service和span,span和span之间的关系,和各span耗时情况。

 

点击依赖,效果如下:

技术分享图片

 

点击webapp,效果如下:

 技术分享图片

 

 

 

 

本文参考链接:

https://www.cnblogs.com/shijingjing07/p/9340131.html

zipkin微服务调用链分析

原文:https://www.cnblogs.com/xiao987334176/p/12074335.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!