专栏首页云原生可观测性当 OpenResty/Nginx 遇上 Skywalking

当 OpenResty/Nginx 遇上 Skywalking

Skywalking 支持 HTTP 1.1 的 PR 折腾了我好久,E2E 端到端测试是真的把我搞“怕”了···

OpenResty 是什么?

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

因此,很多公司都会使用 OpenResty 开发出适合自己业务的高性能 web Server 模块。

那么它和 Skywalking 有什么关心呢?我们得先知道Skywalking是什么,Skywalking 是由Java 语言开发的一套APM系统,主要监控服务与服务之间的调用链路以及服务应用指标。官方的介绍是:分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。具体可以移步 Github: https://github.com/apache/skywalking

假设,当我们的使用Nginx/OpenResty 为我们的微服务做负载均衡的时候,怎样才能将整条链路通过请求串起来,以及怎样保证整个链路的拓扑图正确呢?目前的解决方案是在 Nginx 中支持链路信息的上报,同时能够将请求链路关键信息传递给上游应用。

Apache Skywalking Nginx Lua 项目

Githu项目地址:https://github.com/apache/skywalking-nginx-lua,该项目是吴晟采用 Lua 实现的 Nginx/OpenResty SDK。主要就是实现将 Nginx 作为一个节点注册至Skywalking,同时将链路 TraceId 传递给上游服务,并将链路上报给 Skywalking。

Skywalking 7.x 开始支持 HTTP 1.1

具体PR请参考: https://github.com/apache/skywalking/pull/4399

Skywalking 监控 Java、Golang、Node、.NET 语言的链路都是采用了 SDK 或者 Agent 的方式将数据上报到 Skyalking 后端。不过都是采用 gRPC 的方式和后端交互,Apache Nginx Lua 考虑到 Nginx 足以胜任 10K 以上并发连接响应,并没有采用 Nginx gRPC的方式,因此需要 Skywalking 支持 HTTP 1.1 的通信接口。

怎么玩起来?

这里先画一个怎么玩的逻辑图:

skywalking_nginx_lua

怎么搭建Skywalkng 的流程就不再赘述了,不是本文的重点,着重介绍怎么跑Skywalking Nginx Lua。 可以查看发布在哔哩哔哩上面的教程:https://www.bilibili.com/video/av35990012/

  • 首先安装 Openresty 参照官网:https://openresty.org/cn/download.html

Macos 系统采用 Homebrew 安装:

> brew install openresty/brew/openresty

==> Summary
?  /usr/local/Cellar/openresty/1.15.8.2: 303 files, 6.5MB, built in 1 minute
==> Caveats
==> openresty-openssl
openresty-openssl is keg-only, which means it was not symlinked into /usr/local,
because only for use with OpenResty.

If you need to have openresty-openssl first in your PATH run:
  echo 'export PATH="/usr/local/opt/openresty-openssl/bin:$PATH"' >> ~/.zshrc

For compilers to find openresty-openssl you may need to set:
  export LDFLAGS="-L/usr/local/opt/openresty-openssl/lib"
  export CPPFLAGS="-I/usr/local/opt/openresty-openssl/include"

==> openresty
To have launchd start openresty/brew/openresty now and restart at login:
  brew services start openresty/brew/openresty
Or, if you don't want/need a background service you can just run:
  openresty
  • 克隆或者下载 Apache Nginx Lua库
git clone https://github.com/apache/skywalking-nginx-lua.git
cd skywalking-nginx-lua/examples/

该目录存放了关于Nginx的样例配置,如下是部分内容:

  • nginx.conf:
http {
   # 这里指向刚刚克隆下来的 skywalking nginx lua项目
    lua_package_path "path/to/skywalking-nginx-lua/lib/skywalking/?.lua;;";
    # Buffer represents the register inform and the queue of the finished segment
    lua_shared_dict tracing_buffer 100m;
    
    init_worker_by_lua_block {
        local metadata_buffer = ngx.shared.tracing_buffer

        metadata_buffer:set('serviceName', 'User Service Name')
        -- Instance means the number of Nginx deloyment, does not mean the worker instances
        metadata_buffer:set('serviceInstanceName', 'User Service Instance Name')

        # 这里需要指定上报Skywalking 的后端地址。端口默认是12800
        require("client"):startBackendTimer("http://127.0.0.1:12800")
    }

    server {
        listen 8080;
        location /test {
            default_type text/html;

            rewrite_by_lua_block {
                require("tracer"):start("upstream service")
            }
            # 这里则是 上图中 nginx 上游服务的地址
            proxy_pass http://127.0.0.1:8080/upstream/test;
            body_filter_by_lua_block {
                if ngx.arg[2] then
                    require("tracer"):finish()
                end
            }
            log_by_lua_block {
                require("tracer"):prepareForReport()
            }
        }
    }
}
  • 直接启动 OpenResty 即可,并指定配置文件,例如:
openresty -c /Users/tanjian/gitprojects/skywalking-nginx-lua/examples/nginx.conf

本文分享自微信公众号 - 一万小时极客(coding-Hub),作者:JaredTan95

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Apache Skywalking 视频教程

    Apache Skywalking 原创视频教程,于2018年在哔哩哔哩平台发布。持续更新中。

    Jared.Tan
  • Nginx 代理gRPC—为 Skywalking 提供负载均衡

    Apache Skywalking 是一款优秀的分布式链路追踪系统以及 APM 系统,但在社区的实现中,并没有着重考虑客户端负载的问题。因为社区已经有很多对...

    Jared.Tan
  • 使用 Logstash 同步海量 MySQL 数据到 ES

      在生产业务常有将 MySQL 数据同步到 ES 的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的Logstas...

    Jared.Tan
  • 疫苗有效,先抛股票,今日官宣94.5%结果的Moderna高管早有信心

    根据CNN报道,辉瑞的疫苗必须在零下75℃左右保存,然而,不仅美国目前没有其他疫苗需要保持这种低温,普通医生的办公室和药房,也没有温度这么低的冷冻机。

    量子位
  • Tomcat 安全基线检查

    描述 tomcat-manger是Tomcat提供的web应用热部署功能,该功能具有较高权限,会直接控制Tomcat应用,应尽量避免使用此功能。如有特殊需求,...

    咻一咻
  • 高通降低蜂窝物联网连接的功耗

    尽管部分经济体停滞不前,但电子行业在频谱的两端(高性能和低功耗)不断突破边界。在功率频谱的低端,高通宣布了一种新的低功率调制解调器芯片,用于需要长电池寿命和/或...

    用户4122690
  • 「自然语言处理(NLP)」自然语言生成(NLG)论文速递(二)

    下面是作者整理的自然语言生成(NLG)论文速递系列的第二篇,该篇主要看点有:摘要生成、文本生成,标题生成,手写生成,机器翻译等,如果你对NLG感兴趣或者...

    ShuYini
  • zookeeper集群搭建

    最近公司用到了zookeeper做集群管理,这里按步骤记录一下其中的一些经验,也给后来的同学一些参考。由于这里只有一台服务器,因此搭建的其实是伪集群,多台服务器...

    三丰SanFeng
  • 【kafka】kafka学习笔记(一)

    我们先看一下维基百科是怎么说的: Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实时数据提供一...

    居士
  • vim 回顾

    下面是一篇旧文,大多是一些已有知识的整理,并不太成熟。欢迎关注专栏 space-vim , 有空我会以 Vim 自带的 help (不妨 :help help ...

    用户1558438

扫码关注云+社区

领取腾讯云代金券