zipkin:mysql做存儲,kafka做接收器,以及如何找到配置名稱


mysql設定
  1. 創建表結構:
(源碼路徑)\zipkin-storage\mysql\src\main\resources\mysql.sql
  2. zipkin的存儲設置為mysql(collector設置為kafka)
java -server -jar zipkin-server-2.6.1-exec.jar --zipkin.storage.type=mysql --zipkin.storage.mysql.host=10.4.122.89 --zipkin.storage.mysql.port=4001 --zipkin.storage.mysql.username=eop --zipkin.storage.mysql.password=eop123 --zipkin.storage.mysql.db=eop --zipkin.collector.kafka.zookeeper=10.4.120.77:2181
在配置的時候注意其實有兩套report的FactoryBean(都在zipkin-reporter-springs-beans.jar下面),一套是report級別的(AsyncReporterFactoryBean),一套是report下面sender級別的senderFactoryBean(KafkaSenderFactoryBean,OkHttpSenderFactoryBean,RabbitMQSenderFactoryBean,URLConnectionSenderFactoryBean);對於kafka需要使用的是KafkaSenderFactoryBean;
kafka
之前碰到一個奇怪的問題,就是客戶端就是調不通了,后來我寫了一段java代碼模擬producer,打出詳細日志,才發現原來是因為kafka client端訪問zookeeper,獲取的是機器名稱,但是我本地沒有配置這個名稱的ip映射導致;這個其實和之前的hbase的異常是一樣;凡是通過zookeeper來獲取機器的場景都要小心,本地一定要配置DNS。
 
kafka調通了,但是發現zipkin沒有接收到日志信息;怎么回事?后來通過閱讀源碼“${zipkin-master}\zipkin-autoconfigure\collector-kafka\src\main\java\zipkin\autoconfigure\collector\kafka下面的三個類,知道配置的參數應該是zipkin.collector.kafka.zookeeper;修改參數名稱之后,成功接收。
其實類似的對於各種collector以及storage獲取其配置參數就看源碼即可,XXCollectorProperties,@ConfigurationProperties(“XX”)里面的XX就是前綴,字段就是要填充到XX.fileldName的;比如kafka中:
@ConfigurationProperties("zipkin.collector.kafka")
class ZipkinKafkaCollectorProperties {
private String topic = "zipkin";
private String zookeeper;
private String groupId = "zipkin";
... ...
}
那么可以獲知他的參數列表為zipkin.collector.kafka.zookeeper,zipkin.collector.kafka.topic,zipkin.collector.kafka.groupId等等。
 
zipkin日志異常分析
 
發現全是springcloudapp的名稱,然后是springcloudapp( http://localhost:8080/hello/tom )工程單獨調用並沒有通知zipkin;
原來是因為restTemplate的獲取,好用的是使用restTemplate的@autowire的方式,但是如果使用@autowired導致的異常:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appServer': Unsatisfied dependency expressed through field 'restTemplate': No qualifying bean of type [org.springframework.web.client.RestTemplate] found for dependency [org.springframework.web.client.RestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.client.RestTemplate] found for dependency [org.springframework.web.client.RestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.client.RestTemplate] found for dependency [org.springframework.web.client.RestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
原因就是這個@Autowired聲明必須要有bean定義,但是當前的工程極簡,根本沒有spring的配置文件來配置這個字段,但是可以采用“監守自盜”的方式,就是在一個類中聲明既聲明了bean,也聲明了@autowired;為什么要做這么做?因為@autowired聲明后,spring將會管理這個對象的生命周期,就可以在這個對象創建的前后放入鈎子(攔截器)對其進行處理,比如zipkin就是通過spring攔截了restTemplate的創建,使其可以攔截restTemplate的invokeUrl方法,實現日志收集。
1 @Autowired
2   RestTemplate restTemplate;
3  
4   @Bean
5   public RestTemplate getRestTemplate() {
6   return new RestTemplate();
7   }
后來又碰到了一個問題,就是gateway異常;后來才發現因為appServer的eureka沒有配置(調試上面問題的時候,從別的好用的程序拷貝過來application.properites,內容直接干掉了,好用的那段配置沒有配eureka);后來添加上了問題解決;但是我發現一旦這種情況發生,zuul竟然就崩潰了,再也無法提供服務?
 
dubbo的web工程沒有反應了?
因為沒有配置Spring,需要在WEB-INF下面添加一些spring相關的位置xml;
 
為什么調不通spring-app?
沒加@RestController,所以mapping沒有創建,這一點從日志可以看到,沒有mapping /cloud/{name};
 
網關有掛了, http://localhost:8083/app/cloud/Jim 怎么跳轉不過去了?
后來重啟一次好了;zuul只有遇到了一些跳轉的異常,就掛在那個地方了,及時后面正常請求也無法處理。
 
zuul為什么報錯?
因為portal采用的是post方式提交請求;app的方法使用@GetMapping聲明的,所以zuul通過post去訪問app,超時結束。改為app的方法改為RequestMapping(接收任何http方法)問題解決。
 
方法還是很重要,我在A工程測試訪問B工程可以形成一條鏈,我在C工程寫法和A類似,訪問E工程,無法形成一條鏈;於是開始搞C怎么和E沒有反應呢?沒有頭緒,無法確定到底是C問題還還是E問題?
后來修改方案,直接讓A工程調用E工程,OK,形成鏈!說明是C工程問題;
繼續A采用的是spring+注入httpClient,B采用的spring + 靜態方法httpClient(客戶的遺留代碼不是spring,這里主要是測試非注入方式是否可用,利用spriing只不過是為了快速搭建Web工程)。開始是主攻為什么靜態的就不行呢?后來調整方案,先讓B和A采用相同的結構,先保證A→E形成一條鏈,再根據spring的原理來改造B工程, 這樣始終都是基於成功的demo進行修改,保證開發的方向。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM