• .Net Core with 微服务


    上一次我们介绍了Seq日志聚合组件。这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件。APM 监控围绕对应用、服务、容器的健康监控,对接口的调用链、性能进行监控。在我们实施微服务后,由于复杂的业务逻辑,服务之间的调用会像蜘蛛网一样复杂。有了调用链监控后服务之间的调用可以用图像的方式展示出来,每个请求的性能,响应等都会记录下来。对于提前防范问题,以及排查问题有非常大的意义。

    Elastic APM

    大家对 ELK 套件一定非常熟悉。ELastic APM 同样也是 Elastic 系列产品的一个组件。Elastic APM 是一款免费开源的应用程序性能监控组件。它底层依赖 Elasticsearch 来存储跟查询数据,使用 Kibana 来展示分析数据。它支持多种程序语音的探针,包括 JAVA,.NET, Nodejs 等语音。对于 .NET 的集成非常方便,只要简单的配置就可以采集 .NET 程序的信息,对代码几乎是零入侵。

    Elastic APM 的架构由4个部分组成。

    1. Elasticsearch 负责数据的持久化,查询等能力
    2. Kibana APM数据的分析展示界面
    3. APM Agent 每个服务集成对应的 sdk 后就是一个个 agent,负责采集程序的各种指标数据
    4. APM Server ,agent 采集到数据后会上报给 APM Server ,由APM Server汇集数据后存储到 Elasticsearch 。

    使用 docker-compose 安装

    elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
        restart: always
        container_name: elasticsearch
        hostname: elasticsearch
        environment:
          - discovery.type=single-node
        ports:
          - 9200:9200
          - 9300:9300
      kibana:
        image: docker.elastic.co/kibana/kibana:7.13.2
        restart: always
        container_name: kibana
        hostname: kibana
        environment:
          - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
        ports:
          - 5601:5601
        depends_on:
          - elasticsearch
      apm_server:
        image: docker.elastic.co/apm/apm-server:7.13.2
        restart: always
        container_name: apm_server
        hostname: apm_server
        command: --strict.perms=false -e
        environment:
          - output.elasticsearch.hosts=["elasticsearch:9200"]
        ports:
          - 8200:8200
        depends_on:
          - kibana
          - elasticsearch
    

    使用 docker-compose 来安装 Elastic APM 。Elastic APM 依赖 elasticsearch kibana,所以 docker-compose 文件需要定义3个service。其中 apm_server 定义depends_on: kibana,elasticsearch 。

    访问 http://localhost:5601 出现 kabina 界面。点击"Add Data" 出现添加 Apm Server 指引。

    滚动到最后,点击 "Check APM Server Status "。

    如果出现 “You have correctly setup APM Server” 的提示,说明我们的APM Server安装成功了。

    在 ASP.NET Core 集成 Elastic APM

    Install-Package Elastic.Apm.NetCoreAll
    

    使用 nuget 来安装 Elastic APM 的sdk包。在 nuget 上搜索 Elastic apm 会出现多个包,这里选择 Elastic.Apm.NetCoreAll 包。

      "ElasticApm": {
        "ServerUrls": "http://192.168.18.164:8200", //Set custom APM Server URL 
        "ServiceName": "ordering_service", //allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application
        "Environment": "dev" // Set the service environment
      }
    

    在 appsettings.json 文件内添加一个 ElasticApm 节点。

    • ServerUrls:apm server 地址
    • ServiceName: 服务的名称
    • Environment:环境
         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                app.UseAllElasticApm(Configuration);
    
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
            }
    

    在 startup 类的 Configure 方法的顶部注入 ElasticApm 的中间件。这样 Elastic APM 就跟 asp.net core 集成好了,整个过程还是很方便的。

    查看 Kibana UI

    我们把几个示例项目集成后之后运行起来,随便访问几个http接口。

    打开 kibana 界面,点击菜单 “APM” 。

    可以看到我们3个服务已经出现在服务列表里面。列表上显示了环境,TPM等信息。

    点击 “Traces” 标签,这里就会列出刚才所有的请求列表。

    随便点击一个服务,会出现这个服务的详细信息,显示了并发情况,延迟情况,已经请求的历史。

    查看调用链

    在微服务架构下,服务之间的调用是非常复杂的。这给我们排错的时候带来非常大的压力。现在有了 APM 可以帮我们改进这个问题。Elastic APM 可以帮我们显示每个请求的调用链情况。

    以我们订单服务的获取订单详情接口为例。我们找到/order/OD001 这个请求,点击展示它的明细信息。可以看到这个请求里面包含了另外两次调用。第一次是访问Consul获取会员服务的地址,第二次是访问会员服务获取会员明细信息。点击每一次请求,里面都有详细的元数据。这为我们调试,排错,监控带来了非常大的便利。

    Metrics 指标


    这个页面展示了服务的硬件指标,主要是显示了CPU,内存利用率。

    总结

    我们通过以上内容,介绍了什么是Elastic APM ,如何安装Elastic APM,如何在 ASP.NET Core 程序里集成 Elastic APM 的 sdk ,以及简单介绍了 Kibana 上的展示信息,特别是服务调用链的内容。可以看到Elastic APM 还是非常不错的一款 APM 组件,特别是对 ASP.NET Core 的集成做到了几乎零代码入侵,界面也非常友好。

    演示项目地址

    https://github.com/kklldog/myhotel_microservice

    相关文章

    NET Core with 微服务 - 什么是微服务
    .Net Core with 微服务 - 架构图
    .Net Core with 微服务 - Ocelot 网关
    .Net Core with 微服务 - Consul 注册中心
    .Net Core with 微服务 - Seq 日志聚合

    关注我的公众号一起玩转技术

    QQ群:1022985150 一起探讨学习.NET技术
    作者:Agile.Zhou(kklldog)
    出处:http://www.cnblogs.com/kklldog/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    事件处理
    模板语法
    计算属性和侦听器
    Class 与 Style绑定
    Springboot使用redis
    修改docker-toolbox/boot2docker容器镜像
    docker容器如何安装vim
    Maven+Docker,发布到Registry
    Maven + Docker
    Jenkins-SVN + Maven + Docker
  • 原文地址:https://www.cnblogs.com/kklldog/p/netcore-with-microservices-06.html
Copyright © 2020-2023  润新知