2021年2月13日星期六

SpringBoot进阶教程(七十)SkyWalking

请叫我头头哥流行的APM(Application Performance Management工具有很多,比如Cat、Zipkin、Pinpoint、SkyWalking,优秀的监控工具还有很多,其它比如还有zabbix、prometheus、Arthas、Grafana之类的。这里主要介绍SkyWalking,它是一款优秀的国产APM工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。Skywalking是一个分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

流行的APM(Application Performance Management工具有很多,比如Cat、Zipkin、Pinpoint、SkyWalking。优秀的监控工具还有很多,其它比如还有zabbix、prometheus、Arthas、Grafana之类的。这里主要介绍SkyWalking,它是一款优秀的国产APM工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。

Skywalking是一个分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。支持Java, .Net Core, PHP, NodeJS, Golang, LUA语言探针,支持Envoy + Istio构建的Service Mesh。


v介绍

1.1 SkyWalking 在逻辑上分为四部分:探针、平台后端、存储和用户界面。其架构图如下:

SpringBoot进阶教程(七十)SkyWalking

图片来源于网络,侵删。

探针:基于不同的来源探针可能是不一样的,但作用都是收集数据,将数据格式化为SkyWalking适用的格式。例如在Java中则是做字节码植入,无侵入式的收集,并通过HTTP或者GRPC方式发送数据到平台后端.

平台后端:是一个支持集群模式运行的后台,用于数据聚合、数据分析以及驱动数据流从探针到用户界面的流程。平台后端还提供了各种可插拔的能力,如不同来源数据(如来自 Zipkin)格式化,不同存储系统以及集群管理。你甚至还可以使用观测分析语言来进行自定义聚合分析。

存储:是开放式的,可以选择一个既有的存储系统,如ElasticSearch、H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统。

用户界面:SkyWalking的可视化界面,UI非常炫酷且强大,同样它也是可定制以匹配你已存在的后端的。

1.2 在SkyWalking中也存在服务、服务实例及端点概念,因为SkyWalking就是提供了这些概念的观测能力:

服务(Service):表示对请求提供相同行为的一系列或一组工作负载。在使用打点代理或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用你在平台上定义的名字,如 Istio。

服务实例(Service Instance):上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样,服务实例未必就是操作系统上的一个进程。但当你在使用打点代理的时候, 一个服务实例实际就是操作系统上的一个真实进程。

端点(Endpoint):对于特定服务所接收的请求路径,如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名

1.3 SkyWalking的优势如下:

1.多种监控手段,语言探针和服务网格(Service Mesh)

2.模块化,UI、存储、集群管理多种机制可选

3.支持告警(告警可以推送到钉钉)

4.优秀的可视化方案

v环境准备

2.1 拉取镜像

docker pull elasticsearch:7.5.1docker pull apache/skywalking-oap-server:8.3.0-es7docker pull apache/skywalking-ui:8.3.0

2.2 创建&启动elasticsearch

docker run -d --name=es7 \-p 9200:9200 -p 9300:9300 \-e "discovery.type=single-node" elasticsearch:7.5.1

注意:若创建es持久化目录,则按下面的命令执行。

mkdir -p /data/elasticsearchdocker cp es7:/usr/share/elasticsearch/data /data/elasticsearch/docker cp es7:/usr/share/elasticsearch/logs /data/elasticsearch/docker rm -f es7docker run -d --name=es7 \ --restart=always \ -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -v /data/elasticsearch/data:/usr/share/elasticsearch/data \ -v /data/elasticsearch/logs:/usr/share/elasticsearch/logs \elasticsearch:7.5.1

2.3 创建&启动OAP

docker run --name oap --restart always -d \--restart=always \-e TZ=Asia/Shanghai \-p 12800:12800 \-p 11800:11800 \--link es7:es7 \-e SW_STORAGE=elasticsearch7 \-e SW_STORAGE_ES_CLUSTER_NODES=es7:9200 \apache/skywalking-oap-server:8.3.0-es7

SW_STORAGE:表示选择elasticsearch7作为存储组件

SW_STORAGE_ES_CLUSTER_NODES:elasticsearch的节点,多个用逗号隔开

以上参数均为application.yml文件中的参数。

application.yml详细信息如下:

# Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements. See the NOTICE file distributed with# this work for additional information regarding copyright ownership.# The ASF licenses this file to You under the Apache License, Version 2.0# (the "License"); you may not use this file except in compliance with# the License. You may obtain a copy of the License at##  Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.cluster: selector: ${SW_CLUSTER:standalone} standalone: # Please check your ZooKeeper is 3.5+, However, it is also compatible with ZooKeeper 3.4.x. Replace the ZooKeeper 3.5+ # library the oap-libs folder with your ZooKeeper 3.4.x library. zookeeper: nameSpace: ${SW_NAMESPACE:""} hostPort: ${SW_CLUSTER_ZK_HOST_PORT:localhost:2181} # Retry Policy baseSleepTimeMs: ${SW_CLUSTER_ZK_SLEEP_TIME:1000} # initial amount of time to wait between retries maxRetries: ${SW_CLUSTER_ZK_MAX_RETRIES:3} # max number of times to retry # Enable ACL enableACL: ${SW_ZK_ENABLE_ACL:false} # disable ACL in default schema: ${SW_ZK_SCHEMA:digest} # only support digest schema expression: ${SW_ZK_EXPRESSION:skywalking:skywalking} kubernetes: namespace: ${SW_CLUSTER_K8S_NAMESPACE:default} labelSelector: ${SW_CLUSTER_K8S_LABEL:app=collector,release=skywalking} uidEnvName: ${SW_CLUSTER_K8S_UID:SKYWALKING_COLLECTOR_UID} consul: serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # Consul cluster nodes, example: 10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500 hostPort: ${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500} aclToken: ${SW_CLUSTER_CONSUL_ACLTOKEN:""} etcd: serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # etcd cluster nodes, example: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 hostPort: ${SW_CLUSTER_ETCD_HOST_PORT:localhost:2379} nacos: serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848} # Nacos Configuration namespace namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"} # Nacos auth username username: ${SW_CLUSTER_NACOS_USERNAME:""} password: ${SW_CLUSTER_NACOS_PASSWORD:""} # Nacos auth accessKey accessKey: ${SW_CLUSTER_NACOS_ACCESSKEY:""} secretKey: ${SW_CLUSTER_NACOS_SECRETKEY:""}core: selector: ${SW_CORE:default} default: # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate # Receiver: Receive agent data, Level 1 aggregate # Aggregator: Level 2 aggregate role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator restHost: ${SW_CORE_REST_HOST:0.0.0.0} restPort: ${SW_CORE_REST_PORT:12800} restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/} restMinThreads: ${SW_CORE_REST_JETTY_MIN_THREADS:1} restMaxThreads: ${SW_CORE_REST_JETTY_MAX_THREADS:200} restIdleTimeOut: ${SW_CORE_REST_JETTY_IDLE_TIMEOUT:30000} restAcceptorPriorityDelta: ${SW_CORE_REST_JETTY_DELTA:0} restAcceptQueueSize: ${SW_CORE_REST_JETTY_QUEUE_SIZE:0} gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0} gRPCPort: ${SW_CORE_GRPC_PORT:11800} maxConcurrentCallsPerConnection: ${SW_CORE_GRPC_MAX_CONCURRENT_CALL:0} maxMessageSize: ${SW_CORE_GRPC_MAX_MESSAGE_SIZE:0} gRPCThreadPoolQueueSize: ${SW_CORE_GRPC_POOL_QUEUE_SIZE:-1} gRPCThreadPoolSize: ${SW_CORE_GRPC_THREAD_POOL_SIZE:-1} gRPCSslEnabled: ${SW_CORE_GRPC_SSL_ENABLED:false} gRPCSslKeyPath: ${SW_CORE_GRPC_SSL_KEY_PATH:""} gRPCSslCertChainPath: ${SW_CORE_GRPC_SSL_CERT_CHAIN_PATH:""} gRPCSslTrustedCAPath: ${SW_CORE_GRPC_SSL_TRUSTED_CA_PATH:""} downsampling:  - Hour  - Day # Set a timeout on metrics data. After the timeout has expired, the metrics data will automatically be deleted. enableDataKeeperExecutor: ${SW_CORE_ENABLE_DATA_KEEPER_EXECUTOR:true} # Turn it off then automatically metrics data delete will be close. dataKeeperExecutePeriod: ${SW_CORE_DATA_KEEPER_EXECUTE_PERIOD:5} # How often the data keeper executor runs periodically, unit is minute recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # Unit is day metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7} # Unit is day # Cache metrics data for 1 minute to reduce database queries, and if the OAP cluster changes within that minute, # the metrics may not be accurate within that minute. enableDatabaseSession: ${SW_CORE_ENABLE_DATABASE_SESSION:true} topNReportPeriod: ${SW_CORE_TOPN_REPORT_PERIOD:10} # top_n record worker report cycle, unit is minute # Extra model column are the column defined by in the codes, These columns of model are not required logically in aggregation or further query, # and it will cause more load for memory, network of OAP and storage. # But, being activated, user could see the name in the storage entities, which make users easier to use 3rd party tool, such as Kibana->ES, to query the data by themselves. activeExtraModelColumns: ${SW_CORE_ACTIVE_EXTRA_MODEL_COLUMNS:false} # The max length of service + instance names should be less than 200 serviceNameMaxLength: ${SW_SERVICE_NAME_MAX_LENGTH:70} instanceNameMaxLength: ${SW_INSTANCE_NAME_MAX_LENGTH:70} # The max length of service + endpoint names should be less than 240 endpointNameMaxLength: ${SW_ENDPOINT_NAME_MAX_LENGTH:150} # Define the set of span tag keys, which should be searchable through the GraphQL. searchableTracesTags: ${SW_SEARCHABLE_TAG_KEYS:http.method,status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker}storage: selector: ${SW_STORAGE:h2} elasticsearch: nameSpace: ${SW_NAMESPACE:""} clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} user: ${SW_ES_USER:""} password: ${SW_ES_PASSWORD:""} trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""} trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""} secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool. dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index. indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # Shard number of new indexes indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # Replicas number of new indexes # Super data set has been defined in the codes, such as trace segments.The following 3 config would be improve es performance when storage super size data in es. superDatasetDayStep: ${SW_SUPERDATASET_STORAGE_DAY_STEP:-1} # Represent the number of days in the super size dataset record index, the default value is the same as dayStep when the value is less than 0 superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces. superDatasetIndexReplicasNumber: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_REPLICAS_NUMBER:0} # Represent the replicas number in the super size dataset record index, the default value is 0. bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the async bulk record data every ${SW_STORAGE_ES_BULK_ACTIONS} requests syncBulkActions: ${SW_STORAGE_ES_SYNC_BULK_ACTIONS:50000} # Execute the sync bulk metrics data every ${SW_STORAGE_ES_SYNC_BULK_ACTIONS} requests flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000} metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200} profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200} advanced: ${SW_STORAGE_ES_ADVANCED:""} elasticsearch7: nameSpace: ${SW_NAMESPACE:""} clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""} trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""} dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index. indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # Shard number of new indexes indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # Replicas number of new indexes # Super data set has been defined in the codes, such as trace segments.The following 3 config would be improve es performance when storage super size data in es. superDatasetDayStep: ${SW_SUPERDATASET_STORAGE_DAY_STEP:-1} # Represent the number of days in the super size dataset record index, the default value is the same as dayStep when the value is less than 0 superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces. superDatasetIndexReplicasNumber: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_REPLICAS_NUMBER:0} # Represent the replicas number in the super size dataset record index, the default value is 0. user: ${SW_ES_USER:""} password: ${SW_ES_PASSWORD:""} secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool. bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the async bulk record data every ${SW_STORAGE_ES_BULK_ACTIONS} requests syncBulkActions: ${SW_STORAGE_ES_SYNC_BULK_ACTIONS:50000} # Execute the sync bulk metrics data every ${SW_STORAGE_ES_SYNC_BULK_ACTIONS} requests flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000} metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200} profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200} advanced: ${SW_STORAGE_ES_ADVANCED:""} h2: driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource} url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db} user: ${SW_STORAGE_H2_USER:sa} metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000} maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20} numOfSearchableValuesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2} mysql: properties:  jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest"}  dataSource.user: ${SW_DATA_SOURCE_USER:root}  dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@1234}  dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}  dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}  dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}  dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true} metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000} maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20} numOfSearchableValuesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2} tidb: properties:  jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:4000/tidbswtest"}  dataSource.user: ${SW_DATA_SOURCE_USER:root}  dataSource.password: ${SW_DATA_SOURCE_PASSWORD:""}  dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}  dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}  dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}  dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}  dataSource.useAffectedRows: ${SW_DATA_SOURCE_USE_AFFECTED_ROWS:true} metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000} maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20} numOfSearchableValuesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2} influxdb: # InfluxDB configuration url: ${SW_STORAGE_INFLUXDB_URL user: ${SW_STORAGE_INFLUXDB_USER:root} password: ${SW_STORAGE_INFLUXDB_PASSWORD:} database: ${SW_STORAGE_INFLUXDB_DATABASE:skywalking} actions: ${SW_STORAGE_INFLUXDB_ACTIONS:1000} # the number of actions to collect duration: ${SW_STORAGE_INFLUXDB_DURATION:1000} # the time to wait at most (milliseconds) batchEnabled: ${SW_STORAGE_INFLUXDB_BATCH_ENABLED:true} fetchTaskLogMaxSize: ${SW_STORAGE_INFLUXDB_FETCH_TASK_LOG_MAX_SIZE:5000} # the max number of fetch task log in a requestagent-analyzer: selector: ${SW_AGENT_ANALYZER:default} default: sampleRate: ${SW_TRACE_SAMPLE_RATE:10000} # The sample rate precision is 1/10000. 10000 means 100% sample in default. slowDBAccessThreshold: ${SW_SLOW_DB_THRESHOLD:default:200,mongodb:100} # The slow database access thresholds. Unit ms. forceSampleErrorSegment: ${SW_FORCE_SAMPLE_ERROR_SEGMENT:true} # When sampling mechanism active, this config can open(true) force save some error segment. true is default. segmentStatusAnalysisStrategy: ${SW_SEGMENT_STATUS_ANALYSIS_STRATEGY:FROM_SPAN_STATUS} # Determine the final segment status from the status of spans. Available values are `FROM_SPAN_STATUS` , `FROM_ENTRY_SPAN` and `FROM_FIRST_SPAN`. `FROM_SPAN_STATUS` represents the segment status would be error if any span is in error status. `FROM_ENTRY_SPAN` means the segment status would be determined by the status of entry spans only. `FROM_FIRST_SPAN` means the segment status would be determined by the status of the first span only. # Nginx and Envoy agents can't get the real remote address. # Exit spans with the component in the list would not generate the client-side instance relation metrics. noUpstreamRealAddressAgents: ${SW_NO_UPSTREAM_REAL_ADDRESS:6000,9000} slowTraceSegmentThreshold: ${SW_SLOW_TRACE_SEGMENT_THRESHOLD:-1} # Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond. meterAnalyzerActiveFiles: ${SW_METER_ANALYZER_ACTIVE_FILES:} # Which files could be meter analyzed, files split by ","receiver-sharing-server: selector: ${SW_RECEIVER_SHARING_SERVER:default} default: # For Jetty server restHost: ${SW_RECEIVER_SHARING_REST_HOST:0.0.0.0} restPort: ${SW_RECEIVER_SHARING_REST_PORT:0} contextPath: ${SW_RECEIVER_SHARING_REST_CONTEXT_PATH:/} restMinThreads: ${SW_RECEIVER_SHARING_JETTY_MIN_THREADS:1} restMaxThreads: ${SW_RECEIVER_SHARING_JETTY_MAX_THREADS:200} restIdleTimeOut: ${SW_RECEIVER_SHARING_JETTY_IDLE_TIMEOUT:30000} restAcceptorPriorityDelta: ${SW_RECEIVER_SHARING_JETTY_DELTA:0} restAcceptQueueSize: ${SW_RECEIVER_SHARING_JETTY_QUEUE_SIZE:0} # For gRPC server gRPCHost: ${SW_RECEIVER_GRPC_HOST:0.0.0.0} gRPCPort: ${SW_RECEIVER_GRPC_PORT:0} maxConcurrentCallsPerConnection: ${SW_RECEIVER_GRPC_MAX_CONCURRENT_CALL:0} maxMessageSize: ${SW_RECEIVER_GRPC_MAX_MESSAGE_SIZE:0} gRPCThreadPoolQueueSize: ${SW_RECEIVER_GRPC_POOL_QUEUE_SIZE:0} gRPCThreadPoolSize: ${SW_RECEIVER_GRPC_THREAD_POOL_SIZE:0} gRPCSslEnabled: ${SW_RECEIVER_GRPC_SSL_ENABLED:false} gRPCSslKeyPath: ${SW_RECEIVER_GRPC_SSL_KEY_PATH:""} gRPCSslCertChainPath: ${SW_RECEIVER_GRPC_SSL_CERT_CHAIN_PATH:""} authentication: ${SW_AUTHENTICATION:""}receiver-register: selector: ${SW_RECEIVER_REGISTER:default} default:receiver-trace: selector: ${SW_RECEIVER_TRACE:default} default:receiver-jvm: selector: ${SW_RECEIVER_JVM:default} default:receiver-clr: selector: ${SW_RECEIVER_CLR:default} default:receiver-profile: selector: ${SW_RECEIVER_PROFILE:default} default:service-mesh: selector: ${SW_SERVICE_MESH:default} default:envoy-metric: selector: ${SW_ENVOY_METRIC:default} default: acceptMetricsService: ${SW_ENVOY_METRIC_SERVICE:true} alsHTTPAnalysis: ${SW_ENVOY_METRIC_ALS_HTTP_ANALYSIS:""} # `k8sServiceNameRule` allows you to customize the service name in ALS via Kubernetes metadata, # the available variables are `pod`, `service`, f.e., you can use `${service.metadata.name}-${pod.metadata.labels.version}` # to append the version number to the service name. # Be careful, when using environment variables to pass this configuration, use single quotes(`''`) to avoid it being evaluated by the shell. k8sServiceNameRule: ${K8S_SERVICE_NAME_RULE:"${service.metadata.name}"}prometheus-fetcher: selector: ${SW_PROMETHEUS_FETCHER:-} default: enabledRules: ${SW_PROMETHEUS_FETCHER_ENABLED_RULES:"self"}kafka-fetcher: selector: ${SW_KAFKA_FETCHER:-} default: bootstrapServers: ${SW_KAFKA_FETCHER_SERVERS:localhost:9092} partitions: ${SW_KAFKA_FETCHER_PARTITIONS:3} replicationFactor: ${SW_KAFKA_FETCHER_PARTITIONS_FACTOR:2} enableMeterSystem: ${SW_KAFKA_FETCHER_ENABLE_METER_SYSTEM:false} isSharding: ${SW_KAFKA_FETCHER_IS_SHARDING:false} consumePartitions: ${SW_KAFKA_FETCHER_CONSUME_PARTITIONS:""} kafkaHandlerThreadPoolSize: ${SW_KAFKA_HANDLER_THREAD_POOL_SIZE:-1} kafkaHandlerThreadPoolQueueSize: ${SW_KAFKA_HANDLER_THREAD_POOL_QUEUE_SIZE:-1}receiver-meter: selector: ${SW_RECEIVER_METER:default} default:receiver-otel: selector: ${SW_OTEL_RECEIVER:-} default: enabledHandlers: ${SW_OTEL_RECEIVER_ENABLED_HANDLERS:"oc"} enabledOcRules: ${SW_OTEL_RECEIVER_ENABLED_OC_RULES:"istio-controlplane"}receiver_zipkin: selector: ${SW_RECEIVER_ZIPKIN:-} default: host: ${SW_RECEIVER_ZIPKIN_HOST:0.0.0.0} port: ${SW_RECEIVER_ZIPKIN_PORT:9411} contextPath: ${SW_RECEIVER_ZIPKIN_CONTEXT_PATH:/} jettyMinThreads: ${SW_RECEIVER_ZIPKIN_JETTY_MIN_THREADS:1} jettyMaxThreads: ${SW_RECEIVER_ZIPKIN_JETTY_MAX_THREADS:200} jettyIdleTimeOut: ${SW_RECEIVER_ZIPKIN_JETTY_IDLE_TIMEOUT:30000} jettyAcceptorPriorityDelta: ${SW_RECEIVER_ZIPKIN_JETTY_DELTA:0} jettyAcceptQueueSize: ${SW_RECEIVER_ZIPKIN_QUEUE_SIZE:0}receiver_jaeger: selector: ${SW_RECEIVER_JAEGER:-} default: gRPCHost: ${SW_RECEIVER_JAEGER_HOST:0.0.0.0} gRPCPort: ${SW_RECEIVER_JAEGER_PORT:14250}receiver-browser: selector: ${SW_RECEIVER_BROWSER:default} default: # The sample rate precision is 1/10000. 10000 means 100% sample in default. sampleRate: ${SW_RECEIVER_BROWSER_SAMPLE_RATE:10000}query: selector: ${SW_QUERY:graphql} graphql: path: ${SW_QUERY_GRAPHQL_PATH:/graphql}alarm: selector: ${SW_ALARM:default} default:telemetry: selector: ${SW_TELEMETRY:none} none: prometheus: host: ${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0} port: ${SW_TELEMETRY_PROMETHEUS_PORT:1234} sslEnabled: ${SW_TELEMETRY_PROMETHEUS_SSL_ENABLED:false} sslKeyPath: ${SW_TELEMETRY_PROMETHEUS_SSL_KEY_PATH:""} sslCertChainPath: ${SW_TELEMETRY_PROMETHEUS_SSL_CERT_CHAIN_PATH:""}configuration: selector: ${SW_CONFIGURATION:none} none: grpc: host: ${SW_DCS_SERVER_HOST:""} port: ${SW_DCS_SERVER_PORT:80} clusterName: ${SW_DCS_CLUSTER_NAME:SkyWalking} period: ${SW_DCS_PERIOD:20} apollo: apolloMeta: ${SW_CONFIG_APOLLO apolloCluster: ${SW_CONFIG_APOLLO_CLUSTER:default} apolloEnv: ${SW_CONFIG_APOLLO_ENV:""} appId: ${SW_CONFIG_APOLLO_APP_ID:skywalking} period: ${SW_CONFIG_APOLLO_PERIOD:5} zookeeper: period: ${SW_CONFIG_ZK_PERIOD:60} # Unit seconds, sync period. Default fetch every 60 seconds. nameSpace: ${SW_CONFIG_ZK_NAMESPACE:/default} hostPort: ${SW_CONFIG_ZK_HOST_PORT:localhost:2181} # Retry Policy baseSleepTimeMs: ${SW_CONFIG_ZK_BASE_SLEEP_TIME_MS:1000} # initial amount of time to wait between retries maxRetries: ${SW_CONFIG_ZK_MAX_RETRIES:3} # max number of times to retry etcd: period: ${SW_CONFIG_ETCD_PERIOD:60} # Unit seconds, sync period. Default fetch every 60 seconds. group: ${SW_CONFIG_ETCD_GROUP:skywalking} serverAddr: ${SW_CONFIG_ETCD_SERVER_ADDR:localhost:2379} clusterName: ${SW_CONFIG_ETCD_CLUSTER_NAME:default} consul: # Consul host and ports, separated by comma, e.g. 1.2.3.4:8500,2.3.4.5:8500 hostAndPorts: ${SW_CONFIG_CONSUL_HOST_AND_PORTS:1.2.3.4:8500} # Sync period in seconds. Defaults to 60 seconds. period: ${SW_CONFIG_CONSUL_PERIOD:60} # Consul aclToken aclToken: ${SW_CONFIG_CONSUL_ACL_TOKEN:""} k8s-configmap: period: ${SW_CONFIG_CONFIGMAP_PERIOD:60} namespace: ${SW_CLUSTER_K8S_NAMESPACE:default} labelSelector: ${SW_CLUSTER_K8S_LABEL:app=collector,release=skywalking} nacos: # Nacos Server Host serverAddr: ${SW_CONFIG_NACOS_SERVER_ADDR:127.0.0.1} # Nacos Server Port port: ${SW_CONFIG_NACOS_SERVER_PORT:8848} # Nacos Configuration Group group: ${SW_CONFIG_NACOS_SERVER_GROUP:skywalking} # Nacos Configuration namespace namespace: ${SW_CONFIG_NACOS_SERVER_NAMESPACE:} # Unit seconds, sync period. Default fetch every 60 seconds. period: ${SW_CONFIG_NACOS_PERIOD:60} # Nacos auth username username: ${SW_CONFIG_NACOS_USERNAME:""} password: ${SW_CONFIG_NACOS_PASSWORD:""} # Nacos auth accessKey accessKey: ${SW_CONFIG_NACOS_ACCESSKEY:""} secretKey: ${SW_CONFIG_NACOS_SECRETKEY:""}exporter: selector: ${SW_EXPORTER:-} grpc: targetHost: ${SW_EXPORTER_GRPC_HOST:127.0.0.1} targetPort: ${SW_EXPORTER_GRPC_PORT:9870}health-checker: selector: ${SW_HEALTH_CHECKER:-} default: checkIntervalSeconds: ${SW_HEALTH_CHECKER_INTERVAL_SECONDS:5}

View Code

2.4 创建&启动UI

docker run -d --name skywalking-ui \--restart=always \-e TZ=Asia/Shanghai \-p 8101:8080 \--link oap:oap \-e SW_OAP_ADDRESS=oap:12800 \apache/skywalking-ui:8.3.0

2.5 下载源码包

wget https://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/8.3.0/apache-skywalking-apm-8.3.0.tar.gz

官网的源码包下载比较慢,就换成tuna的了。下载好了之后,解压在/opt目录下,暂时不用管,这个在后面会用到agent。

v部署/接入SkyWalking

3.1 生成springboot JAR包

若生成springbootJAR包有疑惑的,可以看看这篇文章。SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

3.2 启动JAR包

nohup java -javaagent:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=toutou_blog -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar /data/package/learn-web-0.0.1-SNAPSHOT.jar -d --server.port=8100 &

-javaagent:用于指定探针路径。指定agent包位置。在上面的步骤中已经将apache-skywalking-apm-8.3.0.tar.gz解压到/opt目录了,因此路径为:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar

-Dskywalking.agent.service_name:用于重写 agent/config/agent.config 配置文件中的服务名

-Dskywalking.collector.backend_service:用于重写agent/config/agent.config 配置文件中的服务地址

3.3 访问UI

第一次访问时,需要先调用springboot中的接口后,SkyWalking UI中即会load对应的信息,效果如下图。

SpringBoot进阶教程(七十)SkyWalking

拓扑图/topology:

SpringBoot进阶教程(七十)SkyWalking

追踪/trace:

SpringBoot进阶教程(七十)SkyWalking

关于更多SkyWalking UI介绍,可以看看官方介绍。

其他参考/学习资料:

  • Apache SkyWalking 官方文档
  • SkyWalking中文博客
  • SkyWalking 文档中文版(社区提供)

v源码地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:请叫我头头哥
出  处
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!










原文转载:http://www.shaoqun.com/a/552573.html

跨境电商:https://www.ikjzd.com/

damai:https://www.ikjzd.com/w/1391

斑马物联网:https://www.ikjzd.com/w/1316


流行的APM(ApplicationPerformanceManagement工具有很多,比如Cat、Zipkin、Pinpoint、SkyWalking,优秀的监控工具还有很多,其它比如还有zabbix、prometheus、Arthas、Grafana之类的。这里主要介绍SkyWalking,它是一款优秀的国产APM工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。Skywalkin
ishare:ishare
邮乐购物商城:邮乐购物商城
做亚马逊如何提升产品利润?:做亚马逊如何提升产品利润?
这么多卖家不知道去哪找货源?这些优质渠道都可以!:这么多卖家不知道去哪找货源?这些优质渠道都可以!
亚马逊Lisiting重大更新-QA可以插入视频:亚马逊Lisiting重大更新-QA可以插入视频

Redis-第八章节-应用场景

目录

  • 概述
  • 详解

1、概述

Redis支持五种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)。

2、详解

1、String(字符串)

定义: String 是 redis 最基本的类型,一个 key 对应一个 value。String 类型是二进制安全的。因为 string 底层的实现是简单动态字符串 sds,是可以修改字符串。

应用场景: 单值缓存、对象缓存、分布式锁、常规计数(粉丝数量、评论数量)、分布式session共享、分布式全局序列号。

具体实现:
单值缓存:

 set key value get key

对象缓存:

 set user:1 value(json格式数据) mset user:1:name tsingli user:1:balance 1888 mget user:1:name user:1:balance

常规计数器:

 incr article:readcount:{文章id} get article:readcount:{文章id}

分布式系统全局序列号:

 incrby orderid 1000 # redis批量生成序列号提升性能

分布式锁:

 # 相关操作 线程1: setnx product:1001 true # 返回1代表获取锁成功 线程2: setnx product:1001 true # 返回0代表获取锁失败 。。。执行业务操作 del product:1001    # 执行完业务释放锁 set product:1001 true ex 10 nx # 防止程序意外终止导致死锁 # 案例 setnx product:1001 true   1.查询商品1001的库存   2.减库存   3.重新把减完剩余的库存更新回数据库 del product:1001

setnx 如果插入的key一样不会对数据有任何操作,如果第二次对库存再进行减对的话就返回错误。

2、Hash(哈希)

定义: Hash是一个键值对集合。他相当于java中的双重map。<key,<filed,value>>。
应用场景: 购物车。
具体实现:
购物车:

 # 说明: # 用户id为1001,商品的编码是10088。 # 用户id为key,商品id为field,商品数量为value。  # 案例:  # 添加商品:  hset cart:1001 10088 1  # 增加数量:  hincrby cart:1001 10088 1  # 商品总数:  hlen cart:1001  # 删除商品:  hdel cart:1001 10088  # 获取购物车所有商品:  hgetall cart:1001

3、List(列表)

定义: 列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素在列表的头部或者尾部。
应用场景: Stack(栈)= LPUSH + LPOP -> FILO //先进后出Queue(队列)= LPUSH + RPOP //先进先出Blocking MQ(阻塞队列)= LPUSH + BRPOP //消息队列微博微信公众号消息流
具体实现:
微博和微信公众号消息流:

 # 李雷发微博,消息id为10018  lpush msg:111111 10018 # 韩梅梅车发微博,消息id为10086  lpush msg:111111 10086 # 查看最新微博消息  lrange msg:11111 0 5 //0至5条微博消息。

4、Set(集合)

定义: Set 是 string 类型的无序集合。
应用场景: 微信抽奖小程序、微信微博点赞、收藏、标签、关注模型,就是可能认识的人的关系。
具体实现:
微信抽奖:

 # 点击参与抽奖加入集合  sadd key {userId} # 查看参与抽奖的所有用户  smembers key # 抽取count名中奖者(1) // srandmember不会将元素从集合中删除  srandmember key [count] //抽取两名中奖者 srandmember act:1008 2 # 抽取count名中奖者(2) // SPOP会将元素从集合中删除  spop key 2

微信微博点赞、收藏、标签:

 # 点赞 sadd like:{消息ID} {用户id} # 取消点赞 srem like:{消息ID} {用户id} # 检查用户是否点过赞 sismember like:{消息ID} {用户id} # 获取点赞的用户列表 smembers like:{消息ID} # 获取点赞的用户树 scard like:{消息ID}

5、Zset(有序集合)

定义: zset和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个dobule类型的分数,redis正是通过分数为集合成员进行从小到大的排序,zset的成员是唯一的但是分数可以重复。









原文转载:http://www.shaoqun.com/a/552572.html

跨境电商:https://www.ikjzd.com/

易佰:https://www.ikjzd.com/w/1482

outfit:https://www.ikjzd.com/w/938


目录概述详解1、概述Redis支持五种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)。2、详解1、String(字符串)定义:String是redis最基本的类型,一个key对应一个value。String类型是二进制安全的。因为string底层的实现是简单动态字符串sds,是可以修改字符串。应用场景:单值缓存、对象缓存、分布式锁、常规计
亿恩网:亿恩网
cicpa:cicpa
亚马逊 AZ索赔那些事,你知多少?:亚马逊 AZ索赔那些事,你知多少?
黑五来袭!买家下单前务必要认真做的2件事!:黑五来袭!买家下单前务必要认真做的2件事!
oberlo:oberlo

湖人冲击7连胜!大黑马遇强敌,字母哥送詹姆斯重返西部第一_比赛

原标题:湖人冲击7连胜!大黑马遇强敌,字母哥送詹姆斯重返西部第一

NBA为球迷们准备了12场精彩的比赛,有两场备受球迷们关注的焦点之战。这两场比赛关系着西部第一的归属,分别是雄鹿挑战爵士和湖人迎战灰熊。目前,湖人的状态十分出色,已经取得了6连胜的骄人战绩,以20胜6负排名西部第二,詹姆斯更是打出"全能詹"的表现,接连3场比赛上场40分钟以上得到25+的数据。更重要的是和排名第一的爵士只差0.5个胜场。而大黑马爵士遭遇强敌雄鹿,字母哥有望送詹姆斯重返西部第一。

灰熊最近的状态并不好,最近5场比赛只取得了1胜4负的战绩,排名也掉了西部第九位,更重要的是灰熊是一支进攻能力不强的球队,他们只能用防守来弥补不足。糟糕的是明日对阵湖人,灰熊队内有8名球员缺席,其中还包括主力克拉克和主要轮换球员梅尔顿。湖人这边虽然大将浓眉哥出战成疑,但是有詹姆斯在,实力和士气都占据上风,如此看来,湖人拿下这一场关键战是大概率事件。

爵士的状态也不错,最近取得了5连胜稳坐西部第一,米切尔表现突出,在上一场战胜凯尔特人的比赛中他轰下了36分,打出了MVP级别的表现。不过,康利因为伤病继续无法复出。雄鹿最近的状态也可圈可点,6场比赛取得5胜1负的战绩,字母哥完全打疯了,上一场虽然不敌太阳,但是得到了47分11篮板5助攻,命中率高达65%,成为了自1980年NBA史上第一位达到这项成就的球星。

更重要的是球队主力均保持健康可以出战明日的比赛,综上所述,字母哥有望终结大黑马爵士的5连胜。如果湖人战胜灰熊,而爵士不敌雄鹿,那么湖人将重返西部第一。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/413741.html

跨境电商:https://www.ikjzd.com/

转运中国:https://www.ikjzd.com/w/1549

c88是什么:https://www.ikjzd.com/w/1017.html


原标题:湖人冲击7连胜!大黑马遇强敌,字母哥送詹姆斯重返西部第一NBA为球迷们准备了12场精彩的比赛,有两场备受球迷们关注的焦点之战。这两场比赛关系着西部第一的归属,分别是雄鹿挑战爵士和湖人迎战灰熊。目前,湖人的状态十分出色,已经取得了6连胜的骄人战绩,以20胜6负排名西部第二,詹姆斯更是打出"全能詹"的表现,接连3场比赛上场40分钟以上得到25+的数据。更重要的是和排名第一的爵士只差0.5个胜场
亚马逊 海外购:亚马逊 海外购
黄远:黄远
亚马逊运营困惑:为什么降低出价,ACOS反而高了?:亚马逊运营困惑:为什么降低出价,ACOS反而高了?
Shopee的台湾站点,卖点什么产品好?:Shopee的台湾站点,卖点什么产品好?
销售额达到4000多万美元!梅花伞是如何在竞争激烈的跨境行业突出重围的?:销售额达到4000多万美元!梅花伞是如何在竞争激烈的跨境行业突出重围的?

天问一号探测器火星捕获过程影像发布|天问一号

  来源:央视网

  2月12日下午,国家航天局发布了我国首次火星探测任务天问一号探测器火星捕获过程影像,展示了探测器靠近火星和点火制动时的震撼画面。


  今天发布的影像完整记录了火星进出天问一号探测器视野、发动机点火后探测器轻微震动和探测器从火星白天飞入黑夜的过程。探测器上的太阳翼、定向天线、火星大气层及表面形貌清晰可见。

  据了解,该段影像由天问一号环绕器上负责监测太阳翼及定向天线状态的监视相机拍摄,每3秒拍摄一张,历时约半小时,按照每秒约10张快放得到。


  在接下来的飞行中,天问一号上的监视相机将持续监测太阳翼、定向天线运行情况,记录天问一号探测之旅。

原文转载:http://tech.shaoqun.com/a/330751.html

跨境电商:https://www.ikjzd.com/

mymall:https://www.ikjzd.com/w/1050

002315焦点科技:https://www.ikjzd.com/w/1831


来源:央视网  2月12日下午,国家航天局发布了我国首次火星探测任务天问一号探测器火星捕获过程影像,展示了探测器靠近火星和点火制动时的震撼画面。  今天发布的影像完整记录了火星进出天问一号探测器视野、发动机点火后探测器轻微震动和探测器从火星白天飞入黑夜的过程。探测器上的太阳翼、定向天线、火星大气层及表面形貌清晰可见。  据了解,该段影像由天问一号环绕器上负责监测太阳翼及定向天线状态的监视相机拍摄,
易佰:易佰
宝付:宝付
避雷专区|哪些做法容易违反亚马逊图片要求?:避雷专区|哪些做法容易违反亚马逊图片要求?
亚马逊支持监管人脸识别技术,假冒产品问题引关注!:亚马逊支持监管人脸识别技术,假冒产品问题引关注!
一位卖家去年"黑五"的辛酸讲述:三小时亏损三万人民币:一位卖家去年"黑五"的辛酸讲述:三小时亏损三万人民币

书房与餐厅无隔阂,居家“无边界”,遇见家原来的样子

前言

这套温馨又趣味的新家,是设计师为幸福的一家三口精心设计,当我们拿到原始户型图时,发现原始户型布局过于方正传统,浪费了很多使用空间:主卧和次卧都没有配备衣帽间,储物空间不够;厨房操作空间太小;餐厅与厨房被分隔,影响家人互动。但好在承重墙的位置却都避开了改造的点,所以给了整个家更多的设计变化可能性。


空间展示 户型图

针对以上问题,我们做以下改进设计:
1. 将主卫墙体内推,敲掉客厅三分之一的背景墙,借用客厅空间新砌斜墙,为主卧配备衣帽间。
2. 同样将次卧内卫墙体内推,定制储物柜,满足次卧储存空间。
3. 敲掉厨房多余墙体,做成开放式设计,增加餐厨空间空间互动性。
客厅

客厅采用温暖的浅咖色作为整体基调,让人一进屋就能感受到整个家的温馨。

放置充满艺术趣味性的昌迪加尔单椅,犹如在空间中放了催化剂,将趣味的装饰画也连接起来,温馨与艺术趣味性,在这一刻就是一体。

客厅原本背景墙被敲掉三分之一,仅剩不多的空间又被主卧房门分去三分之一,新砌斜墙就成了电视背景的最佳选择,定制竖条格栅拉伸层高延伸感,主卧房门也用乳胶漆色块装饰,将设计趣味性进行到底。

舒适坐感的绒布,保证最舒服最放松的居住体验,搭配大理石质感的茶几,一柔一刚的碰撞,反而丰富了空间层次感。


餐厅

客餐厅手绘设计图

餐厅依承重墙定制餐桌,在玄关侧做桌面延伸处理,入户装饰画和小摆件都有了安放之处。

拆除原本书房墙体,与餐厅合并做成一体式开放空间,餐桌旁定制储物柜,保证公共空间的收纳功能。

书房一角采用半开放式书柜,享受美食的同时,也不能忘了精神食粮。


厨房

餐厅对面就是厨房。
左侧的玄关镜,供人出门前整理妆容,定制悬空储物柜延伸进厨房,柜体转角用斜角处理,减弱对角给人的拥挤感,小小细节也能注入设计的巧思。

厨房操作台面被墙体分成两段,延伸进厨房的储物柜,刚好弥补了这一缺陷。墙面安装可随意移动轨道插座,满足小厨电使用。


卧室

主卧手绘设计图

素雅的色调自然流淌于卧室空间,几何色块的组合碰撞,展现安宁与趣味并存的卧室空间。

主卫配备浴缸保证生活品质。


儿童房

女儿房手绘设计图

女儿房入户视角。

低饱和色彩的碰撞、柔软的羽毛灯、圆弧的家具,整个空间在各种温柔的元素交织下,显得静谧又温馨。



原文转载:http://home.shaoqun.com/a/89193.html

跨境电商:https://www.ikjzd.com/

关键词分析工具:https://www.ikjzd.com/w/1968

c88是什么:https://www.ikjzd.com/w/1017.html


前言 这套温馨又趣味的新家,是设计师为幸福的一家三口精心设计,当我们拿到原始户型图时,发现原始户型布局过于方正传统,浪费了很多使用空间:主卧和次卧都没有配备衣帽间,储物空间不够;厨房操作空间太小;餐厅与厨房被分隔,影响家人互动。但好在承重墙的位置却都避开了改造的点,所以给了整个家更多的设计变化可能性。 空间展示
洋老板:洋老板
邮乐购物商城:邮乐购物商城
亚马逊卖家的选品灵感怎么找?:亚马逊卖家的选品灵感怎么找?
易周资讯|美国要求亚马逊停售不安全防疫产品;中美航班再次复航 : 易周资讯|美国要求亚马逊停售不安全防疫产品;中美航班再次复航
盘点那些亚马逊大卖都爱用的工具,80%都可免费使用! :盘点那些亚马逊大卖都爱用的工具,80%都可免费使用!

2021年2月12日星期五

20年前发生的外星人事件是真的吗?

在这20年以来,到处都有外星人事件,要说其中最有知名度的应该就是凤凰山UFO,但是很多人都认为这无非是一个骗局,不可相信。在说到凤凰山时,人们就会想到孟照国。这家伙在1994年时和朋友一起来到凤凰山游玩,突然就发现山顶出现不明飞行物,而等到几个人靠近时无法前行,仿佛被电流击中一般。图片3.png

 

    这件事情在多年以前轰动全球,因为故事的主人公声称自己遇到了外星人,并且还被外星人挟持强迫发生了关系。 以上即便是整个事情的来龙去脉,实际上凤凰山也并不是第1次出现UFO事件,在1994年时期就曾经出现过外星人的飞船降落,后来在2005年时,又有一位游客来到凤凰山游玩,拍摄到了蝶形飞行物。所以人们才会觉得在凤凰山真的很可能存在外星人,否则这所有的一切都会觉得匪夷所思。

 

    关于凤凰山接二连三出现UFO事件,有人相信有人质疑,其实无非也是一场骗局。有人对于此事件提出更多一点,比如他说轻颜看到UFO,甚至还和外星人有过接触,但是这无非只是一个故事是一个谎言,就好像是说谎,逻辑是不通的。另外凤凰山如果真的曾经出现过一个时候,必然会闹出很大的动静,可是为什么居住在边上的村民,却从来没有看到过不明飞行物呢?难道只有他和外星人有着莫大渊源吗?这显然也是不现实的。




原文转载:http://tech.shaoqun.com/a/329755.html

跨境电商:https://www.ikjzd.com/

捷汇:https://www.ikjzd.com/w/419

李群:https://www.ikjzd.com/w/1767


在这20年以来,到处都有外星人事件,要说其中最有知名度的应该就是凤凰山UFO,但是很多人都认为这无非是一个骗局,不可相信。在说到凤凰山时,人们就会想到孟照国。这家伙在1994年时和朋友一起来到凤凰山游玩,突然就发现山顶出现不明飞行物,而等到几个人靠近时无法前行,仿佛被电流击中一般。这件事情在多年以前轰动全球,因为故事的主人公声称自己遇到了外星人,并且还被外星人挟持强迫发生了关系。以上即便是整个事情
刘军:刘军
斑马物联网:斑马物联网
美国史上最疯狂发钱提案:最高每人2000美元/月,爆单还会远吗?:美国史上最疯狂发钱提案:最高每人2000美元/月,爆单还会远吗?
2000亿美元关税9月24日开征,亚马逊卖家该如何应对?:2000亿美元关税9月24日开征,亚马逊卖家该如何应对?
突发!德国西班牙和新加坡等21国邮政宣布暂停中国业务!:突发!德国西班牙和新加坡等21国邮政宣布暂停中国业务!

追寻375年的失落大陆:仍有许多谜团尚未解开|欧洲|新西兰

  新浪科技讯 北京时间2月12日消息,据国外媒体报道,历经375年之后,科学家发现了世界第八大洲,而它一直就隐藏在我们的眼皮底下。然而,关于这片大陆的谜团至今仍未完全解开。

  1642年,亚伯·塔斯曼正在执行一项任务的途中。这位经验丰富的荷兰水手蓄着火焰似的小胡子和浓密的山羊胡,热衷于粗暴的审判——后来他曾因喝醉酒而心血来潮,试图绞死他的几个船员。他相信,南半球有一片广阔的大陆存在,并决心要找到它。

欧洲人对未知南方大陆的执念可以追溯到古罗马时代,但直到17世纪才有人尝试加以验证欧洲人对未知南方大陆的执念可以追溯到古罗马时代,但直到17世纪才有人尝试加以验证

  对当时的欧洲人而言,地球上的这一部分仍然十分神秘,但他们有一个不可动摇的信念,那就是南半球一定存在一大片陆地——事先被命名为"Australis"——才能与北半球的大陆达成平衡。这种对假想大陆的执念可以追溯到古罗马时代,但直到此时才有人尝试加以验证。

  因此,那一年的8月14日,塔斯曼从他的公司位于印度尼西亚雅加达的基地出发,带着两艘小船,向西然后向南,再向东航行,最终抵达新西兰南岛。他第一次与当地毛利人的接触并不顺利:第二天,有几个人划着独木舟冲出来,撞上了一艘在荷兰船只之间传递信息的小船。四个欧洲人死亡。后来,欧洲人又向大约11只独木舟开了一炮,至于有没有打中目标,无人知道。

塔斯曼的船队在与毛利人发生血腥的冲突后离开了新西兰,但他相信自己发现了传说中的南方大陆塔斯曼的船队在与毛利人发生血腥的冲突后离开了新西兰,但他相信自己发现了传说中的南方大陆

  塔斯曼就这样结束了他的任务。他将这个可怕的地方命名为摩登纳斯湾(Moordenaers Bay,意为"杀人犯"湾)——并没有任何讽刺的意味。几周后,他甚至没有踏上这片新土地就坐船回家了。尽管塔斯曼相信自己确实发现了未知的南方大陆,但很显然,这并不是他所设想的商业乌托邦。他再也没有回到这里。

  那时人们已经知道了澳大利亚,其英文"Australia"源于拉丁文"australis",意为"南方"。但欧洲人认为这并不是传说中他们要寻找的大陆。后来,当他们改变主意时,这片大陆又被命名为"Terra Australis",即"南方大陆"。

  塔斯曼没有想到的是,他自始至终都是对的——曾经确实有一块失落的大陆。2017年,一群地质学家宣布发现了西兰大陆(Zealandia),又称西兰洲,在毛利语中称为"Te Riu-a-Māui"。这片大陆的幅员辽阔,面积达490万平方公里,大约是马达加斯加的6倍。

阿贝尔·塔斯曼实际上发现了未知的南方大陆,尽管他自己并没有意识到,这片大陆的94%都在水下阿贝尔·塔斯曼实际上发现了未知的南方大陆,尽管他自己并没有意识到,这片大陆的94%都在水下

  尽管世界各国的百科全书、地图和搜索引擎一直坚持认为世界上只有七大洲,但这个研究团队自信地告诉全世界,这个结论是错的。世界上有八大洲,而新增加的这个大洲是其中最小、最薄和最年轻的。问题在于,这片大陆有94%都在水下,只有少数几个岛屿(比如新西兰)显露在海面上。换言之,它一直就隐藏在我们的眼皮底下。

  新西兰地理科学研究院的地质学家安迪·塔洛克说:"这个例子说明,有些很明显的东西也需要一段时间才能被发现。"塔洛克是发现西兰大陆的研究团队成员之一。

  不过,这仅仅是个开始。四年过去了,这片大陆仍像以往一样神秘莫测,它的秘密被小心翼翼地保存在2000米深的水下。它是如何形成的?那里曾经生活着什么样的生物?它在水下多久了?

  艰难的探索

  事实上,对西兰大陆的研究一直以来都是很艰难的挑战。1642年,塔斯曼发现了新西兰,一个多世纪后,英国皇家海军军官、探险家兼制图师詹姆斯·库克被派往南半球进行科学航行。官方给他的指示是观测金星凌日并计算出地球与太阳的距离。

  但库克还随身携带着一封信,他被要求在完成第一个任务后打开信封。信中包含了一项绝密任务:探索南方大陆。可以说,在到达新西兰之前,库克直接航行穿过了这片大陆。

卫星数据可以用来显示西兰大陆,它看起来像一个浅蓝色的倒转三角形,位于澳大利亚以东卫星数据可以用来显示西兰大陆,它看起来像一个浅蓝色的倒转三角形,位于澳大利亚以东

  关于西兰大陆存在的第一条真正线索来自苏格兰博物学家詹姆斯·赫克托尔爵士。1895年,他参加了一次考察新西兰南海岸一系列岛屿的航行。在研究了这些岛屿的地质情况后,他得出结论称,新西兰是"一条山脉的残余,而这条山脉是一片向南和向东延伸、如今已被淹没的大陆区域的顶峰……"

  尽管如此,对于西兰大陆可能存在的认识一直十分模糊,直到20世纪60年代也没有什么进展。新西兰地理科学研究院的地质学家尼克·莫蒂默领导了2017年的研究,他表示:"这个领域的进展相当缓慢。"

  20世纪60年代,地质学家们终于就"大陆"的定义达成了一致。从广义上,大陆是一个海拔高、岩石种类繁多、具有厚地壳的地质区域。当然,大陆的面积也必须很大。"不能只有一小块,"莫蒂默说。明确了定义之后,地质学家就有了研究的方向——如果他们能收集到足够的证据,就能证明第8个大陆是真实存在的。

  然而,这项研究依然停滞不前——发现新的大陆需要解决许多棘手的问题,而且成本高昂。莫蒂默也指出,研究者对此并没有紧迫感。1995年,美国地球物理学家布鲁斯·卢因迪克再次将南半球的这片地区称为大陆,并建议将其命名为西兰大陆。塔洛克称,正是从那时候起,对该大陆的探索开始呈指数增长。

  大约在同一时期,《联合国海洋法公约》开始生效,并最终提供了一些严肃的动机。公约指出,各国可以将其合法领土扩展到其专属经济区[距离海岸线200海里(370公里)]之外,以宣称对其"扩展大陆架"——以及该区域包含的所有矿藏和石油——的主张。

新西兰地处两大板块之间,太平洋板块与印度-澳大利亚板块的相互碰撞使其抬升,成为西兰大陆的最高点之一新西兰地处两大板块之间,太平洋板块与印度-澳大利亚板块的相互碰撞使其抬升,成为西兰大陆的最高点之一

  因此,如果新西兰能证明自身是一个更大的大陆的一部分,它就能将领土扩大6倍。突然间,进行相关研究的经费变得充足,证据也逐渐积累起来。随着地质学家采集的大量岩石标本,对西兰大陆的研究日益完善。

  研究人员也得到了卫星数据的支持,这些数据可以用于追踪地球引力在地壳不同部分之间的微小变化,从而绘制出海底地图。有了这项技术,西兰大陆变得清晰可见,这是一块奇形怪状的大陆,面积几乎和澳大利亚一样大。

  当研究人员最终向全世界揭示这块大陆的存在时,它成为了世界上最广阔的海洋领土之一。"这挺酷的,"莫蒂默说,"想想看,地球上每一块大陆上都有不同的国家,(但)西兰大陆上只有三块领土。"

  除了新西兰,这片大陆还包括新喀里多尼亚岛、豪勋爵岛和伯尔的金字塔。新喀里多尼亚岛是法国的海外属地之一,以瑰丽的泻湖而闻名;豪勋爵岛和伯尔的金字塔都是属于澳大利亚的岛屿,后者被一位18世纪的探险家描述为"比一艘船还小"。

  神秘的拉伸

  西兰大陆最初是古冈瓦纳超级大陆的一部分,后者形成于大约5.5亿年前,基本上是南半球所有陆地的总和。西兰大陆占据了冈瓦纳大陆东侧的一个角落,与其他几个地区接壤,包括西南极洲的一半和整个东澳大利亚。

当冈瓦纳超级大陆分裂时,其当冈瓦纳超级大陆分裂时,其"碎块"散布全球各地。在澳大利亚多丽歌国家公园的森林中,还保留着许多古老的植物

  然后在大约1.05亿年前,"由于一个我们还没有完全理解的过程,西兰大陆开始从冈瓦纳大陆剥离,"塔洛克说。

  大陆地壳通常深约40公里,明显比深约10公里的大洋地壳厚得多。而对于西兰大陆,由于拉伸的程度如此显著,其地壳只向下延伸了20公里。最终,这块极薄的大陆——虽然没有像正常海洋地壳那么薄——下沉了,消失在海底。

  尽管西兰大陆很薄,而且被水淹没,但地质学家很确定那就是一块大陆,因为那里发现了各种各样的岩石。大陆地壳往往由火成岩、变质岩和沉积岩组成,如花岗岩、片岩和石灰岩等,而海洋地壳通常只是由火成岩组成,如玄武岩。

  不过,地质学家们仍然有许多未解的谜题,他们对西兰大陆不同寻常的起源特别感兴趣,也有些困惑。例如,尚不清楚地壳这么薄的西兰大陆如何保持在一起,而没有分裂成更小的"微大陆"。

  另一个谜题是西兰大陆究竟是何时淹没于水下,以及是否真的曾经由陆地组成。目前高于海平面的部分其实是太平洋和澳大利亚板块挤压而形成的山脊。塔洛克表示,关于西兰大陆(除了几个小岛之外)是一直被淹没,抑或曾经是一片完全干燥的陆地,研究者意见不一。

  这也提出了一个问题:这片大陆上曾经生活着哪些生物?

  冈瓦纳大陆气候温和,拥有1.01亿平方公里的活动范围,是众多植物和动物群的家园,包括最早的四肢陆生动物,以及后来的诸多庞然大物,比如雷龙。那么,西兰大陆的岩石中是否完好保存了这些动物的遗骸呢?

  关于恐龙的争论

  陆地动物的化石在南半球很罕见,但在20世纪90年代,人们在新西兰发现了一些恐龙化石,包括一种巨大的长尾、长颈恐龙(一种蜥脚类恐龙)的肋骨,一种有喙食草恐龙(棱齿龙类)和一种甲龙。2006年,研究者在新西兰南岛以东约800公里的查塔姆群岛发现了一种大型食肉动物(可能是一种异特龙)的脚骨。至关重要的是,这些化石都可以追溯到西兰大陆从冈瓦纳大陆分裂出去之后。

  然而,这并不一定意味着恐龙曾漫步于西兰大陆的大部分地区——这些岛屿可能是恐龙的避难所,而其他区域则像现在一样都被海水淹没。新西兰地理科学研究院的地质学家鲁珀特·萨瑟兰说:"这个问题长期存在争论,包括在没有连续陆地的情况下是否可能出现陆地动物,以及如果真的没有连续陆地的话,它们是否会灭绝。"

可能是由于奇特的地质条件,与几维鸟亲缘关系最近的物种竟是马达加斯加岛的象鸟可能是由于奇特的地质条件,与几维鸟亲缘关系最近的物种竟是马达加斯加岛的象鸟

  这场争论随着新西兰最古怪也最受人喜爱的居民之一——几维鸟——的发现而变得更加复杂。这是一种矮胖的、不会飞的鸟类,长着嘴须和像头发一样的羽毛。奇怪的是,DNA研究显示,与几维鸟关系最近的并不是长期以来认为的恐鸟,而是马达加斯加岛的象鸟。几维鸟属于无翼鸟目,象鸟属于隆鸟目,恐鸟则属于恐鸟目,而它们都属于鸟纲下的古颚下纲,又称平胸小纲。几维鸟与恐鸟曾生活在同一个岛上,直到后者于大约500年前灭绝;体型更为巨大的象鸟则在大约800年前灭绝。

  这一发现让科学家相信,几维鸟和象鸟都是由生活在冈瓦纳大陆上的共同祖先演化而来的。这块超级大陆花了1.3亿年才完全分裂,留下的碎片散落在全球各地,形成了南美洲、非洲、马达加斯加、南极洲、澳大利亚、阿拉伯半岛、印度次大陆和西兰大陆。

  这反过来也暗示着,目前被淹没的西兰大陆至少有部分地区一直处于海平面之上,除了在大约2500万年前,整个大陆——甚至可能整个新西兰——都被认为沉入了海底。萨瑟兰说:"有观点认为,所有的动植物都是后来移居到这里的。"那么,这中间究竟发生了什么?

象鸟的体高可达3米,至今仍有象鸟蛋壳的碎片散落在马达加斯加岛的海滩上象鸟的体高可达3米,至今仍有象鸟蛋壳的碎片散落在马达加斯加岛的海滩上

  尽管不可能直接从西兰大陆的海底收集化石,但科学家一直在通过钻探来探测其深度。"实际上,最有用且最独特的是那些在非常浅的海洋中形成的化石,"萨瑟兰说,"因为它们留下了记录——那里可能有无数非常独特的微小化石。"

  2017年,一个团队对该地区进行了迄今为止最广泛的调查,在6个不同地点向海底钻了超过1250米的深度。他们收集的岩心中含有陆地植物的花粉、孢子和生活在温暖浅海的生物的外壳。

  萨瑟兰说:"当你发现一些深度只有10米左右的水体之后,其周围就很可能存在陆地。"他解释称,花粉和孢子也暗示了西兰大陆曾经未被淹没的可能性。

  弯曲变形的边界

  西兰大陆的形状是另一个令人费解的谜题。"如果你看一看新西兰的地质图,会发现两个十分突出的特征,"萨瑟兰说。其中之一是阿尔卑斯断层,这是一条沿南岛延伸的板块边界,非常显著,从太空中都能看到。

红色的岩石带本应该沿着对角线一直延伸到西兰大陆,但却发生了扭曲变形红色的岩石带本应该沿着对角线一直延伸到西兰大陆,但却发生了扭曲变形

  第二个特征是,新西兰的地质形态——以及更广阔的大陆地质形态——异常弯曲。它们都被一条水平线一分为二,而这条水平线正是太平洋板块与澳大利亚板块的交汇处。此处似乎有什么东西将大陆的下半部分扭曲了,不仅使之前连续的岩石带不再连成直线,甚至几乎扭成了直角。

  一个简单的解释是,构造板块发生了移动,并以某种方式变形。但这一切究竟是如何发生的,何时发生的,科学家依然无从知晓。"有各种各样的解释,但这是一个相当大的未解之谜,"塔洛克说。

  萨瑟兰解释称,我们在短期内不太可能了解西兰大陆所有的秘密。"当一切都在水下2公里处,而你需要采样的岩层也在海床下500米深处时,很难有所发现,"他说,"探索这样一个大陆确实很有挑战性。这需要大量的时间、金钱和努力,需要船只和调查区域。"

  不过,对世界第八大洲的探索至少表明,在塔斯曼的发现近400年后,这片大陆仍然有许多令人着迷之处。(任天)

原文转载:http://tech.shaoqun.com/a/328752.html

跨境电商:https://www.ikjzd.com/

ishare:https://www.ikjzd.com/w/2308

heap:https://www.ikjzd.com/w/2012


新浪科技讯北京时间2月12日消息,据国外媒体报道,历经375年之后,科学家发现了世界第八大洲,而它一直就隐藏在我们的眼皮底下。然而,关于这片大陆的谜团至今仍未完全解开。  1642年,亚伯·塔斯曼正在执行一项任务的途中。这位经验丰富的荷兰水手蓄着火焰似的小胡子和浓密的山羊胡,热衷于粗暴的审判——后来他曾因喝醉酒而心血来潮,试图绞死他的几个船员。他相信,南半球有一片广阔的大陆存在,并决心要
csa认证:csa认证
卖家网:卖家网
取代沃尔玛,亚马逊的数字化零售战争:取代沃尔玛,亚马逊的数字化零售战争
亚马逊卖家如何运用合规的方法为自己获得亚马逊review?:亚马逊卖家如何运用合规的方法为自己获得亚马逊review?
突发!众多中国亚马逊卖家被告,深圳某大卖也中招:突发!众多中国亚马逊卖家被告,深圳某大卖也中招