Spring Cloud 应用篇 之 Spring Cloud Sleuth + Zipkin(三)修改数据存储方式

(一)简介

默认情况下,Zipkin Server 会将跟踪信息存储在内存中,每次重启 Zipkin Server 都会使之前收集的跟踪信息丢失,并且当有大量跟踪信息时,内存存储也会造成性能瓶颈,所以通常我们都需要将跟踪信息存储到外部组件中,如 Mysql。

由于 Spring Boot 2.0 之后 Zipkin 不再推荐我们来自定义 Server 端了,那么如何把 Zipkin Server 修改为 Mysql 存储功能呢?答案还是和集成 RabbitMQ 一样,在启动 zipkin.jar 的时候,配置相关参数

(二)配置 zipkin server 

2.1 创建数据库、表信息

既然数据存储改为 Mysql,那么肯定要建立相关的表,建表的脚本文件 mysql.sql 在 GitHub 官方地址能查到,链接如下:

https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql

这里会创建三张表,如下,具体表结构信息,大家可以自己查看



2.2 启动 zipkin

zipkin.jar 的 配置文件内容可以查看 GitHub 上官方的提供

https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml

为了方便,我在这里展示部分内容:


  
  
  1. zipkin:
  2. collector:
  3. rabbitmq:
  4. # RabbitMQ server address list (comma-separated list of host:port)
  5. addresses: ${<span class="hljs-symbol"><span class="hljs-symbol">RABBIT_ADDRESSES:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">concurrency:</span></span> ${ RABBIT_CONCURRENCY: 1}
  6. # TCP connection timeout in milliseconds
  7. connection- timeout: ${<span class="hljs-symbol"><span class="hljs-symbol">RABBIT_CONNECTION_TIMEOUT:</span></span><span class="hljs-number"><span class="hljs-number">60000</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">password:</span></span> ${ RABBIT_PASSWORD:guest}
  8. queue: ${<span class="hljs-symbol"><span class="hljs-symbol">RABBIT_QUEUE:</span></span>zipkin}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">username:</span></span> ${ RABBIT_USER:guest}
  9. virtual- host: ${<span class="hljs-symbol"><span class="hljs-symbol">RABBIT_VIRTUAL_HOST:</span></span>/}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">useSsl:</span></span> ${ RABBIT_USE_SSL: false}
  10. uri: ${<span class="hljs-symbol"><span class="hljs-symbol">RABBIT_URI:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">storage:</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> strict-trace-<span class="hljs-symbol"><span class="hljs-symbol">id:</span></span> ${ STRICT_TRACE_ID: true}
  11. search- enabled: ${<span class="hljs-symbol"><span class="hljs-symbol">SEARCH_ENABLED:</span></span><span class="hljs-literal"><span class="hljs-literal">true</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">type:</span></span> ${ STORAGE_TYPE:mem}
  12. mem:
  13. # Maximum number of spans to keep in memory. When exceeded, oldest traces (and their spans) will be purged.
  14. # A safe estimate is 1K of memory per span (each span with 2 annotations + 1 binary annotation), plus
  15. # 100 MB for a safety buffer. You’ll need to verify in your own environment.
  16. # Experimentally, it works with: max-spans of 500000 with JRE argument -Xmx600m.
  17. max- spans: 500000
  18. cassandra:
  19. # 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’.
  20. contact- points: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_CONTACT_POINTS:</span></span>localhost}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># Name of the datacenter that will be considered "local" for latency load balancing. When unset, load-balancing is round-robin.</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> local-<span class="hljs-symbol"><span class="hljs-symbol">dc:</span></span> ${ CASSANDRA_LOCAL_DC:}
  21. # Will throw an exception on startup if authentication fails.
  22. username: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_USERNAME:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">password:</span></span> ${ CASSANDRA_PASSWORD:}
  23. keyspace: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_KEYSPACE:</span></span>zipkin}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># Max pooled connections per datacenter-local host.</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> max-<span class="hljs-symbol"><span class="hljs-symbol">connections:</span></span> ${ CASSANDRA_MAX_CONNECTIONS: 8}
  24. # Ensuring that schema exists, if enabled tries to execute script /zipkin-cassandra-core/resources/cassandra-schema-cql3.txt.
  25. ensure- schema: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_ENSURE_SCHEMA:</span></span><span class="hljs-literal"><span class="hljs-literal">true</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># 7 days in seconds</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> span-<span class="hljs-symbol"><span class="hljs-symbol">ttl:</span></span> ${ CASSANDRA_SPAN_TTL: 604800}
  26. # 3 days in seconds
  27. index- ttl: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_INDEX_TTL:</span></span><span class="hljs-number"><span class="hljs-number">259200</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># the maximum trace index metadata entries to cache</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> index-cache-<span class="hljs-symbol"><span class="hljs-symbol">max:</span></span> ${ CASSANDRA_INDEX_CACHE_MAX: 100000}
  28. # how long to cache index metadata about a trace. 1 minute in seconds
  29. index-cache- ttl: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_INDEX_CACHE_TTL:</span></span><span class="hljs-number"><span class="hljs-number">60</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># how many more index rows to fetch than the user-supplied query limit</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> index-fetch-<span class="hljs-symbol"><span class="hljs-symbol">multiplier:</span></span> ${ CASSANDRA_INDEX_FETCH_MULTIPLIER: 3}
  30. # Using ssl for connection, rely on Keystore
  31. use- ssl: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_USE_SSL:</span></span><span class="hljs-literal"><span class="hljs-literal">false</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">cassandra3:</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># 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'.</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> contact-<span class="hljs-symbol"><span class="hljs-symbol">points:</span></span> ${ CASSANDRA_CONTACT_POINTS:localhost}
  32. # Name of the datacenter that will be considered “local” for latency load balancing. When unset, load-balancing is round-robin.
  33. local- dc: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_LOCAL_DC:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># Will throw an exception on startup if authentication fails.</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="56"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">username:</span></span> ${ CASSANDRA_USERNAME:}
  34. password: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_PASSWORD:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="58"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">keyspace:</span></span> ${ CASSANDRA_KEYSPACE:zipkin2}
  35. # Max pooled connections per datacenter-local host.
  36. max- connections: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_MAX_CONNECTIONS:</span></span><span class="hljs-number"><span class="hljs-number">8</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="61"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># Ensuring that schema exists, if enabled tries to execute script /zipkin2-schema.cql</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="62"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword"><span class="hljs-keyword">ensure</span></span>-<span class="hljs-symbol"><span class="hljs-symbol">schema:</span></span> ${ CASSANDRA_ENSURE_SCHEMA: true}
  37. # how many more index rows to fetch than the user-supplied query limit
  38. index-fetch- multiplier: ${<span class="hljs-symbol"><span class="hljs-symbol">CASSANDRA_INDEX_FETCH_MULTIPLIER:</span></span><span class="hljs-number"><span class="hljs-number">3</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="65"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment"># Using ssl for connection, rely on Keystore</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="66"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> use-<span class="hljs-symbol"><span class="hljs-symbol">ssl:</span></span> ${ CASSANDRA_USE_SSL: false}
  39. elasticsearch:
  40. # host is left unset intentionally, to defer the decision
  41. hosts: ${<span class="hljs-symbol"><span class="hljs-symbol">ES_HOSTS:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="70"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">pipeline:</span></span> ${ ES_PIPELINE:}
  42. max- requests: ${<span class="hljs-symbol"><span class="hljs-symbol">ES_MAX_REQUESTS:</span></span><span class="hljs-number"><span class="hljs-number">64</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="72"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">timeout:</span></span> ${ ES_TIMEOUT: 10000}
  43. index: ${<span class="hljs-symbol"><span class="hljs-symbol">ES_INDEX:</span></span>zipkin}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="74"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> date-<span class="hljs-symbol"><span class="hljs-symbol">separator:</span></span> ${ ES_DATE_SEPARATOR:-}
  44. index- shards: ${<span class="hljs-symbol"><span class="hljs-symbol">ES_INDEX_SHARDS:</span></span><span class="hljs-number"><span class="hljs-number">5</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="76"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> index-<span class="hljs-symbol"><span class="hljs-symbol">replicas:</span></span> ${ ES_INDEX_REPLICAS: 1}
  45. username: ${<span class="hljs-symbol"><span class="hljs-symbol">ES_USERNAME:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="78"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">password:</span></span> ${ ES_PASSWORD:}
  46. http- logging: ${<span class="hljs-symbol"><span class="hljs-symbol">ES_HTTP_LOGGING:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="80"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> legacy-reads-<span class="hljs-symbol"><span class="hljs-symbol">enabled:</span></span> ${ ES_LEGACY_READS_ENABLED: true}
  47. mysql:
  48. host: ${<span class="hljs-symbol"><span class="hljs-symbol">MYSQL_HOST:</span></span>localhost}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="83"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">port:</span></span> ${ MYSQL_TCP_PORT: 3306}
  49. username: ${<span class="hljs-symbol"><span class="hljs-symbol">MYSQL_USER:</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="85"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">password:</span></span> ${ MYSQL_PASS:}
  50. db: ${<span class="hljs-symbol"><span class="hljs-symbol">MYSQL_DB:</span></span>zipkin}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="87"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> max-<span class="hljs-symbol"><span class="hljs-symbol">active:</span></span> ${ MYSQL_MAX_CONNECTIONS: 10}
  51. use- ssl: ${<span class="hljs-symbol"><span class="hljs-symbol">MYSQL_USE_SSL:</span></span><span class="hljs-literal"><span class="hljs-literal">false</span></span>}</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="89"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">ui:</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="90"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-symbol"><span class="hljs-symbol">enabled:</span></span> ${ QUERY_ENABLED: true}
  52. ## Values below here are mapped to ZipkinUiProperties, served as /config.json
  53. # Default limit for Find Traces
  54. query- limit: 10
  55. # The value here becomes a label in the top-right corner
  56. environment:
  57. # Default duration to look back when finding traces.
  58. # Affects the “Start time” element in the UI. 1 hour in millis
  59. default- lookback: 3600000
  60. # When false, disables the “find a trace” screen
  61. search- enabled: ${ SEARCH_ENABLED: true}
  62. # Which sites this Zipkin UI covers. Regex syntax. (e.g. http:\/\/example.com\/.*)
  63. # Multiple sites can be specified, e.g.
  64. # - .*example1.com
  65. # - .*example2.com
  66. # Default is “match all websites”
  67. instrumented: .*
  68. # URL placed into the <base> tag in the HTML
  69. base- path: /zipkin

从它的配置文件可以看出,storage 默认采用的是内存存储,所以我们要设置 zipkin.storage.type=mysql,除此之外还要设置 zipkin.storage.mysql.host、port、username、password、db 等

下面贴出我的启动命令:


  
  
  1. java -jar zipkin.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.storage.type=mysql
  2. --zipkin.storage.mysql.host=localhost --zipkin.storage.mysql.port=3306 --zipkin.storage.mysql.username=root
  3. --zipkin.storage.mysql.password=mysql --zipkin.storage.mysql.db=zipkin

大家可以根据自己的数据库信息,修改相关配置即可

(三)验证

至于 Zipkin Client 端,是不需要相关修改的,按照上面命令启动 zipkin 后,访问 http://localhost:8481/service1,查看数据库信息,表 zipkin_annotations 和表 zipkin_spans 中已经数据存储了

表 zipkin_annotations :


表 zipkin_spans :


表中所存储的信息我们已经非常熟悉,之前分析的内容都可以在这两张表中体现出来。

从 GitHub 的官方配置文件中,我们可以看到,Zipkin 在存储方面除了对 Mysql 有扩展组件之外,还实现了对 CassCassandra 和 ElasElasticSearch 的支持扩展,具体的整合方式与 Mysql 的整合类似。


源码下载:https://github.com/shmilyah/spring-cloud-componets

转载自:https://blog.csdn.net/hubo_88/article/details/80890461
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值