使用docker部署spring boot并接入skywalking的方法

一、使用Docker部署Spring Boot

  1. 首先我们需要在本地编写好Spring Boot应用程序,并使用Maven或Gradle构建出打包好的jar包。

  2. 编写Dockerfile文件,用于构建Docker镜像。具体内容可以参考下面的示例:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 构建Docker镜像。进入到包含Dockerfile文件的目录下,执行以下命令:
docker build -t myapp .

其中,myapp为镜像名称。

  1. 运行Docker容器。执行以下命令:
docker run -p 8080:8080 myapp

其中,8080为Spring Boot应用程序绑定的端口,myapp为镜像名称。

二、接入SkyWalking

  1. 下载SkyWalking Agent

从SkyWalking官网下载对应版本的SkyWalking Agent,并将agent配置文件(agent.config)放置到Spring Boot应用程序的所在目录下。

  1. 在Dockerfile文件中添加SkyWalking Agent

在Dockerfile文件中添加以下内容:

ENV AGENT_VERSION 6.6.0

ADD https://archive.apache.org/dist/skywalking/${AGENT_VERSION}/apache-skywalking-apm-${AGENT_VERSION}.tar.gz /skywalking
WORKDIR /skywalking
RUN tar -xvf apache-skywalking-apm-${AGENT_VERSION}.tar.gz && \
    rm apache-skywalking-apm-${AGENT_VERSION}.tar.gz && \
    mv apache-skywalking-apm-${AGENT_VERSION} apm && \
    cd apm/agent && \
    mkdir -p /skywalking-agent && \
    cp -r * /skywalking-agent/

ENV SW_AGENT_NAME=myapp
ENV SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap:11800
ENV JAVA_OPTS="-javaagent:/skywalking-agent/skywalking-agent.jar"

