前言
SpringCloud 是微服务中的翘楚,最佳的落地方案。
在一个完整的微服务架构项目中,服务之间的调用是很复杂的,当其中某一个服务出现了问题或者访问超时,很
难直接确定是由哪个服务引起的,所以就有了 Spring Cloud Sleuth 链路跟踪。通过它,我们就可以很清楚直观
的了解每一个服务请求经过了哪些服务,用时多久,谁依赖谁或者被谁依赖。
源码
GitHub地址:https://github.com/intomylife/SpringCloud
环境
- JDK 1.8.0 +
- Maven 3.0 +
- SpringBoot 2.0.3
- SpringCloud Finchley.RELEASE
开发工具
- IntelliJ IDEA
正文
commons 工程
commons 工程 - POM 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-commons</artifactId>
<version>1.0</version>
<!-- 工程名称和描述 -->
<name>springcloud-sleuth-commons</name>
<description>公用工程</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties 下声明相应的版本信息,然后在 dependency 下引用的时候用 ${} 就可以引入该版本 jar 包了 -->
<properties>
<!-- 编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- jdk -->
<java.version>1.8</java.version>
<!-- SpringBoot -->
<platform-bom.version>Cairo-SR3</platform-bom.version>
<!-- SpringCloud -->
<spring-cloud-dependencies.version>Finchley.RELEASE</spring-cloud-dependencies.version>
</properties>
<!-- 加入依赖 -->
<dependencies>
</dependencies>
<!-- 依赖 jar 包版本管理的管理器 -->
<!-- 如果 dependencies 里的 dependency 自己没有声明 version 元素,那么 maven 就此处来找版本声明。 -->
<!-- 如果有,就会继承它;如果没有就会报错,告诉你没有版本信息 -->
<!-- 优先级:如果 dependencies 里的 dependency 已经声明了版本信息,就不会生效此处的版本信息了 -->
<dependencyManagement>
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>${platform-bom.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 配置一些共用依赖
commons 工程 - 项目结构
service 工程
① 此工程下有五个模块:一个注册中心,一个网关、一个 Zipkin 服务以及两个提供者
② 在 SpringBoot 2.x 版本后就不推荐自定义 zipkin server 了,但是下面有使用官网下载的 jar 包方式,
也有自定义的方式
③ Zipkin 也分为两部分,server 端和 client 端
④ server 端:收集数据,并展示
⑤ client 端:把调用信息发送给 server 端(本博客使用的 HTTP 报文的方式发送的信息)
⑥ 其中使用注册中心把服务连接起来,通过访问网关调用服务工程 A,服务工程 A 中使用的 Feign 调用服务
工程 B,最后使用 Zipkin 把所有请求数据记录下来,并展示
registry-service(注册中心)
registry-service - POM 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承父 -->
<parent>
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-service</artifactId>
<version>1.0</version>
</parent>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-registry-service</artifactId>
<version>1.0</version>
<!-- 工程名称描述 -->
<name>springcloud-sleuth-registry-service</name>
<description>注册中心</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
<properties>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- 服务注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 主要是加入 spring-cloud-starter-netflix-eureka-server 依赖
registry-service - application.yml 配置文件
# 端口
server:
port: 8761
# 应用名称
spring:
application:
name: eureka-server
eureka:
instance:
# 使用 ip 代替实例名
prefer-ip-address: true
# 实例的主机名
hostname: ${spring.cloud.client.ip-address}
# 实例的 ID 规则
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
# 是否向注册中心注册自己
registerWithEureka: false
# 是否向注册中心获取注册信息
fetchRegistry: false
serviceUrl:
# 注册中心地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 这里使用了默认的 8761 端口,当然也可以更改,不过在发现调用服务端的注册中心地址端口要与它一致
registry-service - 启动类
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class SpringcloudSleuthRegistryServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudSleuthRegistryServiceApplication.class, args);
}
}
- 在启动类中添加 @EnableEurekaServer 注解表示此工程是注册中心
registry-service - 启动项目
1. 项目启动成功后访问 http://localhost:8761/ 即可看到 eureka-server 主页面
master-service(zipkin 服务)
方式一:下载官网 jar 包
1. 在浏览器中访问 https://zipkin.io/quickstart.sh
2. 选择路径下载保存到本地(我保存到了桌面)
3. 在桌面双击打开 quickstart.sh(刚刚下载保存的文件),会自动下载一个 jar 包
4. 等待下载结束后,打开 cmd
5. 输入命令 cd desktop -> 进入到桌面
6. 输入命令 java -jar zipkin.jar -> 执行 jar 包,zipkin.jar 就是上面自动下载的 jar 包
7. 启动成功后访问:http://localhost:9411 即可看到 Zipkin Server 主页面
方式二:自定义 Zipkin Server
master-service - POM 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承父 -->
<parent>
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-service</artifactId>
<version>1.0</version>
</parent>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-master-service</artifactId>
<version>1.0</version>
<!-- 工程名称描述 -->
<name>springcloud-sleuth-master-service</name>
<description>链路跟踪</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
<properties>
<!-- zipkin -->
<zipkin.version>2.11.8</zipkin.version>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- 提供者消费者 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- zipkin server -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</exclusion>
</exclusions>
<version>${zipkin.version}</version>
</dependency>
<!-- zipkin ui -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>${zipkin.version}</version>
</dependency>
</dependencies>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 加入 spring-cloud-starter-netflix-eureka-client 依赖:提供和注册服务
- 加入 zipkin-server 依赖:Zipkin 服务
- 加入 zipkin-autoconfigure-ui 依赖:Zipkin UI
master-service - application.yml 配置文件
# 端口
server:
port: 9411
spring:
application:
# 应用名称
name: sleuth-zipkin-server
eureka:
instance:
# 使用 ip 代替实例名
prefer-ip-address: true
# 实例的主机名
hostname: ${spring.cloud.client.ip-address}
# 实例的 ID 规则
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
serviceUrl:
# 注册中心地址
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
# 关闭自动配置启用所有请求得检测
management:
metrics:
web:
server:
# 避免访问 zipkin 页面报 java.lang.IllegalArgumentException
auto-time-requests: false
- 这里使用了默认的 9411 端口,当然也可以更改,不过在其他服务中配置的 zipkin 服务器的地址端口要与它一致
- 注意配置注册中心地址的端口都为 8761 也就是上面注册中心工程配置的端口
- Zipkin Server 可以不用注册到注册中心中
master-service - 启动类
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import zipkin2.server.internal.EnableZipkinServer;
@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class SpringcloudSleuthMasterServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudSleuthMasterServiceApplication.class, args);
}
}
- 添加 @EnableEurekaClient 注解表示此工程可以向注册中心提供服务
master-service - 启动项目
1. 启动成功后访问:http://localhost:9411 即可看到 Zipkin Server 主页面
2. 两种方式任选其一即可
gateway-service(网关)
gateway-service - POM 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承父 -->
<parent>
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-service</artifactId>
<version>1.0</version>
</parent>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-gateway-service</artifactId>
<version>1.0</version>
<!-- 工程名称描述 -->
<name>springcloud-sleuth-gateway-service</name>
<description>服务网关</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties下声明相应的版本信息,然后在 dependency 下引用的时候用 ${} 就可以引入该版本 jar 包了 -->
<properties>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- 提供者消费者 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- zipkin client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 加入 spring-cloud-starter-netflix-eureka-client 依赖:提供和注册服务
- 加入 spring-cloud-starter-gateway 依赖:gateway
- 加入 spring-cloud-starter-zipkin 依赖:zipkin client
gateway-service - application.yml 配置文件
# 端口
server:
port: 8000
spring:
application:
# 应用名称
name: sleuth-gateway
cloud:
gateway:
discovery:
locator:
# 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务
enabled: true
# 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。)
routes:
# 路由标识(id:标识,具有唯一性)
- id: route_simple
# 目标服务地址(uri:地址,请求转发后的地址)
uri: http://localhost:8090/aUseB
# 路由条件(predicates:断言,匹配 HTTP 请求内容)
predicates:
## 匹配 GET 请求
- Method=GET
zipkin:
# 指定了 zipkin 服务器的地址
base-url: http://${spring.cloud.client.ip-address}:9411
sleuth:
sampler:
# 将采样比例设置为 1.0,也就是全部都需要。默认是 0.1
probability: 1.0
eureka:
instance:
# 使用 ip 代替实例名
prefer-ip-address: true
# 实例的主机名
hostname: ${spring.cloud.client.ip-address}
# 实例的 ID 规则
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
serviceUrl:
# 注册中心地址
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
logging:
level:
# log 级别
org.springframework.cloud.gateway: debug
- 注意配置注册中心地址的端口都为 8761 也就是上面注册中心工程配置的端口
- 注意配置 zipkin 服务器地址为 9411 也就是上面 zipkin-service 工程配置的端口
- 此处配置的路由为访问网关地址 http://localhost:8000/ 会被转发到 http://localhost:8090/aUseB
gateway-service - 启动类
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudSleuthGatewayServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudSleuthGatewayServiceApplication.class, args);
}
}
- 添加 @EnableEurekaClient 注解表示此工程可以向注册中心提供服务
gateway-service - 启动项目
1. 暂不启动
a-service(服务工程 A)
a-service - POM 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 继承父 -->
<parent>
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-a-service</artifactId>
<version>1.0</version>
</parent>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-a-service-core</artifactId>
<version>1.0</version>
<!-- 工程名称描述 -->
<name>springcloud-sleuth-a-service-core</name>
<description>服务工程 - A 核心</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
<properties>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- commons工程 依赖 -->
<dependency>
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-commons</artifactId>
<version>1.0</version>
</dependency>
<!-- api工程 依赖 -->
<dependency>
<groupId>com.zwc</groupId>
<artifactId>springcloud-sleuth-a-service-api</artifactId>
<version>1.0</version>
</dependency>
<!-- springboot web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 提供者消费者 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- zipkin client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 加入 spring-cloud-starter-netflix-eureka-client 依赖:提供和注册服务
- 加入 spring-cloud-starter-openfeign 依赖:调用服务
- 加入 spring-cloud-starter-zipkin 依赖:zipkin client
a-service - application.yml 配置文件
# 端口
server:
port: 8090
spring:
application:
# 应用名称
name: sleuth-a
zipkin:
# 指定了 zipkin 服务器的地址
base-url: http://${spring.cloud.client.ip-address}:9411
sleuth:
sampler:
# 将采样比例设置为 1.0,也就是全部都需要。默认是 0.1
probability: 1.0
eureka:
instance:
# 使用 ip 代替实例名
prefer-ip-address: true
# 实例的主机名
hostname: ${spring.cloud.client.ip-address}
# 实例的 ID 规则
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
serviceUrl:
# 注册中心地址
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
- 注意配置注册中心地址的端口都为 8761 也就是上面注册中心工程配置的端口
- 注意配置 zipkin 服务器地址为 9411 也就是上面 zipkin-service 工程配置的端口
- spring.application.name:应用名称,被消费者调用时需要用到,它在消费的同时也可以被消费
a-service - bootstrap.yml(注意)
feign:
hystrix:
# 开启断路器
enabled: true
- 断路器要主动开启,服务调用失败时才会熔断
- 此处有一个坑,把此配置写到 application.yml 中熔断不会生效
a-service - controller 前端控制器(提供服务)
package com.zwc.a.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*
* @ClassName ASayHelloController
* @Desc TODO Say Hello
* @Date 2019/5/20 23:24
* @Version 1.0
*/
@RestController
public class ASayHelloController {
/*
* @ClassName ASayHelloController
* @Desc TODO 读取配置文件中的端口
* @Date 2019/5/20 23:24
* @Version 1.0
*/
@Value("${server.port}")
private String port;
/*
* @ClassName ASayHelloController
* @Desc TODO Say Hello
* @Date 2019/5/20 23:24
* @Version 1.0
*/
@RequestMapping("/a")
public String a(){
return "Hello!I'm a. port:" + port;
}
}
- 提供一个服务:输出 Hello 和端口
a-service - 服务调用
package com.zwc.a.api.feign;
import com.zwc.a.api.impl.FeignApiFallBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/*
* @ClassName FeignApi
* @Desc TODO 使用 Feign 调用 b - 接口
* @Date 2019/5/20 23:21
* @Version 1.0
*/
@FeignClient(value = "sleuth-b" , fallback = FeignApiFallBack.class)
public interface FeignApi {
/*
* @ClassName FeignApi
* @Desc TODO 通过 sleuth-b 服务名调用 b() 方法
* @Date 2019/5/20 23:21
* @Version 1.0
*/
@RequestMapping("/b")
String b();
}
- 通过 @FeignClient 注解中 value = "sleuth-b" 来指定调用哪个服务
- sleuth-b 就是提供者(服务工程 B)的 spring.application.name:应用名称
- 通过 @FeignClient 注解中 fallback = FeignApiFallBack.class 来指定熔断时调用的方法
- FeignApiFallBack 就是此接口(FeignApi)的实现类,对应的实现方法就是熔断时调用的方法
- b():此方法是 B 工程中提供的服务,在这里定义成接口
- 注意要与提供者具有相同返回值,相同方法名以及相同参数
a-service - Fallback(FeignApiFallBack)
package com.zwc.a.api.impl;
import com.zwc.a.api.feign.FeignApi;
import org.springframework.stereotype.Component;
/*
* @ClassName FeignApi
* @Desc TODO fallback
* @Date 2019/5/20 23:21
* @Version 1.0
*/
@Component
public class FeignApiFallBack implements FeignApi {
/*
* @ClassName FeignApiFallBack
* @Desc TODO 调用 sleuth-b 服务中的 b() 方法失败时执行
* @Date 2019/5/20 23:31
* @Version 1.0
*/
@Override
public String b() {
return "Hello!aUseB fail";
}
}
- 使用 @Component 注解把此类交给 Spring 管理
- 实现了 FeignApi 接口,提供熔断时对应的方法
a-service - controller 前端控制器(消费服务)
package com.zwc.a.controller;
import com.zwc.a.api.feign.FeignApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*
* @ClassName AUseBFeignController
* @Desc TODO 使用 Feign 调用 b - 前端控制器
* @Date 2019/5/20 23:23
* @Version 1.0
*/
@RestController
public class AUseBFeignController {
@Autowired(required = false)
private FeignApi feignApi;
/*
* @ClassName FeignController
* @Desc TODO 通过 sleuth-b 服务名调用 b() 方法
* @Date 2019/5/20 23:13
* @Version 1.0
*/
@RequestMapping("/aUseB")
public String aUseB(){
return feignApi.b();
}
}
- 使用 @Autowired 注解装配 Bean,通过此 Bean 中的方法调用服务
- 此类对外暴露接口,调用的实则是提供者(服务工程 B)的服务
a-service - 启动类
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SpringcloudSleuthAServiceCoreApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudSleuthAServiceCoreApplication.class, args);
}
}
- 添加 @EnableEurekaClient 注解表示此工程可以向注册中心提供服务
- 添加 @EnableFeignClients 注解表示开启 Feign 功能进行远程调用
a-service - 启动项目
1. 暂不启动
b-service(服务工程 B)
① 此工程与服务工程 A 类似
② application.yml 配置文件中端口与应用名称与服务工程 A 不一致
③ 服务工程 B 只提供服务,所以不引入 feign
b-service - 启动项目
1. 暂不启动
启动项目
1. 启动注册中心工程(registry-service)
2. 项目启动成功后访问:http://localhost:8761/ 即可看到 eureka-server 主页面
3. 启动 Zipkin Server 工程(master-service)或者启动官网 zipkin.jar 包
4. 启动成功后访问:http://localhost:9411 即可看到 Zipkin Server 主页面
5. 启动网关工程(gateway-service)、服务工程 A(a-service)以及服务工程 B(b-service)
6. 项目都启动成功后,首先访问:http://localhost:8090/a(调用自己的服务)
7. 输出内容:'Hello!I'm a. port:8090'
8. 回到 Zipkin Server 主页面,点击 Find Traces 蓝色按钮
9. 可以看到有一条服务调用信息
10. 点击上面的 Dependencies,查看依赖关系
11. 发现没有任何依赖关系,是因为服务工程 A 自己调用了自己的服务
12. 这时再访问:http://localhost:8090/aUseB(调用服务工程 B 的服务)
13. 输出内容:'Hello!I'm b. port:8091'
14. 回到 Zipkin Server 主页面,点击 Find Traces 蓝色按钮
15. 发现多了一条服务调用信息
16. 点击上面的 Dependencies,再次查看依赖关系
17. 发现刚刚通过服务工程 A 调用的服务工程 B 的关系图就出来了
18. 访问网关:http://localhost:8000/
19. 输出内容:'Hello!I'm b. port:8091'
20. 再次回到 Zipkin Server 主页面,点击 Find Traces 蓝色按钮
21. 发现又多了一条服务调用信息
22. 点击上面的 Dependencies,再次查看依赖关系
23. 访问网关通过路由转发到服务工程 A,服务工程 A 又通过 Feign 调用服务工程 B
service 工程 - 项目结构
把多工程项目使用 IntelliJ IDEA 打开
- 把项目从 GitHub 中下载到你的本地
- 打开 IntelliJ IDEA
- 点击 File -> Open
- 打开你下载到本地的项目目录
- springcloud-sleuth -> springcloud-sleuth-service(选择打开此工程)
- 打开 service 工程后
- 再次点击 File -> Project Structrue
- 选择 Modules,点击 '+' 符号
- 点击 Import Module
- 还是打开你下载到本地的项目目录
- springcloud-sleuth -> springcloud-sleuth-commons -> pom.xml
- 点击 OK
- 点击 Next,Finish
- 点击 Apply,OK
希望能够帮助到你
over