Nacos: 注册中心,解决服务注册与发现
OpenFeign:声明式的HTTP客户端,服务远程调用(内置了负载均衡的功能)
Nacos:配置中心,中心化管理配置文件
Sentinel:微服务流量卫兵,以流量为入口,保护微服务,防止出现服务雪崩
Gateway: 微服务网关,服务集群的入口,路由转发以及负载均衡(结合Sentinel)
Sleuth: 链路追踪,链路快速梳理、故障定位等
Seata: 分布式事务解决方案
为什么使用链路追踪
【问题】
1、链路梳理难:无法清晰地看到整个调用链路
2、故障难定位:无法快速定位到故障点、无法快速定位哪个环节比较费时
sleuth目前并不是对所有调用访问都可以做链路追踪,它目前支持的有:rxjava、feign、quartz、RestTemplate、zuul、hystrix、grpc、kafka、Opentracing、redis、Reator、circuitbreaker、spring的Scheduled。国内用的比较多的dubbo,sleuth无法对其提供支持。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2.编写配置
spring:
sleuth:
sampler:
rate: 100 # 指定采样比例,默认10%
3.集成zipkin
虽然我们已经可以通过Trace ID来跟踪整体请求链路了,但是我们还是得去各个系统中捞取日志。在并发较高得时候,日志是海量的,这个时候我们可以借助Zipkin来代替我们完成日志获取与分析。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
- 配置文件
spring:
zipkin:
base-url: http://localhost:9999 # zipkin的地址
discovery-client-enabled: false # 禁用往nacos里注册
安装Zipkin
只需要下载Zipkin的jar包,并启动即可
启动
java -jar zipkin-server-2.12.9-exec.jar --server.port=9999
踩坑:
集成nacos注册中心时候报错
添加依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.9.RELEASE</version> </dependency>
配置文件
spring: cloud: nacos: discovery: server-addr: localhost:8848 application: name: testt
启动类加注解:
@EnableDiscoveryClient
报错: > 19:05:22.074 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@e9c588a 19:05:22.668 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed java.lang.NoClassDefFoundError: org/springframework/boot/Bootstrapper
nacos版本和springboot 版本不一致,更换匹配版本启动即可
2.集成feign报错
- 未解决
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
步骤:
- 在两个服务中都加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>8.18.0</version>
</dependency>
- 被调用服务启动类加上注解
@EnableFeignClients
- 调用服务增加接口
@FeignClient(name = "blog")//这里是被调用的服务名称
public interface CmsPageClient {
@GetMapping("/admin/gg")//路径
String ggg(@PathVariable("id") String id);
}
@Resource
private CmsPageClient cmsPageClient;
@GetMapping("/tttt")
public String tt(){
return cmsPageClient.ggg("111111111");
}
为什么可以直接实例化接口呢?feign使用了动态代理类
再加上反射拿到方法的注解上的路径等,在代理中实现了路径的拼接