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

1.配置管理

1.1 为何使用配置管理

思考:

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

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

解决方案:

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

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

                                springcloud-config:基于git完成

                                apollo配置中心

1.2 如何使用配置文件

(1)引入依赖

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

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

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

配置内容为:

#跟nacos中自己 写的微服务名一致
#这个文件的优先级要高于application.properties,--引用配置中心的配置内容
#如果application.properties中有相同的内容,以bootstrap为主
#spring.application.name=springcloud-order

#指定nacos配置中心的地址
spring.cloud.nacos.config.server-addr=localhost:81
#指定nacos中心文件的后缀--默认为properties

spring.cloud.nacos.config.file-extension=properties

#必须指定引用那个配置内容
spring.cloud.nacos.config.name=springcloud-order

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

 重启并查看测试结果:

1.3 命名空间

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

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

bootstrap.properties配置文件

#跟nacos中自己 写的微服务名一致
#这个文件的优先级要高于application.properties,--引用配置中心的配置内容
#如果application.properties中有相同的内容,以bootstrap为主
#spring.application.name=springcloud-order

#指定nacos配置中心的地址
spring.cloud.nacos.config.server-addr=localhost:81
#指定nacos中心文件的后缀--默认为properties
spring.cloud.nacos.config.file-extension=properties

#必须指定引用那个配置内容
spring.cloud.nacos.config.name=springcloud-product

#指定命名空间的id
spring.cloud.nacos.config.namespace=88d738d7-3e40-4f9a-86da-92223e0a80e9

spring.cloud.nacos.config.extension-configs[0].data-id=database.properties
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true

spring.cloud.nacos.config.extension-configs[1].data-id=nacos.properties
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
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)引入依赖:

为了方便,放在父组件中

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

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

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


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

2.2 Zipkin的使用

(1)引入依赖;

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

<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

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

(3)使用

2.3 Sleuth+Zipkin持久化到数据库

(1)创建mysql数据库

#建表

CREATE TABLE IF NOT EXISTS zipkin_spans (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL,
  `id` BIGINT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `remote_service_name` VARCHAR(255),
  `parent_id` BIGINT,
  `debug` BIT(1),
  `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
  PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';

CREATE TABLE IF NOT EXISTS zipkin_annotations (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
  `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
  `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
  `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
  `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
  `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
  `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';

CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  `day` DATE NOT NULL,
  `parent` VARCHAR(255) NOT NULL,
  `child` VARCHAR(255) NOT NULL,
  `call_count` BIGINT,
  `error_count` BIGINT,
  PRIMARY KEY (`day`, `parent`, `child`)
) 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相应微服务启动处添加对应代码

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

3.2 skywalking的持久化

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

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

(3)自己创建数据库

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

                                                          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值