1 服务配置中心介绍
首先我们来看一下,微服务架构下关于配置文件的一些问题:
1. 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
2. 配置文件无法区分环境--开发环境 测试环境 线上环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环
境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动
维护,这比较困难。
3. 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要配置中心的加入来解决这些问题。
配置中心的思路是:
- 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
- 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
- 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
当加入了服务配置中心之后,我们的系统架构图会变成下面这样:
2 nacos-config的相关配置
2.1 创建nacos-config
1 搭建nacos环境
略(请参照前文)springcloud_younger123rtyui9的博客-CSDN博客
2 在微服务中引入nacos的依赖(这个依赖是对哪个微服务进行配置就加到哪一个里面)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3 在微服务中添加nacos confifig的配置
注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件
1)Data ID不能随便写,要跟配置文件中的对应,对应关系如图所示
2)配置文件格式要跟配置文件的格式对应,且目前仅仅支持YAML和Properties
3)配置内容按照上面选定的格式书写
spring.application.name=wk-product #指定nacos配置中心的地址 spring.cloud.nacos.config.server-addr=localhost:81 #指定nacos中心文件的后缀--默认properties spring.cloud.nacos.config.file-extension=properties
2.2 配置动态刷新
idea中相关更改,在orderController中
@Value("${student.name}") private String name; @GetMapping("getOrder") public String getOrder(){ return "姓名:"+name; }
2.3 配置共享
2.3.1 数据源的共享
(1)创建配置文件 datasource.properties 必须有后缀.properties
只要微服务想共享数据源,就不要在配置数据源了
2.3.2 共享nacos注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:81
(3)相关的配置
#引用扩展的配置文件 #扩展文件的id spring.cloud.nacos.config.extension-configs[0].data-id=datasource.properties #扩展文件所在的组,默认为DEFAULT_GROUP spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP #是否实时刷新 spring.cloud.nacos.config.extension-configs[0].refresh=true
其余的跟共享数据源是一样的
如果在idea中忘记配置相关的内容,就会报下面的错误
(4)相关的配置
#扩展文件的id spring.cloud.nacos.config.extension-configs[1].data-id=nacos.properties #扩展文件所在的组,默认为DEFAULT_GROUP spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP #是否实时更新 spring.cloud.nacos.config.extension-configs[1].refresh=true
2.4例子所用的配置文件的介绍
3、Sleuth
3.1 Sleuth的介绍
SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计, 先来了解一下Sleuth中的术语和相关概念。
3.2 Sleuth入门
(1)修改父工程引入Sleuth依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> </dependencies>
启动微服务,调用之后,我们可以在控制台观察到sleuth的日志输出
4 zikpin
4.1 zikpin的介绍
Zipkin 是 Twitter 的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储展现、查找和我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源
除了面向开发的 API 接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。
4.2 zipkin的安装
第1步: 下载ZipKin的jar包
第2步: 通过命令行,输入下面的命令启动ZipKin Server
java -jar zipkin-server-2.12.9-exec.jar
第3步:通过浏览器访问 http://localhost:9411访问
4.3 zipkin的使用
(1)引入依赖,在父工程上
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
(2)配置相关的信息
#指定zipkin服务端所在的地址 spring.zipkin.base-url=http://localhost:9411 #不要让nacos也把zipkin注册到注册中心 spring.zipkin.discovery-client-enabled=false #设置zipkin对sleuth链路日志的采样比例 企业大多采用3% spring.sleuth.sampler.probability=1.0
访问某一个微服务后 追踪的结果
可以详细展开
这样就可以根据时间查看出那个有问题了
4.4 使用mysql实现数据持久化
第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,
`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' )
ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
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(`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';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
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 )
ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
一共只有三个表
第2步: 在启动ZipKin Server的时候,指定数据保存的mysql的信息
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql--MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin--MYSQL_USER=自己的用户名 --MYSQL_PASS=写你自己的密码
如果创建成功后,访问微服务后出现错误
”Access denied for user 'root'@'localhost' (using password: NO)“这种可能是数据库版本与zipkinban'的版本出现冲突,可以使用虚拟机中的数据库进行访问,切记一定要在nacos和nginx都开启之后才能开启虚拟机的服务,不然nacos不能正常开启,只需要将虚拟机开启就行,不需要登录,开启虚拟机是为了连接虚拟机的数据库,如果这样成功,就说明是两者的版本不匹配。