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后查看数据库