前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务框架saf-4:saf-dubbo之度量

微服务框架saf-4:saf-dubbo之度量

作者头像
千里行走
发布2022-04-28 16:06:09
3640
发布2022-04-28 16:06:09
举报
文章被收录于专栏:千里行走

目录

(1).关于saf

(2).前置准备

(3).saf-dubbo之度量原理

(4).开启访问流量

(5).度量体验

1.Incoming Dubbo Dashboard

2.outcoming Dubbo Dashboard

3.其他

(6).相关文章

(1).关于saf

项目地址:

https://github.com/saf-group

1.一个微服务框架,完全基于注解的方式开发。

2.适用于云原生(K8S)下的微服务体系搭建,为技术中台提供底层支撑。

3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。

(2).前置准备

需要完成一个saf-dubbo-demo的容器化部署,要准备很多准备,详情参见:

微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署

参考下述文章,完成prometheus-saf的部署,这样可以抓取demo的metrics:

grafana&prometheus生产级容器化监控-1:生产级容器化

(3).saf-dubbo之度量原理

使用DubboFilter去拦截每个请求,进行度量,拓扑机制如下:

通过springboot的加载机制初始化公用Config;

通过dubbo的Filter加载机制初始化Filter;

自定义注解@EnableSafDubbo,通过SafDubboBeanValueBindingPostProcessor将apollo上的自定义配置绑定到对应的config,这样实现了本地0配置化;

在Filter中拦截每次请求,注入度量代码,有两个Filter是因为provdier是流量入,consumer是流量出,要分别度量。

SafDubboConsumerFilter的核心代码举例:

代码语言:javascript
复制
private static final PrometheusMetricProfilerProcessor PROFILE_DUBBO_OUT = new PrometheusMetricProfilerProcessor(
"dubbo_requests_out", "dubbo:out", "dubbo_requests_out", new String[] { "class", "method" });
 
private static final Gauge PROFILE_DUBBO_FTL_OUT = Gauge.build().name("dubbo_requests_out_ftl")
.help("dubbo_requests_out_ftl").labelNames("class", "method").register();
 
private static final Set<String> FTL_OUT_MARKED_SET = Sets.newConcurrentHashSet();
 
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
 
// 可以开关控制是否开启monitor
if (!MonitorConfig.ENABLE_MONITOR_DUBBO) {
return invoker.invoke(invocation);
}
 
// motanRPC class
String clazz = SafDubboUtil.getShortName(invoker.getInterface().getName());
 
// motanRPC method
String method = clazz + "." + invocation.getMethodName();
 
// invalid and return at once.
if (StringUtils.isEmpty(method) || StringUtils.isEmpty(clazz)) {
return invoker.invoke(invocation);
}
 
long begin = System.nanoTime();
boolean specialException = true;
boolean isError = false;
// 判断是否是第一次访问
final boolean firstAccessFlag = beforeCall(clazz, method);
 
Result result = null;
 
try {
result = invoker.invoke(invocation);
if (result == null) {
isError = true;
} else {
if (result.getException() != null) {
isError = true;
}
}
specialException = false;
return result;
} catch (Exception e) {
// 这里有可能跑出RuntimeException,这里不能吞异常
// TODO 后续要对Exception分类
log.error(e.getMessage(), e);
isError = true;
return null;
} finally {
if (specialException) {
isError = true;
}
afterCall(clazz, method, begin, isError, firstAccessFlag);
}
}

(4).开启访问流量

启动访问脚本,给demo服务一定压力好观测数据。

代码语言:javascript
复制
#!/bin/bash

for((i=1;i<=100000000;i++));  
do
    curl http://saf-sample-dubbo-apollo-web-prod/shop/getShop?shopId=1
done

(5).度量体验

dubbo度量目前只有2个dashboard,还可拓展出p99同比等。

dashboard

用途

Incoming Dubbo

度量dubbo provider,如qps, lantency, p99等。

Outcoming Dubbo

度量dubbo consumer,如qps, lantency, p99等。

1.Incoming Dubbo Dashboard

注意上图,大家很容易有一个疑惑,就是并发为什么非0即1,是不是有问题。实际上没有问题,因为访问脚本是单线程的,所以并发不可能超过1,大多数时间为0是因为30秒抓取一次,不一定能抓到的。

2.outcoming Dubbo Dashboard

3.其他

根据现有metrics,还可以定制出p99同比等dashboard。

另外,还有非常关键的APM度量,这个以后有时间另开文章陈述:

(6).相关文章

微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署

grafana&prometheus生产级容器化监控-1:生产级容器化

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千里行走 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档