Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot 微服务上容器平台的最佳实践 - 3

Spring Boot 微服务上容器平台的最佳实践 - 3

作者头像
东风微鸣
发布于 2022-04-21 06:00:26
发布于 2022-04-21 06:00:26
47100
代码可运行
举报
运行总次数:0
代码可运行

前言

今天开始第二篇, 主要介绍下 Zipkin + MySQL部署到容器平台上.

项目克隆

GitHub 仓库地址 源码在这里. 先下载下来.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git clone https://github.com/RHsyseng/spring-boot-msa-ocp.git LambdaAir

然后进入项目目录: cd LambdaAir

几个前提

  1. 共享存储. 这个Demo 应用会用到NFS, K8S(或OpenShift)上得有NFS的PV, 且空间充足(至少5G). 共享存储用于:
    1. zpikin的mysql数据存储;
    2. zuul的动态proxy脚本挂载.
  2. K8S (或OpenShift) 得有充足的权限. 至少得拥有以下权限:
    1. 创建NameSpace(或OpenShift的Project)
    2. 创建PVC
    3. 创建Service
    4. 创建 Deployment
    5. 创建 Ingress(或OpenShift的 Route)
    6. 创建和挂载 ConfigMap
    7. 创建Secret

创建 NameSpace(或Project)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc new-project lambdaair --display-name="Lambda Air" --description="Spring Boot Microservices on Red Hat OpenShift Container Platform"
Now using project "lambdaair" on server "https://ocp-master1.xxx.example.com:8443".

部署ZipKin

概述

全部步骤拆分如下:

  1. 创建secret - 存储数据库账号密码等机要信息
  2. 创建 PVC - zipkin-mysql, 用于申请存储资源, 存放mysql 持久化数据;
  3. 创建 configmap - zipkin-mysql-cnf, 用于挂载mysql的配置;
  4. 创建 configmap - zipkin-mysql-initdb, 用于挂载mysql 初始化脚本;
  5. 创建 deploymentconfig - zipkin-mysql, 用于对zipkin-mysql 的初始化, deployemnt及副本数进行管理.
  6. 创建 service - zipkin-mysql, 用于在集群内提供 zipkin的mysql 服务. zipkin通过这个service连接到mysql.
  7. 创建 deploymentconfig - zipkin. 用于对zipkin的build和deployment以及副本数等进行管理;
  8. 创建 service - zipkin. 用于在集群内提供zipkin 服务;
  9. 创建 route - zipkin , 用于连接service - zipkin, 使得用户可以通过域名访问zipkin.

创建 MySQL 数据库

上面的步骤中, 与创建MySQL 数据库有关的步骤有1-6步. 说明如下:

  1. 创建账号密码等信息;
  2. 申请持久化存储;
  3. 创建MySQL 配置;
  4. 创建MySQL 初始化脚本;
  5. 创建MySQL实例. 会用到
    1. 账号密码
    2. 持久化存储
    3. MySQL启动后会执行初始化脚本
  6. 创建MySQL服务, 供集群内(项目内)使用.
创建 Secret

zipkin-mysql-secret.yml文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: Secret
apiVersion: v1
metadata:
  name: zipkin-mysql
  namespace: lambdaair
  labels:
    project: zipkin-mysql  
data:
  database-password: your-password
  database-root-password: root-password
  database-user: normaluser

使用ockubectl创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 先切换到 lambdaair project(后续都在这个项目里, 不在赘述)
$ oc project lambdaair
# 创建 secret
$ oc create -f zipkin-mysql-secret.yml
# 查看创建结果
$ oc get secret
NAME                       TYPE                                  DATA   AGE
zipkin-mysql               Opaque                                3      2d5h
创建 PVC

Zipkin使用MySQL数据库进行存储,这反过来又需要创建一个OpenShift 共享存储。假定已经有了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc get pv
NAME                  CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM                           REASON    AGE
zipkin-mysql-data     1Gi        RWO           Recycle         Available     1m

zipkin-mysql-pvc.yml 内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: zipkin-mysql
  namespace: lambdaair
  labels:
    project: zipkin-mysql  
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zipkin-mysql-pvc.yml
$ oc get pvc
NAME           STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS   AGE
zipkin-mysql   Bound    zipkin-mysql-data   1Gi        RWO                           2d5h
创建 ConfigMap
创建 MySQL 配置的ConfigMap

