# SpringCloud使用问题汇总

SpringCloud使用问题汇总：

1.当feign调用复杂的服务接口时，报错

@PostMapping("/jobPosition/listJobPositionByPage")

List<MiniJobPositionVO> listJobPositionByPage(@RequestParam(value = "posName") String posName,@RequestParam(value = "jobTypeId") String jobTypeId, @RequestBody PageBean pageBean);

当调用该接口时，posName或jobTypeId传递为null时报错400 bad request，提示需要string parameter

解决方案：给参数设置required = false

2.集成zipkin时配置正确，zipkin-server却收不到调用信息

通过HTTP使用基于Zipkin的Sleuth时，如果框架集成了rabbitmq，默认会按rabbitmq的异步方式发送调用链信息，默认的以http同步方式发送调用链信息就不会生效，注释rabbitmq配置后，发送成功。

3.rabbitmq的异步方式发送调用链信息

①加入maven依赖

②配置rabbitmq连接信息

③rabbitmq控制台创建zipkin队列

④启动zipkin-server

java -jar D:\software\zipkin-server-2.10.1-exec.jar --zipkin.collector.rabbitmq.addresses=192.168.99.100:5673 --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=test --zipkin.collector.rabbitmq.useSsl=false --zipkin.collector.rabbitmq.virtual-host=/ --zipkin.collector.rabbitmq.queue=zipkin

⑤docker 方式启动

docker run -d -p 9411:9411 --env RABBIT_ADDRESSES=192.168.99.100:5673 --env RABBIT_USER=guest --env RABBIT_P

ASSWORD=test --env RABBIT_USE_SSL=false --env RABBIT_VIRTUAL_HOST=/ --env RABBIT_QUEUE=zipkin openzipkin/zipkin

⑥zipkin所有属性

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:
| 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 the <base> tag 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: "@project.version@"
| 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