前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
一、 在微服务系统中,不同应用服务可能会有各种不同的相互调用 。
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
--------------------------------------------------------------