ads:

关注以下公众号查看更多文章

    我们的项目包含基于yaf框架的test_api和test_client1微服务,相互之间通过hprose做微服务调用,需要找出接口耗时点。这次使用zipkin 链路跟踪工具,找出时间都消耗在哪了。先看一下效果图

 从图中看出,有大概15ms被hprose消耗了

安装zipkin

docker

docker 运行 zipkin 命令如下,k8s自行翻译

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

php 

php安装zipkin的composer包 openzipkin/zipkin

composer require openzipkin/zipkin

统计接口总耗时

在api项目的index.php文件开始和结束处添加代码,统计接口总耗时

开始处打点

$endpoint = Endpoint::create(getenv("APP_NAME"));

$reporter = new Http(['endpoint_url' => getenv("APP_ROUTE_TRACE")]);
$sampler = BinarySampler::createAsAlwaysSample();
$tracing = TracingBuilder::create()
  ->havingLocalEndpoint($endpoint)
  ->havingSampler($sampler)
  ->havingReporter($reporter)
  ->build();
$this->setTracer($tracing);
$this->setSpan($this->getTracer()->getTracer()->newTrace());
$this->getSpan()->setName($_SERVER['REQUEST_URI']);
$this->getSpan()->start();

主要是新建了一个 tracer跟踪整个请求和一个root span 跟踪单个服务的请求,

endpoint设置名称为微服务名称 test_api

reporter设置上报地址为zipkin的地址,目前是 http://zipkin:9411/api/v2/spans

span名称为接口请求路径 $_SERVER['REQUEST_URI']

最后是开始span

结束处打点

(self::$instance)->getSpan()->finish();
(self::$instance)->getTracer()->getTracer()->flush();

主要是把span结束掉 trace 刷新出来

微服务调用客户端实现

微服务客户端统计rpc调用时长

rpc开始处

$span = (self::$instance)->getTracer()->getTracer()->newChild((self::$instance)->getSpan()->getContext());
$span->setName($service_name . "_" . $client_url);
$span->setKind(Zipkin\Kind\CLIENT);
$span->setRemoteEndpoint(Endpoint::create($service_name));
$span->start();

$injector = (self::$instance)->getTracer()->getPropagation()->getInjector(new \Zipkin\Propagation\Map());
$origin_header_arr = [];
$injector($span->getContext(), $origin_header_arr);

foreach ($origin_header_arr as $origin_header_key => $origin_header_value){
   $client->setHeader($origin_header_key, $origin_header_value);
}

从root span创建了一个child span跟踪微服务调用,名称为 微服务名+调用地址

在rpc请求的header中加入 zipkin 的跟踪上下文信息

rpc结尾处

$span->finish();

微服务调用服务端实现

rpc server开始处

$endpoint = Endpoint::create(getenv("APP_NAME"));

$reporter = new Http(['endpoint_url' => getenv("APP_ROUTE_TRACE")]);
$sampler = BinarySampler::createAsAlwaysSample();
$tracing = TracingBuilder::create()
  ->havingLocalEndpoint($endpoint)
  ->havingSampler($sampler)
  ->havingReporter($reporter)
  ->build();
$this->setTracer($tracing);

$extractor = $this->getTracer()->getPropagation()->getExtractor(new ServerHeaders);
$extracted = $extractor($_SERVER);
$this->setSpan($this->getTracer()->getTracer()->newChild($extracted));
$this->getSpan()->setName(curPageURL());
$this->getSpan()->setKind(Zipkin\Kind\SERVER);
$this->getSpan()->start();

从$_SERVER中拿到zipkin提交的trace信息,并以此创建一个child span

span名称为接口地址

rpc server 结尾处

(self::$instance)->getSpan()->finish();
(self::$instance)->getTracer()->getTracer()->flush();

主要是把span结束掉 trace 刷新出来

 相关链接

手把手教你部署nginx+php

php和nginx镜像合并 && 代码打包到镜像

nginx-php镜像安装常用软件

yaf && yar微服务/hprose微服务 镜像初始化

常用开发工具:php_codesniffer代码规范检查&修复、phpstan语法检查、phpunit单元测试

.gitlab-ci.yaml自动镜像打包&&互联网企业规范化上线流程(上)

kustomize/kubectl自动镜像部署&&互联网企业规范化上线流程(下)

apisix网关、JMeter压测  

prometheus/grafana监控数据收集与展示

k8s容器网络性能调优

supervisor进程管理

安装opcache和apcu

APM性能监测工具skywalking

链路跟踪工具zipkin

phpfpm和nginx配置

php整合apollo配置中心

php rdkafka操作kafka消息队列

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