微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。
分布式链路追踪(Distributed Tracing) ,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将-次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-sleuthartifactId>
dependency>
logging:
level:
com.hx: debug
// 在需要打印日志的类上加上注解
@Slf4j
// 在需要打印日志的地方,编写输出
log.debug("进入 ProductController 调用 getById " + "参数:" + pid);
docker run -d -p 9411:9411 openzipkin/zipkin
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
spring:
zipkin:
base-url: http://localhost:9411/ # zipkin server请求地址
discovery-client-enabled: false # 让nacos把他当成一个url,而不是服务名
sleuth:
sampler:
probability: 1.0 # 采样百分比
访问:http://localhost:8871/od/od/save?token=1&pid=123&num=2
首先我们来看一下,微服务架构下关于配置文件的一些问题:
首先把项目中的各种配置全部放到一个集中的地方进行统一管理,并提供一套标准的接口。
当各个服务需要获取配置的时候,就来配置中心的接口拉去自己的配置。
当配置中心的各种参数有更新的时候,也可以通知到各个服务实时的过来同步最新的消息,使它动态更新。
当加入了服务配置中心之后,我们的系统架构图如下:
使用Nacos作为配置中心,其实就是将nacos当作一个服务端,将各微服务看成客户端,我们将各个微服务的配置文件统一存放到nacos上,然后各个微服务从nacos上拉取配置即可。
省略,可以参考前面的步骤。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
注意:这里不可以使用application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件。
配置文件优先级
bootstrap.properties > bootstrap.yml > application.properties > application.yml
spring:
application:
name: prod-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos中心地址
file-extension: yaml # 配置文件格式
profiles:
active: dev
注意:这里的文件名称不能随意配置,要和上面配置文件中的配置信息统一。对应关系见下图:
观察启动后打印的日志,大体可以看出操作原理是:
组 + 服务名 + 激活环境 ==> DEFAULT_GROUP–prod-service-dev.yaml
@RefreshScope
需要在要求动态刷新配置的类上加上注解@RefreshScope
@RefreshScope操作原理:当配置发生更新时,贴有@RefreshScope注解的类,会在IOC容器中重新创建,该类中加载的数据重新更新。
@RefreshScope
public class Cloud2ProdApp {
@Value("${app.name}")
private String name;
@RequestMapping("/name")
public String name() {
return "Cloud2ProdApp "
+ name + "";
}
}
只需要写一个以spring.application.name命名的配置文件即可:
application-dev.yml、application-test.yml、application-prd.yml
提取公共文件名:application.yml
不同微服务之间也可以进行配置共享。原理类似于文件引入,就是定义一个公共配置文件,然后在当前配置文件中引入。
操作步骤:
globalConfig: global
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: global-config.yaml
refresh: true