前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
一、 在微服务系统中,不同应用服务可能会有各种不同的相互调用 。
springcloud 集成了 zipkin 来实现对于不同服务调用的追踪和统计。
二、具体实现 。
1. Docker 方式安装并运行 zipkin 作为 zipkin 的 server,即服务追踪的服务端。
1.1 安装方式及运行见文章:Docker 方式安装 zipkin (linux 、阿里云ECS上安装)
运行效果如下图,此时,并没有服务调用记录,zipkin 管控中心 未展示任何追踪数据:
1.2 在 base 工程 pom 中加上依赖:spring-boot-starter-web 。
完整依赖如下:
<?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.base</groupId>
<artifactId>base-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>base-config</name>
<packaging>pom</packaging>
<description>整个 springCloud 体系基本 pom 配置</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<!--
lookup parent from repository
查找顺序:relativePath元素中的地址–本地仓库–远程仓库。
设定一个空值将始终从仓库中获取,不从本地路径获取。
-->
<relativePath/>
</parent>
<!-- 配置远程发布到私服,mvn deploy -->
<!--<distributionManagement>-->
<!--<!–releases:发布–>-->
<!--<repository>-->
<!--<id>maven-releases</id>-->
<!--<name>Nexus Release Repository</name>-->
<!--<url>http://ergouzi.fun:8081/repository/maven-releases/</url>-->
<!--</repository>-->
<!--<!–Snapshot:快照–>-->
<!--<snapshotRepository>-->
<!--<id>maven-snapshots</id>-->
<!--<name>Nexus Snapshot Repository</name>-->
<!--<url>http://ergouzi.fun:8081/repository/maven-snapshots/</url>-->
<!--</snapshotRepository>-->
<!--</distributionManagement>-->
<!--定义子模块-->
<!--<modules>-->
<!--<module>bbb</module>-->
<!--<module>aaa</module>-->
<!--</modules>-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!--配置文件管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.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>
2. 新建工程 see-name 工程,作为一个 zipkin 客户端,对外暴露接口:查看姓名。
2.1. file -- new -- project
2.2. spring Initializr - module SDK 选择自己的 JDK ,其余的可以不用填写,next。
2.3. 填写工程相关信息:包名、工程名等,next。
2.4.直接 next
2.5. 工程名,代码存放位置等,finish 。
2.6.工程结构:
2.7. 在 pom 中引入 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
完整依赖:
<?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</groupId>
<artifactId>see-name</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>see-name</name>
<description>服务:查看姓名</description>
<parent>
<groupId>com.base</groupId>
<artifactId>base-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
</project>
2.8 在配置文件中配置 zipkin 服务地址 :spring.zipkin.base-url=http://ergouzi.fun:9411
端口设置为 8805 。
# 端口
server.port= 8805
# 工程名
spring.application.name=see-name
# zipkin 服务地址
spring.zipkin.base-url=http://ergouzi.fun:9411
# zipkin 收集信息频率:默认为0.1
# 1 代表收集所有请求记录,但会有延迟
# spring.sleuth.sampler.percentage=1
# zipkin.sender.type=WEB
2.9 暴露接口 seeName、并调用 8806 端口的接口 seeAge 。以实现不同服务,相互调用。
完整启动类:
package com.seename;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SeeNameApplication {
public static void main(String[] args) {
SpringApplication.run(SeeNameApplication.class, args);
}
@RequestMapping("/seeAge")
public String seeAge() throws Exception {
return HttpUtil.seeName("http://localhost:8806/seeAge");
}
@RequestMapping("/seeName")
public String seeName() {
return "姓名:小熊";
}
}
2.10 用工具类实现请求发送,HttpUtil 代码:
package com.seename;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @author yujiang
* @description 发送请求工具类
* @date 2019/8/5 18:27
*/
public class HttpUtil {
public static String seeName(String url) throws Exception {
URL restURL = new URL(url);
HttpURLConnection conn = (HttpURLConnection) restURL.openConnection();
conn.setRequestMethod("GET");
conn.setDoOutput(true);
conn.setAllowUserInteraction(false);
BufferedReader bReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line, resultStr = "";
while (null != (line = bReader.readLine())) {
resultStr += line;
}
bReader.close();
return resultStr;
}
}
3. 同样方法新建工程 see-age 工程,作为一个 zipkin 客户端,对外暴露接口:查看年龄。
3.1 工程结构:
3.2 同样加依赖,并配置好 zipkin 服务地址:
<?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</groupId>
<artifactId>see-age</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>see-age</name>
<description>服务:查看年龄</description>
<parent>
<groupId>com.base</groupId>
<artifactId>base-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
</project>
端口设置为:8806 。
# 端口
server.port= 8806
# 工程名
spring.application.name=see-age
# zipkin 服务地址
spring.zipkin.base-url=http://ergouzi.fun:9411
3.3 暴露接口 seeAge、并调用 8805 端口的接口 seeName 。以实现不同服务,相互调用。
package com.seeage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SeeAgeApplication {
public static void main(String[] args) {
SpringApplication.run(SeeAgeApplication.class, args);
}
@RequestMapping("/seeName")
public String seeName() throws Exception {
return HttpUtil.seeName("http://localhost:8805/seeName");
}
@RequestMapping("/seeAge")
public String seeAge() {
return "16岁";
}
}
4. 浏览器分别请求这 4 个接口(一定要先请求接口,zipkin管控中心 才会有追踪数据)
http://localhost:8805/seeName 、http://localhost:8805/seeAge 、
http://localhost:8806/seeName 、http://localhost:8806/seeAge
5.查看 zipkin管控中心 追踪数据。
5.1 点击 “依赖” 查看到服务间依赖对应:
PS:我不确定 zipkin 的延迟到底为多久,昨天我反复测试,但此页面依赖关系一直没有任何记录,到今天早上依旧无果。一刻钟前再次刷新,终于有如下图的记录了。项目代码并未作改动 。
5.2 点击 “查看” ,可以看到接口请求记录:
可以单独查看对应接口请求:
至此,zipkin 已经正常运行并追踪到服务间调用。
-------------------------------------------------------------
下一篇:springCloud - 第11篇 - Eureka 注册中心集群的实现
源码见:
https://gitee.com/FJ_WoMenDeShiJie/springcloud-base
https://gitee.com/FJ_WoMenDeShiJie/springcloud-seeAge
https://gitee.com/FJ_WoMenDeShiJie/springcloud-seeName
-------------------------------------------------------------
PS:这个系列不定时更新,只是个人的学习分享,
内容全程参考书目:
《Spring Cloud 与 Docker 微服务架构空实战 》、
《Spring Cloud 微服务实战》及此书作者博客:http://blog.didispace.com/spring-cloud-learning/
《深入理解 Spring Cloud 与微服务构建》及此书作者博客:https://blog.csdn.net/forezp/article/details/70148833
--------------------------------------------------------------