• 微服务(SpringCloud)之配置管理及链路追踪


    1.配置管理

    1.1 为何使用配置管理

    思考:

    (1)商品微服务搭建一个集群,如果配置文件的内容发生改变,所带来的问题就是每一台商品微服务都要进行改变。

    (2)商品微服务和订单微服务这些微服务可能会存在相同的配置,如果这些相同的配置发生改变,需要对每一个微服务都要修改。

    解决方案:

    提供一个对微服务配置文件进行统一管理的组件。

            这种组件分为:nacos可以作为配置中心

                                    springcloud-config:基于git完成

                                    apollo配置中心

    1.2 如何使用配置文件

    (1)引入依赖


                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-config
     

    (2)在配置中心创建一个配置文件

    (2)在每个微服务客户端引用配置中心的配置文件

    配置内容为:

    1. #跟nacos中自己 写的微服务名一致
    2. #这个文件的优先级要高于application.properties,--引用配置中心的配置内容
    3. #如果application.properties中有相同的内容,以bootstrap为主
    4. #spring.application.name=springcloud-order
    5. #指定nacos配置中心的地址
    6. spring.cloud.nacos.config.server-addr=localhost:81
    7. #指定nacos中心文件的后缀--默认为properties
    8. spring.cloud.nacos.config.file-extension=properties
    9. #必须指定引用那个配置内容
    10. spring.cloud.nacos.config.name=springcloud-order

    举例:在对应配置文件中填写一个名字

     重启并查看测试结果:

    1.3 命名空间

    开发会有不同的环境---不同的环境配置作用会不同

    为防止有多个配置文件都链接相同的datasource 如果数据源发生改变--需要对多个配置文件进行修改,因此使用子配置文件。

    bootstrap.properties配置文件

    1. #跟nacos中自己 写的微服务名一致
    2. #这个文件的优先级要高于application.properties,--引用配置中心的配置内容
    3. #如果application.properties中有相同的内容,以bootstrap为主
    4. #spring.application.name=springcloud-order
    5. #指定nacos配置中心的地址
    6. spring.cloud.nacos.config.server-addr=localhost:81
    7. #指定nacos中心文件的后缀--默认为properties
    8. spring.cloud.nacos.config.file-extension=properties
    9. #必须指定引用那个配置内容
    10. spring.cloud.nacos.config.name=springcloud-product
    11. #指定命名空间的id
    12. spring.cloud.nacos.config.namespace=88d738d7-3e40-4f9a-86da-92223e0a80e9
    13. spring.cloud.nacos.config.extension-configs[0].data-id=database.properties
    14. spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
    15. spring.cloud.nacos.config.extension-configs[0].refresh=true
    16. spring.cloud.nacos.config.extension-configs[1].data-id=nacos.properties
    17. spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
    18. spring.cloud.nacos.config.extension-configs[1].refresh=true

     测试结果:

    2.链路追踪之sleuth与zipkin

            在大型系统的微服务化构建中,一个系统被拆分成了许多微服务。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问题:

    (1)如何快速发现问题?

    (2)如何判断故障影响范围?

    (3)如何梳理服务依赖以及依赖的合理性?

    (4)如何分析链路性能问题以及实时容量规划?

            分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上IP、每个服务节点的请求状态200  500等等。

    常见的链路追踪技术有下面这些:
            cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成成本较高。风险较大。
            zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现《图形化》。该产品结合spring-cloud-sleuth 使用较为简单, 集成很方便, 但是功能较简单。
    pinpoint Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点
    是支持多种插件,UI功能强大,接入端无代码侵入。
            skywalking 【未来企业会使用的多】
            SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
            Sleuth  (日志记录每一条链路上的所有节点,以及这些节点所在的机器,和耗时。)log4j
    SpringCloud 提供的分布式系统中链路追踪解决方案。

            注意:
            Sleuth---为每一个微服务生成日志

            Zipkin---对每一个微服务上的日志进行搜集并以图像化展示

            ---有侵入【修改xml配置文件,配置文件】

    Springcloud 并不是自己技术---而是把所有框架整合在一起 来解决微服务上的问题。

    2.1 Sleuth使用

    (1)引入依赖:

    为了方便,放在父组件中


        org.springframework.cloud
        spring-cloud-starter-sleuth

    (2)启动微服务,调用之后,我们可以在控制台观察到sleuth的日志输出

            依次调用有一个全局的TraceId,将调用链路串起来。仔细分析每个微服务的日志,不难看出请求的具体过程。


            查看日志文件并不是一个很好的方法,当微服务越来越多日志文件也会越来越多,通过Zipkin可以将日志聚合,并进行可视化展示和全文检索。  

    2.2 Zipkin的使用

    (1)引入依赖;

    为使用方便在父组件中引用


                    org.springframework.cloud
                    spring-cloud-starter-zipkin

    (2)下载对应的jar包并开启

    (3)使用

    2.3 Sleuth+Zipkin持久化到数据库

    (1)创建mysql数据库

    1. #建表
    2. CREATE TABLE IF NOT EXISTS zipkin_spans (
    3. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
    4. `trace_id` BIGINT NOT NULL,
    5. `id` BIGINT NOT NULL,
    6. `name` VARCHAR(255) NOT NULL,
    7. `remote_service_name` VARCHAR(255),
    8. `parent_id` BIGINT,
    9. `debug` BIT(1),
    10. `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
    11. `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
    12. PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
    13. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
    14. ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
    15. ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
    16. ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
    17. ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
    18. CREATE TABLE IF NOT EXISTS zipkin_annotations (
    19. `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
    20. `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
    21. `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
    22. `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
    23. `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
    24. `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
    25. `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
    26. `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
    27. `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
    28. `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
    29. `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
    30. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
    31. ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
    32. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
    33. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
    34. ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
    35. ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
    36. ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
    37. ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
    38. CREATE TABLE IF NOT EXISTS zipkin_dependencies (
    39. `day` DATE NOT NULL,
    40. `parent` VARCHAR(255) NOT NULL,
    41. `child` VARCHAR(255) NOT NULL,
    42. `call_count` BIGINT,
    43. `error_count` BIGINT,
    44. PRIMARY KEY (`day`, `parent`, `child`)
    45. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

    (2) 在启动ZipKin Server的时候指定数据保存的mysql的信息

            注意要是ZipKin 版本过低而数据库过高时,会出现本主机中断了一个连接的错误,只要提升版本就可以解决。现在所使用的数据库版本是8.0。

    java -jar zipkin-server-2.21.0-exec.jar --STORAGE_TYPE=mysql

    --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root

    --MYSQL_PASS=root

    3.链路追踪之SkyWalking

            SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。

            skywalking:链路追踪--无侵入,而且搜索和展示链路信息

    3.1 修改对应文件

    (1)默认skywalking不支持gateway服务,需要在agent/options-plugins下的gateway的jar复制到/agent/plugins

     (2)启动skywalking

    如果开启服务不是两个窗口或一个窗口闪退,点击下方提示处,查看错误原因

     在进行重启时,启动日志可能会在后台运行,使用cmd查看进程,并杀死进程

    (4)查看结果

     (3)在idea相应微服务启动处添加对应代码

    1. -javaagent:D:/soft/apache-skywalking-apm-8.5.0/apache-skywalking-apm-bin/agent/skywalking-agent.jar
    2. -Dskywalking.agent.service_name=springcloud-gateway
    3. -Dskywalking.collector.backend_service=localhost:11800

    3.2 skywalking的持久化

    (1)skywalking如果服务重新启动,链路日志消失了。因为默认是在内存中保存,持久化存储到msql,es存储引擎。

    (2)把mysql的驱动放入到skywalking中

    (3)自己创建数据库

    (4)重启skywalking后查看数据库

                                                              

  • 相关阅读:
    VUE项目build后自动生成zip压缩包
    golang 反射机制
    基于卡尔曼滤波进行四旋翼动力学建模(Simulink&Matlab)
    jmeter如何进行一个简单的测试(超级详细,有图有文字,闭着眼都能成功)
    办理的流量卡怎么判断是否激活成功?看实名认证还是看充值?
    opencv:从0到实现人脸识别
    RPC 基础系列
    TorchServe搭建codeBERT分类模型服务
    【Zabbix监控一】zabbix的原理与安装
    TensorFlow识别4种简单人眼神态(Vgg16)
  • 原文地址:https://blog.csdn.net/qq_50896786/article/details/126472282