摘要:主要問題由于新版本新版本實現鏈路追蹤的一些新特性,使得我在實現的過程上踩了不少坑。同樣一些場景下需要保存鏈路追蹤的數據,以備后面觀察對比,所以同樣需要一個來存儲數據。方法一,通過修改基配置文件后啟動。
主要問題
???? 由于springboot新版本(2.1.0)、springcloud新版本(Greenwich.M1)實現鏈路追蹤sleuth+zipkin的一些“新特性”,使得我在實現sleuth+zipkin的過程上踩了不少坑。
??在springboot1.X版本的時候,實現鏈路追蹤服務需要用戶自己實現client以及server,通常在server服務端需要引入各種各樣的包(spring-cloud-sleuth-stream,以及支持zipkin的一些相關依賴包等等);
?? 但在spring cloud新版本實現鏈路追蹤sleuth+zipkin的方式上已經不再需要自己再去實現一個server服務端(集成sleuth+zipkin),而是由zinkin官方提供了一個現成的zipkin-server.jar,或者是一個docker鏡像,用戶可以下載并通過命令進行啟動它,用戶可以通一些配置來確定sleuth收集到信息后傳輸到zipkin之間采用http,還是通過rabbit/kafka的方式。在新的版本下,用戶只需要關注slenth-client選用何種傳輸方式(http或mq(rabbit/kafka),如果選擇http,則在配置中指明base-url;如果選擇mq,則在配置指明相關消息中間件的相關信息host/port/username/password...),至于zipkin的信息storage問題,則由zipkin-server要負責,可以通過zipkin-server.jar 配置一些具體的參數來啟動。(下面會細講)
ps:這不是教程貼,這主要是解決一些問題的一些方法,不會有詳細的實現過程,但為了簡明我會貼上部分代碼。
背景???? 最近開始實習了,老大讓我自學一下sc(spring cloud),學就學嘛,也不是難事。看完spring cloud的全家桶,老大說讓我重點了解一下它的鏈路追蹤服務,后期會有這方面的任務安排給我做,所以呢我就重點關注這一方面,打算自己做個demo練練手,看了網上的教程,膨脹的我選擇了個最新的版本,結果發現就這么掉坑里了。。。
版本按照慣例,先說下springboot跟spring cloud的版本
springboot:2.1.0
springcloud:Greenwich.M1
個人建議新手不要過分追求新版本,舊版本的還是夠用的,比springboot 2.6.0搭配sringcloud Finchley SR2還是挺穩的,如果真的要探索新版本你會發現這里面的坑實在是踩不完,基本要花個一兩天才能讓自己從坑里跳出去,這樣頻繁踩坑會讓新手很容易放棄~~~
ps:不要問我為什么知道。。。
閑話扯完了,可以進入正題了
一共四個服務
eureka-server
zipkin-server:新版本的zipkin服務端,負責接受sleuth發送過來的數據,完成處理、存儲、建立索引,并且提供了一個可視化的ui數據分析界面。
需要的同學話可以直接在github上下載https://github.com/openzipkin...
嗯就是這兩個家伙
下面兩個是兩個服務
??eureka-server服務注冊中心,這個實現我就不講了,網上搜一大把,各個版本實現基本都是一致的,并不存在版本更新跨度極大的情況。而且這里我把它是打包成一個jar包,在需要的時候直接用java -jar XXX.jar 直接啟動
??至于product跟order(也即實際場景下各種種樣的服務A、B、C...)
order服務只有一個接口/test,去調用product的接口
??這里的productclient就是使用feignf去調用order的/product/list接口
product只有一個接口/product/list,查找所有商品的列表
??簡單的來說,這里的場景就是order服務--(去調用)-->product服務
??說完場景后,貼一下這兩個服務的相關配置信息(order跟producet的配置基本上是相同的)
application.yml
spring: application: #服務名 name: product #由于業務邏輯需要操作數據庫,所以這里配置了mysql的一些信息 datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: 123456 url: jdbc:mysql://127.0.0.1:3306/sc_sell?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai jpa: show-sql: true #重點 zipkin: #base-url:當你設置sleuth-cli收集信息后通過http傳輸到zinkin-server時,需要在這里配置 base-url: http://localhost:9411 enabled: true sleuth: sampler: #收集追蹤信息的比率,如果是0.1則表示只記錄10%的追蹤數據,如果要全部追蹤,設置為1(實際場景不推薦,因為會造成不小的性能消耗) probability: 1 eureka: client: service-url: #注冊中心地址 defaultZone: http://localhost:8999/eureka/ logging: level: #這個是設置feign的一個日志級別,key-val的形式設置 org.springframework.cloud.openfeign: debug
??說完配置信息,就該講一下依賴了,很簡單,client實現鏈路追蹤只需要添加一個依賴spring-cloud-starter-zipkin。就是這個
org.springframework.cloud spring-cloud-starter-zipkin
??其實這些都是基礎操作,是吧,那么來點進階的。
從上面的例子上來看,其實還是有幾個問題需要考慮一下。
有點開發經驗的人都會發現,首先它是基于http協議傳輸的,http協議傳輸有個不好的地方就是,它是短連接,即需要頻繁通過三次握手建立鏈接,這在追蹤很多服務時會造成不小的性能消耗。
另外還有一個問題:對于直接傳輸的方式,有個弊端就是一旦接收方意外斷開連接,那么在傳輸鏈路中的一些數據將會丟失,如果這些數據是關鍵數據,那么后果將是非常嚴重的。同樣一些場景下需要保存鏈路追蹤的數據,以備后面觀察對比,所以同樣需要一個db來存儲數據。
??所以對于以上的問題,還是需要去考慮,值得欣慰的是,zipkin在這兩個方面也作了很nice的解決方案,在實現過程中只需要稍作配置即可。
在sleuth-cli跟zipkin-server之間插入一個消息中間件rabbitmq/kafka,這里我舉例中只使用rabbitmq來實現
將鏈路追蹤的數據存儲到DB上,目前zipkin暫時只支持mysql/elasticsearch,這里我使用mysql
??如果你是剛開始學習sc,給你去實現的話,你肯定會開始打開瀏覽器開始搜索教程。
??結果你會發現,大部分博客上都是以前版本的實現方式,一些較舊會讓你自己實現一個zipkin-server(我懷疑他們的版本是1.x),你會發現很郁悶,因為這跟你想象的不太一樣啊。
繼續找,終于在茫茫帖子中,找到了一篇是關于springboot2.0.X版本的實現鏈路追蹤的教程,這時候你會興奮,終于找到靠譜一點的啊,喜出望外有木有啊,但是,事情還沒完,它會讓你在客戶端依賴下面這個依賴包
org.springframework.cloud spring-cloud-sleuth-zipkin-stream org.springframework.cloud spring-cloud-sleuth-stream
??結果你會發現,你在依賴它的時候,其實是依賴不了,為什么?因為版本的問題,什么?你跟我說你的pom文件沒報錯啊,但是,你打開idea右邊的maven插件看一下
??這真的是一個巨坑,我一直不明白是怎么回事,直到有一次,我打開了這個頁面,花了我一天的時間去摸索是什么原因造成的集成rabbitmq失敗,真的是被安排得明明白白,最后我發現,這條路行不通啊
??最后,豪無頭緒的我,繼續在網上查找一些springboot2.x版本的一些鏈路追蹤的教程,在搜索了一個下午,我突然想起,誒不對,我應該直接去官網看它的官方教程的啊。。。雖然都英文,大不了我用chrome自帶的翻譯工具翻譯一下咯。結果就立馬打開spring的官網,選擇了最新的版本,進去找了一下,還真的讓我找到,還特別簡單!!!
傳送門:https://cloud.spring.io/sprin...
??官方文檔是這么說的。
??意思大概是說:如果你想使用rabbitmq或kafka替換掉http,添加spring-rabbit或spring-kafka的依賴包,默認目標名是zipkin(隊列名),如果你使用kafka/mysql,你需要設置屬性:spring-zipkin-sender-type=kafka/mysql
??也就是說,只需要引入下面這兩個依賴包!!!
org.springframework.cloud spring-cloud-starter-zipkin org.springframework.amqp spring-rabbit
再往下看,你會發現有一個提示
spring-cloud-sleuth-stream已經被棄用,不再與這個版本新內容。。。
所以現在再回過頭去看,你會知道為什么在上一個嘗試中引入spring-cloud-sleuth-stream會無效了。
再修改下application.yml的配置信息,只需要注釋掉base-url,修改zipkin.sender.type=rabiit,再配置一下rabbitmq的一些信息,就大功告成。
zipkin: # 內存方式配置:可不配 # base-url: http://localhost:9411/ sender: type: rabbit rabbitmq: host: localhost port: 5672 username: guest password: guest
??到這里,你就已經把order/poduct的鏈路追蹤部分做好了。
??我們上面講了sleuth負責收集數據 ,zipkin負責接收sleuth收集后發送過來的追蹤信息,處理、存儲、索引、提供ui,所以接下來,就是來實現zipkin-server的從rabbitmq隊列取出追蹤數據,并存儲在mysql數據中這一功能了。
??對于zipkin-server如何去實現,其實zinkin官網已經給我們做了功能的集成,只需要在啟動的時候,設置參數即可,下面就來講一下
??對于需要根據什么場景設置什么樣的參數的問題,我不會具體講解應該怎么設置,因為我也只是剛接觸sc不久,一些場景我也不是很熟悉,但我會講怎么去找我們需要的一些參數。
方法一,通過修改基配置文件后啟動。??首先,我們用解壓工具解壓一下zipkin-server.jar這個壓縮包,解壓出來有三個文件夾,里面大部分都是.class文件。
??然后我們進入BOOT-INFclasses目錄下,你會發現有兩個.yml文件,沒錯這就是yml的配置文件了
??其中zipkin-server.yml就是zinpkin-server主要的配置文件了,但你打開后會發現,其實里面只有一行配置,spring.profiles.include: shared
,即引入shared.yml文件,所以這里我們主要看zinkin-serer-shared.yml文件。
打開zinkin-serer-shared.yml
zipkin: self-tracing: # Set to true to enable self-tracing. enabled: ${SELF_TRACING_ENABLED:false} # percentage to self-traces to retain sample-rate: ${SELF_TRACING_SAMPLE_RATE:1.0} # Timeout in seconds to flush self-tracing data to storage. message-timeout: ${SELF_TRACING_FLUSH_INTERVAL:1} collector: # percentage to traces to retain sample-rate: ${COLLECTOR_SAMPLE_RATE:1.0} http: # Set to false to disable creation of spans via HTTP collector API enabled: ${HTTP_COLLECTOR_ENABLED:true} kafka: # Kafka bootstrap broker list, comma-separated host:port values. Setting this activates the # Kafka 0.10+ collector. bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:} # Name of topic to poll for spans topic: ${KAFKA_TOPIC:zipkin} # Consumer group this process is consuming on behalf of. group-id: ${KAFKA_GROUP_ID:zipkin} # Count of consumer threads consuming the topic streams: ${KAFKA_STREAMS:1} rabbitmq: # RabbitMQ server address list (comma-separated list of host:port) addresses: ${RABBIT_ADDRESSES:} concurrency: ${RABBIT_CONCURRENCY:1} # TCP connection timeout in milliseconds connection-timeout: ${RABBIT_CONNECTION_TIMEOUT:60000} password: ${RABBIT_PASSWORD:guest} queue: ${RABBIT_QUEUE:zipkin} username: ${RABBIT_USER:guest} virtual-host: ${RABBIT_VIRTUAL_HOST:/} useSsl: ${RABBIT_USE_SSL:false} uri: ${RABBIT_URI:} query: enabled: ${QUERY_ENABLED:true} # 1 day in millis lookback: ${QUERY_LOOKBACK:86400000} # The Cache-Control max-age (seconds) for /api/v2/services and /api/v2/spans names-max-age: 300 # CORS allowed-origins. allowed-origins: "*" storage: strict-trace-id: ${STRICT_TRACE_ID:true} search-enabled: ${SEARCH_ENABLED:true} type: ${STORAGE_TYPE:mem} mem: # Maximum number of spans to keep in memory. When exceeded, oldest traces (and their spans) will be purged. # A safe estimate is 1K of memory per span (each span with 2 annotations + 1 binary annotation), plus # 100 MB for a safety buffer. You"ll need to verify in your own environment. # Experimentally, it works with: max-spans of 500000 with JRE argument -Xmx600m. max-spans: 500000 cassandra: # Comma separated list of host addresses part of Cassandra cluster. Ports default to 9042 but you can also specify a custom port with "host:port". contact-points: ${CASSANDRA_CONTACT_POINTS:localhost} # Name of the datacenter that will be considered "local" for latency load balancing. When unset, load-balancing is round-robin. local-dc: ${CASSANDRA_LOCAL_DC:} # Will throw an exception on startup if authentication fails. username: ${CASSANDRA_USERNAME:} password: ${CASSANDRA_PASSWORD:} keyspace: ${CASSANDRA_KEYSPACE:zipkin} # Max pooled connections per datacenter-local host. max-connections: ${CASSANDRA_MAX_CONNECTIONS:8} # Ensuring that schema exists, if enabled tries to execute script /zipkin-cassandra-core/resources/cassandra-schema-cql3.txt. ensure-schema: ${CASSANDRA_ENSURE_SCHEMA:true} # 7 days in seconds span-ttl: ${CASSANDRA_SPAN_TTL:604800} # 3 days in seconds index-ttl: ${CASSANDRA_INDEX_TTL:259200} # the maximum trace index metadata entries to cache index-cache-max: ${CASSANDRA_INDEX_CACHE_MAX:100000} # how long to cache index metadata about a trace. 1 minute in seconds index-cache-ttl: ${CASSANDRA_INDEX_CACHE_TTL:60} # how many more index rows to fetch than the user-supplied query limit index-fetch-multiplier: ${CASSANDRA_INDEX_FETCH_MULTIPLIER:3} # Using ssl for connection, rely on Keystore use-ssl: ${CASSANDRA_USE_SSL:false} cassandra3: # Comma separated list of host addresses part of Cassandra cluster. Ports default to 9042 but you can also specify a custom port with "host:port". contact-points: ${CASSANDRA_CONTACT_POINTS:localhost} # Name of the datacenter that will be considered "local" for latency load balancing. When unset, load-balancing is round-robin. local-dc: ${CASSANDRA_LOCAL_DC:} # Will throw an exception on startup if authentication fails. username: ${CASSANDRA_USERNAME:} password: ${CASSANDRA_PASSWORD:} keyspace: ${CASSANDRA_KEYSPACE:zipkin2} # Max pooled connections per datacenter-local host. max-connections: ${CASSANDRA_MAX_CONNECTIONS:8} # Ensuring that schema exists, if enabled tries to execute script /zipkin2-schema.cql ensure-schema: ${CASSANDRA_ENSURE_SCHEMA:true} # how many more index rows to fetch than the user-supplied query limit index-fetch-multiplier: ${CASSANDRA_INDEX_FETCH_MULTIPLIER:3} # Using ssl for connection, rely on Keystore use-ssl: ${CASSANDRA_USE_SSL:false} elasticsearch: # host is left unset intentionally, to defer the decision hosts: ${ES_HOSTS:} pipeline: ${ES_PIPELINE:} max-requests: ${ES_MAX_REQUESTS:64} timeout: ${ES_TIMEOUT:10000} index: ${ES_INDEX:zipkin} date-separator: ${ES_DATE_SEPARATOR:-} index-shards: ${ES_INDEX_SHARDS:5} index-replicas: ${ES_INDEX_REPLICAS:1} username: ${ES_USERNAME:} password: ${ES_PASSWORD:} http-logging: ${ES_HTTP_LOGGING:} legacy-reads-enabled: ${ES_LEGACY_READS_ENABLED:true} mysql: jdbc-url: ${MYSQL_JDBC_URL:} host: ${MYSQL_HOST:localhost} port: ${MYSQL_TCP_PORT:3306} username: ${MYSQL_USER:} password: ${MYSQL_PASS:} db: ${MYSQL_DB:zipkin} max-active: ${MYSQL_MAX_CONNECTIONS:10} use-ssl: ${MYSQL_USE_SSL:false} ui: enabled: ${QUERY_ENABLED:true} ## Values below here are mapped to ZipkinUiProperties, served as /config.json # Default limit for Find Traces query-limit: 10 # The value here becomes a label in the top-right corner environment: # Default duration to look back when finding traces. # Affects the "Start time" element in the UI. 1 hour in millis default-lookback: 3600000 # When false, disables the "find a trace" screen search-enabled: ${SEARCH_ENABLED:true} # Which sites this Zipkin UI covers. Regex syntax. (e.g. http://example.com/.*) # Multiple sites can be specified, e.g. # - .*example1.com # - .*example2.com # Default is "match all websites" instrumented: .* # URL placed into thetag in the HTML base-path: /zipkin server: port: ${QUERY_PORT:9411} use-forward-headers: true compression: enabled: true # compresses any response over min-response-size (default is 2KiB) # Includes dynamic json content and large static assets from zipkin-ui mime-types: application/json,application/javascript,text/css,image/svg spring: jmx: # reduce startup time by excluding unexposed JMX service enabled: false mvc: favicon: # zipkin has its own favicon enabled: false autoconfigure: exclude: # otherwise we might initialize even when not needed (ex when storage type is cassandra) - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration info: zipkin: version: "2.11.8" logging: pattern: level: "%clr(%5p) %clr([%X{traceId}/%X{spanId}]){yellow}" level: # Silence Invalid method name: "__can__finagle__trace__v3__" com.facebook.swift.service.ThriftServiceProcessor: "OFF" # # investigate /api/v2/dependencies # zipkin2.internal.DependencyLinker: "DEBUG" # # log cassandra queries (DEBUG is without values) # com.datastax.driver.core.QueryLogger: "TRACE" # # log cassandra trace propagation # com.datastax.driver.core.Message: "TRACE" # # log reason behind http collector dropped messages # zipkin2.server.ZipkinHttpCollector: "DEBUG" # zipkin2.collector.kafka.KafkaCollector: "DEBUG" # zipkin2.collector.kafka08.KafkaCollector: "DEBUG" # zipkin2.collector.rabbitmq.RabbitMQCollector: "DEBUG" # zipkin2.collector.scribe.ScribeCollector: "DEBUG" management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always # Disabling auto time http requests since it is added in Undertow HttpHandler in Zipkin autoconfigure # Prometheus module. In Zipkin we use different naming for the http requests duration metrics: web: server: auto-time-requests: false
??這其實就是配置文件,對于需要使用的組件,其實就是只修改對應的配置,比如我需要使用storage,讓它把追蹤數據保存到mysql中,那么我只需要修改對應的配置信息:
storage: #其實部分不需要修改,省略掉 mysql: jdbc-url: jdbc:sqlserver://localhost?XXX=xxx; host: localhost port: 3306 username: root password: 123456 db: zipkin #最大連接數 max-active: ${MYSQL_MAX_CONNECTIONS:10} #是否使用ssl use-ssl: ${MYSQL_USE_SSL:false}
修改完配置,我們重新壓縮成一個jar包,直接啟動即可。
方法二,通過使用環境變量的方式來啟動zipkin-server.jar服務。直接使用java -jar zipkin-server.jar --zipkin.storage.mysql.username=root --zipkin.storage.mysql.password=123456 --zipkin.storage.mysql.host=localhost --zipkin.storage.mysql.port=3306 ...
??后面接上的即是它的環境變量,至于環境變量有哪些,請看方法一的yml文件,都是一一對應的。這種方法好片就是不需要修改jar包,但就是需要后面接上一串較長的環境變量聲明。
??好了,基本上就已經結束了。其實配置都是同樣的原理。能夠舉一反三自然其它相關配置都不是什么問題。
總結??更新過程中因為比較忙中間還沒寫完就發表了,導致內容欠缺,今天終于利用周末的時間補上了,萬幸。
??第一篇文章,主要記錄自己的踩坑經歷,非專業的寫教程,大都是一些隨心的記錄,如果有什么看不懂的,歡迎留下你的問題,同樣,如果哪些地方寫得有誤,望您不吝賜教,幫我指出一些錯誤,謝謝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72205.html
摘要:就和是應用的腳手架一樣,是分布式和集群應用的腳手架。是由一個一個的微服務組成,而這些微服務都是在注冊中心管理起來的。為了降低維護成本,我們引入了分布式配置服務的概念。 就和 springboot 是 web 應用的腳手架一樣, springcloud 是分布式和集群應用的腳手架。 但是并不是所有的同學都有接觸過分布式和集群,所以為了讓學習曲線變得緩和,站長按照如下順序展開 spring...
摘要:它就是史上最簡單的教程第三篇服務消費者后端掘金上一篇文章,講述了通過去消費服務,這篇文章主要講述通過去消費服務。概覽和架構設計掘金技術征文后端掘金是基于的一整套實現微服務的框架。 Spring Boot 配置文件 – 在坑中實踐 - 后端 - 掘金作者:泥瓦匠鏈接:Spring Boot 配置文件 – 在坑中實踐版權歸作者所有,轉載請注明出處本文提綱一、自動配置二、自定義屬性三、ran...
摘要:介紹是基于微服務基礎腳手架對于日常開發而言提供基礎權限控制,動態菜單,才用前后端分離架構,前臺采用后臺使用提供接口。對于以后開發,只需要在添加業務模塊即可,大大減少工作量。 介紹 panda是基于SpringCloud Finchley.SR1 、SpringBoot 2.x、 vue、element-ui 微服務基礎腳手架對于日常開發而言提供基礎權限控制,動態菜單,才用前后端分離架構...
閱讀 2508·2021-10-11 10:59
閱讀 2700·2021-09-22 15:49
閱讀 2637·2021-08-13 13:25
閱讀 1284·2019-08-30 13:14
閱讀 2386·2019-08-29 18:45
閱讀 2990·2019-08-29 18:36
閱讀 1482·2019-08-29 13:21
閱讀 1157·2019-08-26 11:44