ADD target/*.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

在Dockerfile中,我们使用ADD命令下载SkyWalking Agent,并将其放置到/skywalking目录。然后我们在SkyWalking Agent的目录下解压文件,并将其放置到/skywalking-agent目录下。接着,我们使用JAVA_OPTS环境变量来指定SkyWalking Agent的位置,并指定应用程序名称及SkyWalking Collector的地址。

至此,我们已经完成了将Spring Boot应用程序部署到Docker容器,并接入SkyWalking的整个过程。

示例一:使用Docker Compose部署Spring Boot应用程序和SkyWalking

在这个示例中,我们将使用Docker Compose工具将Spring Boot应用程序和SkyWalking部署到同一个Docker网络中,并指定SkyWalking Collector的地址。

  1. 编写docker-compose.yml文件
version: "3.7"
services:
  myapp:
    build: .
    ports:
      - 8080:8080
    environment:
      SW_AGENT_NAME: myapp
      SW_AGENT_COLLECTOR_BACKEND_SERVICES: skywalking-oap:11800
      JAVA_OPTS: "-javaagent:/skywalking-agent/skywalking-agent.jar"
    networks:
      - mynetwork
  skywalking-oap:
    image: apache/skywalking-oap-server:6.6.0-es7
    environment:
      SW_STORAGE: elasticsearch7
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
    ports:
      - 12800:12800
    depends_on:
      - elasticsearch
    networks:
      - mynetwork
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    environment:
      - node.name=elasticsearch
      - cluster.name=elasticsearch
      - discovery.seed_hosts=elasticsearch
      - cluster.initial_master_nodes=elasticsearch
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - mynetwork
networks:
  mynetwork:
    driver: bridge
volumes:
  esdata:

在docker-compose.yml文件中,我们定义了三个服务:myapp、skywalking-oap和elasticsearch。myapp服务表示我们编写的Spring Boot应用程序,指定了SkyWalking Agent的环境变量,并映射了应用程序的端口。而skywalking-oap和elasticsearch服务则代表了SkyWalking Collector和Elasticsearch,提供了接收SkyWalking数据和存储SkyWalking数据的功能。

在docker-compose.yml中,我们还声明了一个网络和一个数据卷,用于连接不同的Docker容器并存储数据。

  1. 启动Docker Compose

执行以下命令启动Docker Compose:

docker-compose up -d

在启动完成后,我们可以访问http://localhost:12800/进行SkyWalking的监控界面。

示例二:使用Kubernetes部署Spring Boot应用程序和SkyWalking

在这个示例中,我们将使用Kubernetes工具将Spring Boot应用程序和SkyWalking部署到同一个Kubernetes集群中,并指定SkyWalking Collector的地址。

  1. 编写deployment.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp:latest
          ports:
            - containerPort: 8080
          env:
            - name: SW_AGENT_NAME
              value: myapp
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: skywalking-oap:11800
            - name: JAVA_OPTS
              value: -javaagent:/skywalking-agent/skywalking-agent.jar
          volumeMounts:
            - name: agent-config-volume
              mountPath: /skywalking-agent/config
            - name: agent-logs-volume
              mountPath: /skywalking-agent/logs
      volumes:
        - name: agent-config-volume
          configMap:
            name: agent-config-map
            items:
              - key: agent.config
                path: agent.config
        - name: agent-logs-volume
          emptyDir: {}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: agent-config-map
data:
  agent.config: |-
    collector.backend_service=skywalking-oap:11800
    collector.sample_n_per_3_secs=-1
    agent.service_name=myapp
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-oap-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-oap
  template:
    metadata:
      labels:
        app: skywalking-oap
    spec:
      containers:
        - name: skywalking-oap
          image: apache/skywalking-oap-server:6.6.0-es7
          env:
            - name: SW_STORAGE
              value: elasticsearch7
            - name: SW_STORAGE_ES_CLUSTER_NODES
              value: elasticsearch:9200
          ports:
            - containerPort: 12800
      volumes:
        - name: agent-config-volume
          configMap:
            name: agent-config-map
            items:
              - key: agent.config
                path: agent.config
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
        - name: elasticsearch
          image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
          env:
            - name: node.name
              value: elasticsearch
            - name: cluster.name
              value: elasticsearch
            - name: discovery.seed_hosts
              value: elasticsearch
            - name: cluster.initial_master_nodes
              value: elasticsearch
            - name: bootstrap.memory_lock
              value: "true"
            - name: ES_JAVA_OPTS
              value: -Xms512m -Xmx512m
          resources:
            limits:
              cpu: 1
              memory: 512Mi
            requests:
              cpu: 0.5
              memory: 256Mi
          volumeMounts:
            - name: elasticsearch-data
              mountPath: /usr/share/elasticsearch/data
      volumes:
        - name: elasticsearch-data
          emptyDir: {}

在deployment.yaml文件中,我们定义了三个Deployment:myapp-deployment、skywalking-oap-deployment和elasticsearch-deployment。其中,myapp-deployment代表了我们的Spring Boot应用程序,skywalking-oap-deployment代表了SkyWalking Collector,elasticsearch-deployment代表了Elasticsearch。

在deployment.yaml文件中,我们为每个Deployment定义了一个或多个容器,每个容器都有自己的环境变量、资源请求、端口暴露和数据卷定义。我们可以在这些容器中实现对SkyWalking Agent和SkyWalking Collector的整合。

  1. 启动Kubernetes

执行以下命令启动Kubernetes:

kubectl apply -f deployment.yaml

在启动完成后,我们可以访问Kubernetes集群中的SkyWalking Collector,进行应用程序的监控。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用docker部署spring boot并接入skywalking的方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring-boot 2.3.x源码基于Gradle编译过程详解

    下面我会详细讲解“Spring-boot 2.3.x源码基于Gradle编译过程详解”的攻略。 标题 Spring-boot 2.3.x源码基于Gradle编译过程详解 代码块 在markdown中,我们可以使用代码块来展示代码,格式如下: Your code goes here 或者指定代码块的语言,格式如下: Your code goes here 正文…

    Java 2023年5月26日
    00
  • Springboot拦截器如何获取@RequestBody参数

    下面是关于Spring Boot拦截器如何获取@RequestBody参数的攻略。 什么是拦截器 拦截器是Spring框架中的一个组件,它是在请求到达Controller之前或离开Controller之后执行的代码块。拦截器主要用于对请求进行预处理和后处理,在预处理中可以实现一些安全性检查和参数校验等操作,而后处理中可以对响应结果进行处理。 如何获取@Req…

    Java 2023年5月20日
    00
  • 当 SQL Server(mssql-jdbc) 遇上 BigDecimal → 精度丢失,真坑!

    开心一刻   中午和哥们一起喝茶   哥们说道:晚上喝酒去啊   我:不去,我女朋友过生日   哥们瞪大眼睛看着我:你有病吧,充气的过什么生日   我生气到:有特么生产日期的好吧 需求背景   系统对接了外部系统,调用外部系统的接口需要付费,一个接口一次调用付费 0.03 元   同一个月内,同一个接口最高付费 25 元   统计每个月的付费情况   需求清…

    Java 2023年4月28日
    00
  • 什么是Java认证授权?

    Java认证和授权是Java安全机制中的两个重要概念。认证(Authentication)是指验证用户身份的过程,确定他们是否有权访问一些特定的资源或服务。而授权(Authorization)是指在确定用户身份之后,确定他们是否有权执行特定的操作。Java提供了一些API和框架,用于简化和处理身份验证和授权的复杂性。 一些常见的Java认证授权机制包括: J…

    Java 2023年5月11日
    00
  • Apache Tomcat如何高并发处理请求

    Apache Tomcat是一个流行的Java Servlet容器和Web服务器,可以用于实现Java Web应用程序。在高并发场景下,Tomcat的性能和可靠性非常重要。下面是Apache Tomcat高并发处理请求的攻略。 1. Tomcat的性能调优 Tomcat的性能取决于很多因素,如服务器硬件配置、JVM参数设置、Tomcat连接池配置等。以下是T…

    Java 2023年6月2日
    00
  • Spring Security基本架构与初始化操作流程详解

    Spring Security基本架构与初始化操作流程详解 什么是Spring Security Spring Security是一个基于Spring框架的安全解决方案,主要解决应用程序的认证和授权问题。它提供了一整套安全服务,并可在Web请求级和方法调用级处理身份验证和授权。 Spring Security基本架构 Spring Security的基本架构…

    Java 2023年5月20日
    00
  • 让JPA的Query查询接口返回Map对象的方法

    要让JPA的Query查询接口返回Map对象,可以使用以下方法: 使用JPA自带的元模型(Metamodel)生成查询结果为Map的查询语句 通过Metamodel可以访问实体的属性,例如,对于一个名为User的实体,可以通过以下代码访问它的属性:User_.name 示例代码: CriteriaBuilder cb = entityManager.getC…

    Java 2023年5月20日
    00
  • Java for循环标签跳转到指定位置

    大家是否见过这种for循环,在for循环前加了个标记的: outerLoop: for (; ; ) { for (; ; ) { break outerLoop; } } 我之前有一次在公司业务代码中见过有这种写法的,没在意,今天在看JDK线程池的代码时,又看到ThreadPoolExecutor的addWorker方法中有这种写法。于是就查了相关资料,也…

    Java 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部