zipkin-mysql-cnf.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: ConfigMap
apiVersion: v1
metadata:
  name: zipkin-mysql-cnf
  namespace: lambdaair
  labels:
    project: zipkin-mysql  
data:
  custom.cnf: |
    [mysqld]
    sql-mode=""

其实就是示范下, 没配置啥. 接下来创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zipkin-mysql-cnf.yml
$ oc get configmap
NAME                  DATA   AGE
zipkin-mysql-cnf      1      2d5h
创建 MySQL 初始化脚本的ConfigMap

zipkin-mysql-initdb.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: ConfigMap
apiVersion: v1
metadata:
  name: zipkin-mysql-initdb
  namespace: lambdaair
  labels:
    project: zipkin-mysql  
data:
  init.sql: >
    CREATE TABLE IF NOT EXISTS zipkin_spans (
      `trace_id` BIGINT NOT NULL,
      `id` BIGINT NOT NULL,
      `name` VARCHAR(255) NOT NULL,
      `parent_id` BIGINT,
      `debug` BIT(1),
      `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
      `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
    ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;


    ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id`, `id`) COMMENT 'ignore
    insert on duplicate';

    ALTER TABLE zipkin_spans ADD INDEX(`trace_id`, `id`) COMMENT 'for joining
    with zipkin_annotations';

    ALTER TABLE zipkin_spans ADD INDEX(`trace_id`) COMMENT 'for getTracesByIds';

    ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and
    getSpanNames';

    ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces
    ordering and range';


    CREATE TABLE IF NOT EXISTS zipkin_annotations (
      `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
      `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
      `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
      `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
      `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
      `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
      `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
      `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
      `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
      `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
    ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;


    ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id`, `span_id`,
    `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';

    ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`) COMMENT 'for
    joining with zipkin_spans';

    ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`) COMMENT 'for
    getTraces/ByIds';

    ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT
    'for getTraces and getServiceNames';

    ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';

    ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';


    CREATE TABLE IF NOT EXISTS zipkin_dependencies (
      `day` DATE NOT NULL,
      `parent` VARCHAR(255) NOT NULL,
      `child` VARCHAR(255) NOT NULL,
      `call_count` BIGINT
    ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;


    ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zipkin-mysql-initdb.yml
$ oc get configmap
NAME                  DATA   AGE
zipkin-mysql-cnf      1      2d5h
zipkin-mysql-initdb   1      2d5h
创建 MySQL的 DeploymentConfig

zipkin-mysql-deploymentconfig.yml

📓 备注: DeploymentConfig 这个resource是OpenShift特有的. 基于K8S的ReplicationControllers, 增加了对软件开发和部署生命周期的扩展支持. 最简单的情况, DeploymentConifg就是创建一个新的ReplicationController并启动pod. 但是, 它确实增加了一些新功能, 提供了从镜像的现有部署过渡到新镜像的功能, 并且还定义了在创建ReplicationController之前或之后运行的Hook. (mysql初始化sql就是利用这个功能) 还提供以下功能:

  • DeploymentConfig,这是用于运行应用程序的模板。
  • 触发驱动自动部署以响应事件的触发器(trigger)。
  • 用户可定制的部署策略,以从先前版本过渡到新版本。策略在通常称为部署过程的Pod中运行。
  • 一组hooks(lifecycle hooks),用于在部署的生命周期中的不同点执行自定义行为。
  • 应用程序的版本控制,以便在部署失败的情况下手动或自动支持回滚。
  • 手动副本缩放和自动缩放。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: DeploymentConfig
apiVersion: apps.openshift.io/v1
metadata:
  labels:
    project: zipkin-mysql
  name: zipkin-mysql
spec:
  replicas: 1
  selector:
    name: zipkin-mysql
  strategy:
    type: Recreate
    recreateParams:
      post:
        failurePolicy: Abort
        execNewPod:
          containerName: mysql
          command:
            - /bin/sh
            - -c
            - hostname && sleep 10 && /opt/rh/rh-mysql57/root/usr/bin/mysql -h $DATABASE_SERVICE_NAME -u $MYSQL_USER -D $MYSQL_DATABASE -p$MYSQL_PASSWORD -P 3306 < /docker-entrypoint-initdb.d/init.sql && echo Initialized database
          env:
            - name: DATABASE_SERVICE_NAME
              value: zipkin-mysql
          volumes:
            - mysql-init-script
  template:
    metadata:
      labels:
        name: zipkin-mysql
    spec:
      containers:
        - env:
            - name: MYSQL_USER
              valueFrom:
                secretKeyRef:
                  key: database-user
                  name: zipkin-mysql
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: database-password
                  name: zipkin-mysql
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: database-root-password
                  name: zipkin-mysql
            - name: MYSQL_DATABASE
              value: ${MYSQL_DATABASE}
          image: " "
          imagePullPolicy: IfNotPresent
          livenessProbe:
            initialDelaySeconds: 30
            tcpSocket:
              port: 3306
            timeoutSeconds: 1
          name: mysql
          ports:
            - containerPort: 3306
          readinessProbe:
            exec:
              command:
                - /bin/sh
                - -i
                - -c
                - MYSQL_PWD="$MYSQL_PASSWORD" mysql -h 127.0.0.1 -u $MYSQL_USER -D $MYSQL_DATABASE
                  -e 'SELECT 1'
            initialDelaySeconds: 5
            timeoutSeconds: 1
          resources:
            limits:
              memory: 512Mi
          volumeMounts:
            - mountPath: /var/lib/mysql/data
              name: zipkin-mysql-data
            - mountPath: /docker-entrypoint-initdb.d/
              name: mysql-init-script
            - mountPath: /etc/mysql/conf.d/
              name: mysql-confd
      volumes:
        - name: zipkin-mysql-data
          persistentVolumeClaim:
            claimName: zipkin-mysql
        - configMap:
            name: zipkin-mysql-initdb
          name: mysql-init-script
        - configMap:
            name: zipkin-mysql-cnf
          name: mysql-confd
  triggers:
    - imageChangeParams:
        automatic: true
        containerNames:
          - mysql
        from:
          kind: ImageStreamTag
          name: mysql:5.7
          namespace: openshift
      type: ImageChange
    - type: ConfigChange

这个用到了RedHat提供的mysql:5.7的镜像.

创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zipkin-mysql-deploymentconfig.yml
$ watch oc get pods
Every 2.0s: oc get pods                                                      
Fri Jul 21 02:04:15 2017
NAME                    READY     STATUS              RESTARTS   AGE
zipkin-mysql-1-deploy   1/1   Running             0          2m
zipkin-mysql-1-tv2v1    0/1   ContainerCreating   0          1m

完成部署过程可能需要几分钟,此时应该有1个pod处于Running状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc get pods
NAME                   READY     STATUS    RESTARTS   AGE
zipkin-mysql-1-g44s7   1/1       Running   0          4m
创建 MySQL 的 Service

zipkin-mysql-svc.yml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: Service
apiVersion: v1
metadata:
  name: zipkin-mysql
  namespace: lambdaair
  labels:
    project: zipkin-mysql
spec:
  ports:
    - name: mysql
      port: 3306
  selector:
    name: zipkin-mysql

创建并查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zipkin-mysql-svc.yml
$ oc get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
zipkin-mysql   ClusterIP   172.30.241.12   <none>        3306/TCP   2d7h

这样, zipkin就可以通过 service 来调用mysql了.

创建 Zpikin 应用实例并对外提供服务

上面的步骤中, 与创建MySQL 数据库有关的步骤有7-9步. 说明如下:

  1. 创建zipkin实例, 会链接到数据库. 这时候, 集群内外都无法访问该实例, 只能在容器内使用;
  2. 创建zipkin service, 此时, zipkin可以供集群内使用.
  3. 创建zipkin route, 连接到zipkin service, 此时, zipkin可以通过域名被用户访问到.
创建 ZipKin的 DeploymentConfig

接下来就是重头戏了! 创建Zipkin的运行实例, 并连接数据库. zpikin-deploymentconfig.yml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: DeploymentConfig
metadata:
  labels:
    project: zipkin-mysql
  name: zipkin
spec:
  replicas: 1
  selector:
    project: zipkin-mysql
  template:
    metadata:
      labels:
        project: zipkin-mysql
    spec:
      containers:
        - env:
            - name: STORAGE_PORT_9042_TCP_ADDR
              value: zipkin-cassandra:9411
            - name: STORAGE_PORT_3306_TCP_ADDR
              value: zipkin-mysql:3306
            - name: MYSQL_USER
              value: normaluser
            - name: MYSQL_PASS
              value: your-password
            - name: STORAGE_TYPE
              value: mysql
            - name: TRANSPORT_TYPE
              value: http
            - name: KUBERNETES_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          image: openzipkin/zipkin:1.19.2
          name: zipkin
          readinessProbe:
            httpGet:
              path: /api/v1/services
              port: 9411
            initialDelaySeconds: 5
          resources:
            limits:
              cpu: "3"
              memory: "1600Mi"
            requests:
              cpu: "200m"
              memory: "200Mi"
  triggers:
    - type: ConfigChange

创建并查看进度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zpikin-deploymentconfig.yml
$ $ watch oc get pods
Every 2.0s: oc get pods                                                      
Fri Jul 21 02:04:15 2017
NAME                    READY     STATUS              RESTARTS   AGE
zipkin-1-deploy         1/1   Running             0          2m
zipkin-1-sclgl          0/1   Running             0          2m

可能要花费几分钟, 几分钟后再查看, 处于Running状态显示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc get pods
NAME                   READY     STATUS    RESTARTS   AGE
zipkin-1-k0dv6         1/1       Running   0          5m

这样实例就创建好了.

创建 Zpikin 的 Service

zipkin-svc.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Service
metadata:
  labels:
    project: zipkin-mysql
  name: zipkin
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 9411
  selector:
    project: zipkin-mysql
  type: LoadBalancer

创建并查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zipkin-svc.yaml
$ oc get svc
NAME     TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
zipkin   LoadBalancer   172.30.140.146   <pending>     80:32395/TCP   2d7h

容器内的端口是9411, service的对应端口是80. 类型是LoadBalancer. 这里Service就是提供了2个功能:

  • 服务注册和发现;
  • 负载均衡
创建 Zipkin 的 Route

zpikin-route.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    project: zipkin-mysql
  name: zipkin
spec:
  port:
    targetPort: 9411
  to:
    kind: Service
    name: zipkin

创建并查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ oc create -f zpikin-route.yml
$ oc get route
NAME           HOST/PORT                                              PATH   SERVICES       PORT   TERMINATION   WILDCARD
zipkin         zipkin-lambdaair.apps.cce-test.ccic-net.com.cn                zipkin         9411                 None

使用显示的URL从浏览器访问控制台,并验证其工作正常: 🎉🎉🎉

小结

至此, zipkin + mysql 部署完成. 完成后, 拓扑如下:

mysql容器上只支持单节点. 如果上生产的话建议还是部署在容器外. zipkin的话, 就可以随意的扩展和调整, 点击如下的向上箭头, 加多少个pod都可以, 因为配置了Liveness 和Readiness Probe, K8S会在Readiness Probe探测ok后, 自动将Service的流量LoadBalance到后端的新增和现有的pod. 同时指向service的route实际上也是由后边的多个pod来承载. 更近一步, 可以通过配置HPA来自动根据CPU, 内存等阈值来自动扩缩容量. 这就是K8S的一大优势 -- 一键秒级扩容, 甚至自动扩容! 💪💪💪

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot 微服务上容器平台的最佳实践 - 6
A/B测试直接是使用zuul的动态网关的功能。这次关于K8S的演示只是如何通过Volume挂载的方式将动态脚本挂载进去。
东风微鸣
2022/04/21
2850
Spring Boot 微服务上容器平台的最佳实践 - 6
集成 Kubernetes 来构建微服务-spring cloud 入门教程
Spring Cloud和Kubernetes是目前Java平台下微服务应用的使用得最多的产品。然而,当谈到微服务架构时,它们有时被描述为具有竞争力的解决方案。它们都在微服务架构中实现流行的模式,如服务发现、分布式配置、负载平衡或断路。当然,他们的做法不同。 Kubernetes 是一个用于运行、扩展和管理容器化应用程序的平台。Kubernetes 最重要的组件之一是etcd。该高度可用的键值存储负责存储所有集群数据,包括服务注册表和应用程序配置。我们不能用任何其他工具代替它。可以使用Istio或 Linkerd等第三方组件来实现更高级的路由和负载均衡策略。要在 Kubernetes 上部署和运行应用程序,我们无需在源代码中添加任何内容。编排和配置是在应用程序之外实现的——在平台上。 Spring Cloud 提出了一种不同的方法。所有组件都必须在应用程序端包含和配置。它为我们提供了许多与用于云原生开发的各种工具和框架集成的可能性。但是,一开始 Spring Cloud 是围绕 Eureka、Ribbon等 Netflix OSS 组件构建的、Hystrix 或 Zuul。它为我们提供了一种机制,可以轻松地将它们包含到我们基于微服务的架构中,并将它们与其他云原生组件集成。一段时间后,必须重新考虑这种方法。今天,我们有很多由 Spring Cloud 开发的组件,比如 Spring Cloud Gateway(Zuul 替代品)、Spring Cloud Load Balancer(Ribbon 替代品)、Spring Cloud Circuit Breaker(Hystrix 替代品)。还有一个相对较新的与Kubernetes集成的项目——Spring Cloud Kubernetes。
jack.yang
2025/04/05
700
集成 Kubernetes 来构建微服务-spring cloud 入门教程
Spring Boot 微服务上容器平台的最佳实践 - 10 - Zipkin
这个demo使用Spring Sleuth来收集tracing 数据并将其发送到OpenZipkin, OpenZipkin作为OpenShift服务部署,并由一个持久的MySQL数据库镜像支持。可以从Zipkin控制台查询tracing 数据,该控制台通过OpenShift route公开。日志集成也可以使用trace id将相同业务请求的分布式执行捆绑在一起。
东风微鸣
2022/04/21
5130
Spring Boot 微服务上容器平台的最佳实践 - 10 - Zipkin
CentOS搭建基于ZIPKIN的数据追踪系统
参考:腾讯云手动实验https://cloud.tencent.com/developer/labs/lab/10195
全栈程序员站长
2021/06/10
4930
CentOS搭建基于ZIPKIN的数据追踪系统
使用Zipkin让Sleuth可视化
从spring boot 2.0开始,官方就不再支持使用自建Zipkin Server的方式进行服务链路追踪,而是直接提供了编译好的 jar 包来给我们使用
蚊子.
2023/08/10
2360
使用Zipkin让Sleuth可视化
搭建数据追踪系统
环境说明 操作系统:CentOS 7.2 64位 1Zipkin简介 zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来。其主要功能是聚集来自各个异构系统的实时监控数据。 2 应用场景 故障快速定位 通过分析调用链,可以将一次请求的逻辑轨迹完整清晰的展示出来,通过在开发中在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息。 服务可用性 通过分析各个环节的平均时延,QPS等信息,可
用户2017109
2018/06/19
1.1K0
每日优鲜三面:在Spring Cloud实战中,如何用服务链路追踪Sleuth?
我们知道,微服务之间通过网络进行通信,但在我们提供服务的同时,不能保证网络一定是畅通的。相反地,网络是很脆弱的,网络资源也有限,因此我们有必要追踪每个网络请求,了解它们经过了哪些微服务,延迟多少,每个请求所耗费的时间等。只有这样能更好地分析系统瓶颈,解决系统问题。
Java程序猿
2021/07/29
7730
利用 Zipkin 追踪 Mysql 数据库调用链
在前面:微服务调用链追踪中心搭建 一文中我们利用 Zipkin 搭建了一个微服务调用链的追踪中心,并且模拟了微服务调用的实验场景。利用 Zipkin 的库 Brave,我们可以收集一个客户端请求从发出到被响应 经历了哪些组件、哪些微服务、请求总时长、每个组件所花时长 等信息。
网站那些事
2018/05/07
3.1K0
利用 Zipkin 追踪 Mysql 数据库调用链
《吃透微服务》- 服务追踪之Sleuth
关于微服务的概念我们在之前的两篇文章中都已经做出了相应的见解,没看过的小伙伴可以空降查看一番,不同见解欢迎后台留言!
蔡不菜丶
2021/07/23
4690
《吃透微服务》- 服务追踪之Sleuth
springcloud实战:服务链路追踪Sleuth
我们知道,微服务之间通过网络进行通信,但在我们提供服务的同时,不能保证网络一定是畅通的。相反地,网络是很脆弱的,网络资源也有限,因此我们有必要追踪每个网络请求,了解它们经过了哪些微服务,延迟多少,每个请求所耗费的时间等。只有这样能更好地分析系统瓶颈,解决系统问题。
愿天堂没有BUG
2022/10/28
1.3K0
springcloud实战:服务链路追踪Sleuth
服务链路追踪
在微服务架构下,由于进行了服务拆分,一次请求往往需要涉及多个服务, 每个服务可能是由不同的团队开发,使用了不同的编程语言,还有可能部署在不同的机器上,分布在不同的数据中心。 服务跟踪系统
Java_慈祥
2024/08/06
1890
服务链路追踪
【我在拉勾训练营学技术】微服务监控--链路追踪技术
Spring Cloud 是一站式微服务解决方案。很多公司都在使用 Spring Cloud 组件。我们想要学习 Spring Cloud 微服务架构,就需要学习他们的组件。包含:注册中心、负载均衡、熔断处理、过程调用、网关服务、配置中心、消息总线、调用链路、数据监控等等。
程序员爱酸奶
2021/01/18
4510
Spring Boot 微服务上容器平台的最佳实践 - 5
这次没有用到Spring的Config Server, 而是使用OpenShift的ConfigMap作为参数外部化的方案.
东风微鸣
2022/04/21
3940
Spring Boot 微服务上容器平台的最佳实践 - 5
Spring Cloud sleuth with zipkin over RabbitMQ教程
本项目是sleuth和zipkin在spring cloud环境中使用,其中sleuth和zipkin是通过RabbitMQ进行通信,同时zipkin的数据是存储在mysql中。
程序那些事
2020/07/09
6190
快速学习-Sleuth--链路追踪
在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成 系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建 在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实 现、有可能布在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问 题:
cwl_java
2020/08/31
6030
典型微服务 + K8S案例 - 智慧运维平台
随着公司业务的不断壮大,业务的上升必然带来了新的IT环境快速的变化。IT架构以开源和云化架构为主,IT运维部面临 “传统环境”+“新核心”双重运维压力. 在此背景下建设了智慧运维平台.
东风微鸣
2022/04/21
1.1K0
典型微服务 + K8S案例 - 智慧运维平台
SpringCloudAlibaba入门系列(6) - 链路追踪Sleuth
摘要:由于一个系统被拆分成了多个模块,在一次请求中可能涉及到调用多个服务,如何在服务调用中快速定位并发现问题,这就涉及到链路追踪技术。
兜兜转转
2023/03/08
6770
SpringCloudAlibaba入门系列(6) - 链路追踪Sleuth
Net和Java基于zipkin的全链路追踪
  在各大厂分布式链路跟踪系统架构对比 中已经介绍了几大框架的对比,如果想用免费的可以用zipkin和pinpoint还有一个忘了介绍:SkyWalking,具体介绍可参考:https://github.com/apache/incubator-skywalking/blob/master/README_ZH.md   由于追踪的要求是Net平台和Java平台都要支持,对于java平台各组件都是天生的支持的,但对于net的支持找了些开源组件,发现Pinpoint和SkyWalking给出的Demo都是基于N
欢醉
2018/05/28
1.2K0
Spring Boot 微服务上容器平台的最佳实践 - 2
这个Demo 架构演示了在微服务体系结构风格中构建的机票搜索系统。每个单独的微服务都是作为REST服务实现的,它位于Spring Boot之上,带有一个嵌入式Tomcat服务器,部署在OpenShift镜像上,并支持OpenJDK。典型微服务的软件栈如下:
东风微鸣
2022/04/21
3350
Spring Boot 微服务上容器平台的最佳实践 - 2
Spring Cloud Sleuth 之Greenwich版本全攻略
微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位。主要体现在一个请求可能需要调用很多个服务,而内部服务的调用复杂性决定了问题难以定位。所以在微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题能够快速定位的目的。
方志朋
2019/06/21
7640
Spring Cloud Sleuth 之Greenwich版本全攻略
推荐阅读
相关推荐
Spring Boot 微服务上容器平台的最佳实践 - 6
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验