前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
一、?在微服務系統中,不同應用服務可能會有各種不同的相互調用 。
? ? 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
--------------------------------------------------------------