内网场景 Dubbo 微服务接入观测云¶
作者: 刘玉杰
简介¶
有的项目,用户群体是公司内部人员,或者集团公司人员。为了安全,这些项目部署在自建机房,员工通过内网或者 VPN 访问。针对这种场景,观测云提供了离线部署方案,即通过一台可以连外网的主机上部署 DataKit,开启 Proxy 采集器,内网的主机通过这台代理安装 DataKit,所有数据也是通过这台部署的 DataKit 上报到观测云。
下面使用微服务架构的项目来介绍如何接入观测云,项目是前后端分离的项目,前端使用 Vue 开发的,后端微服务使用 Spring Boot 结合 Dubbo 开发的,前端通过 Gateway 访问后端的服务。用户通过浏览器访问前端网站,用户点击界面上的按钮触发后端接口请求,请求被 Gateway 转发到 Consumer 微服务,Consumer 微服务处理请求过程中会调用 Provider 微服务,并记录日志,处理完成后把结果返回给浏览器,至此完成一次调用。
部署规划¶
示例的整个项目有四个服务,分别部署在四台主机上,另外需要一台能连外网的主机,这台主机也与其它四台主机在同一内网。
- 首先,在有外网的主机上部署 DataKit,开通 Proxy 采集器;
- 其次,其它四台主机通过这台代理安装 DataKit;
- 然后,在安装了 Nginx 的 Web 服务器上部署 Web 项目,这台 Web 主机的 9529 端口可以被内网的其它主机访问;
- 最后,部署 Gateway、Consumer、Provider 微服务,并开通 SkyWalking 采集器。
示例使用的服务可以在 https://github.com/stevenliu2020/vue3-dubbo 下载,里面包含 provider.jar
、consumer.jar
、gateway.jar
和 dist
目录,dist 即是 vue 项目。
下面是项目与主机的对应关系及整体部署架构图。
- 项目与主机的对应关系
IP | 部署项目 | 描述 |
---|---|---|
172.16.0.245 | DataKit (Proxy) | 可连外网 |
172.16.0.29 | Web/DataKit | 内网,Web 服务器(Nginx) |
172.16.0.51 | Gateway/DataKit | 内网,部署网关服务 |
172.16.0.52 | Consumer/DataKit | 内网,部署消费者服务 |
172.16.0.53 | Provider/DataKit | 内网,部署生产者服务 |
- 整体部署架构图
前置条件¶
- Centos 7.9
- 安装 Nginx
- 安装 JDK
- 安装 Zookeeper
- 观测云账号
环境版本¶
Warning
本次示例使用版本如下:DataKit 1.4.9
、Nginx 1.22.0
、Spring Cloud 3.1.1
、Spring Boot 2.6.6
、Dubbo 2.7.15
、Zookeeper 3.7.1
、Vue 3.2
、 JDK 1.8
操作步骤¶
1 部署 DataKit¶
1.1 在线部署 DataKit¶
登录「观测云」,进入「集成」模块,点击 「DataKit」 - 「Linux」,复制安装命令,在 172.16.0.245 主机上执行。注意安装命令中包含了 token,后续操作中会使用到这个 token。
安装完成后,执行如下命令开通 Proxy 采集器。
编辑 /usr/local/datakit/conf.d/datakit.conf
文件,修改 http_api
的 listen 的值是 0.0.0.0:9529
,确保其它主机可以正常访问这台主机的 9529 端口。
重启 DataKit。
1.2 通过代理部署 DataKit¶
登录 172.16.0.29
主机,执行如下命令安装 DataKit。
这里 172.16.0.245
即是上步中安装的 DataKit 的主机 IP,此步骤即是通过 DataKit 代理来安装的,命令中使用到的 token 与上面提到的 token 相同。
export HTTPS_PROXY=http://172.16.0.245:9530; DK_DATAWAY=https://openway.guance.com?token=tkn_9a1111123412341234123412341113bb bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"
执行如下命令,测试是否能上报数据到观测云。
curl -x http://172.16.0.245:9530 -v -X POST https://openway.guance.com/v1/write/metrics?token=tkn_9a1111123412341234123412341113bb -d "proxy_test,name=test c=123i"
返回 200 表示数据上报成功。
使用同样的步骤在 172.16.0.51
、172.16.0.52
、172.16.0.53
主机上部署 DataKit,至此四台主机部署 DataKit 完成。
2 APM 接入¶
2.1 开启 SkyWaking 采集器¶
登录 172.16.0.51
主机,复制 sample 文件,开通 skywalking 采集器。
重启 DataKit。
使用同样的操作,开通 172.16.0.52
、172.16.0.53
主机上部署的 DataKit 的 SkyWaking 采集器。
2.2 上传 SkyWalking 探针¶
市面上 APM 工具比较多,由于微服务使用的是 dubbo 框架,这里推荐使用 SkyWalking。
下载 apache-skywalking-java-agent-8.11.0,解压后把文件命名为 agent,上传到 172.16.0.51、172.16.0.52、172.16.0.53 主机的 /usr/local/df-demo/
目录。
注意: 172.16.0.51 这台主机部署的是 gateway,需要把
agent\optional-plugins
目录下的apm-spring-cloud-gateway-3.x-plugin-8.11.0.jar
和apm-spring-webflux-5.x-plugin-8.11.0.jar
包 复制到agent\plugins
目录下。
2.3 部署 provider 微服务¶
上传 provider.jar
到 172.16.0.53 主机的 /usr/local/df-demo/
目录,确保 provider.jar
与 agent 文件夹相同目录。启动 provider 服务。
cd /usr/local/df-demo/
java -javaagent:agent/skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-provider -Dskywalking.collector.backend_service=localhost:11800 -jar provider.jar
2.4 部署 consumer 微服务¶
上传 consumer.jar
到 172.16.0.52 主机的 /usr/local/df-demo/
目录。启动 consumer 服务。
cd /usr/local/df-demo/
java -javaagent:agent/skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-consumer -Dskywalking.collector.backend_service=localhost:11800 -jar consumer.jar
2.5 部署 gateway 微服务¶
上传 gateway.jar
到 172.16.0.51 主机的 /usr/local/df-demo/
目录。启动 gateway 服务。
cd /usr/local/df-demo/
java -javaagent:agent/skywalking-agent.jar -Dskywalking.agent.service_name=dubbo-gateway -Dskywalking.collector.backend_service=localhost:11800 -jar gateway.jar
3 RUM 接入¶
上传 dist
目录 到 172.16.0.29 主机的 /usr/local/df-demo/
目录,前端连接后端接口的 url 是在 dist\js\app.ec288764.js
文件内,这里后端 gateway 的 url 是 http://172.16.0.51:9000/api。
登录「观测云」,进入「用户访问监测」模块,新建 dubbo-web 应用,复制下面命令。
修改 /etc/nginx/nginx.conf
文件,增加如下内容:
server {
listen 80;
#add_header Access-Control-Allow-Origin '*';
#add_header Access-Control-Allow-Headers Origin,X-Requested-Width,Content-Type,Accept;
location / {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root /usr/local/df-demo/dist;
index index.html index.htm;
}
#location /nginx_status{
# stub_status on;
#}
}
重新加载配置。
浏览器访问 http://172.16.0.29/ ,即可访问前端界面,点击界面按钮会调用后端接口。
登录「观测云」,进入「用户访问监测」 - 「dubbo-web」,这里有许多功能可以用来对前端应用做性能分析。
4 日志接入¶
使用 SkyWalking 的 apm-toolkit-log4j-2.x
包,可以把 SkyWalking 生成的 traceId 通过 log4j2 输出到日志中。
DataKit 的 pipeline 可以提取日志中的 traceId 与链路关联。
4.1 添加依赖¶
在 provider 微服务的日志中输出 traceId,需要在 provider 的 pom.xml
文件中添加依赖,版本与 javaagent 使用的版本相同,这里是 8.11.0。
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-log4j-2.x</artifactId>
<version>8.11.0</version>
</dependency>
4.2 开通日志采集器¶
登录 Provider 服务部署的服务器 172.16.0.53,复制 sample 文件。
编辑 logging.conf
文件,source 输入 log-dubbo-provider
,这个名称在日志查询或者配置 pipeline 需要用到。logfiles 填待收集 log 文件路径。
重启 DataKit。
4.3 pipeline¶
登录「观测云」,进入「日志」 - 「Pipelines」。
点击「新建 Pipeline」,过滤选择开通日志采集器定义的 source 即 log-dubbo-provider
。
定义解析规则输入如下内容,最后点击「保存」。
# 2022-08-03 10:55:50.818 [DubboServerHandler-172.16.0.29:20880-thread-2] INFO dubbo.service.StockAPIService - [decreaseStorage,21] - [TID: 1bc41dfa-3c2c-4917-9da7-0f48b4bcf4b7] - 用户ID:-4972683369271453960 ,发起流程审批:-1133938638
grok(_, "%{TIMESTAMP_ISO8601:time} %{NOTSPACE:thread_name} %{LOGLEVEL:status}%{SPACE}%{NOTSPACE:class_name} - \\[%{NOTSPACE:method_name},%{NUMBER:line}\\] - \\[TID: %{DATA:trace_id}\\] - %{GREEDYDATA:msg}")
default_time(time)
使用前端触发 provider 服务的调用,这样 provider 生成的日志即被 DataKit 采集后上报到观测云。
登录「观测云」,进入「日志」模块的查看器,数据来源找到 log-dubbo-provider
,点击一条日志进去,可看到 traceId 已做为 tag,后面在 APM 中通过这个 traceId 即可关联到日志,帮助我们快速定位问题 。
5 联动分析¶
通过上面的步骤,已经完成了 Rum、Apm 和日志的联动。
登录「 观测云」 - 「用户访问监测」,点击 「dubbo-web」进入后点击「查看器」,选择「view」,查看页面调用情况。
然后点击「route_change」进入,在 Fetch/XHR 标签可以查看到前端触发的接口调用情况,点击一条进入后,可查看火焰图、span 列表、服务调用关系,及关联的 provider 服务的日志。