给为服务添加运维模块 统一管理(第四期)

1.背景

随着微服务拆分开来,伴随着服务数量变多涉及到管理问题。比如很多常见的管理界面。Nacos的管理界面。熔断限流的管理界面。以及docker的管理等。所以一个专门管理各种运维的微服务是必要的。

2.明确功能

1.解决docker管理的痛点。比如说启动容器。关闭容器等。直接使用命令行操作的话略显麻烦。对于java boy来说能用java解决就不用命令行了。我们选用docker -java来完成相关来操作java。然后前端管理页面选用iframe嵌套各个微服务提供的包。比如 nacos 提供的包。嵌套进入后台管理系统来完成
还是用到了dockerfile 打包镜像。当时使用sentinel-dashboard的时候使用的是java命令行启动的。将其打包。然后放入docker容器一起管理。

3.操作步骤

3.1 添加依赖
    	 <dependency>
            <groupId>com.github.docker-javagroupId>
            <artifactId>docker-javaartifactId>
            <version>3.2.5version>
        dependency>
        
        <dependency>
            <groupId>com.github.docker-javagroupId>
            <artifactId>docker-java-transport-okhttpartifactId>
            <version>3.2.5version>
        dependency>

3.2 工具类

操作docker的需要这两个依赖。然后添加工具类

package com.rose.util;

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.PullImageCmd;
import com.github.dockerjava.api.model.*;
import com.github.dockerjava.core.DockerClientBuilder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author rose
 * @create 2022/11/5
 */

public class DockerProtocol{


    public DockerClient connectDocker(){
        DockerClient dockerClient = DockerClientBuilder.getInstance("tcp://192.168.56.20:2375").build();
        Info info = dockerClient.infoCmd().exec();
        return dockerClient;
    }

    //开始容器
    public void startContainer(DockerClient client,String containerId){
        client.startContainerCmd(containerId).exec();
    }
    //停止容器
    public void stopContainer(DockerClient client,String containerId){
        client.stopContainerCmd(containerId).exec();
    }
    //加载镜像
    public LoadImageCmd loadImage(DockerClient client, String filePath){
        LoadImageCmd loadImageCmd = null;
        try {
            loadImageCmd = client.loadImageCmd(new FileInputStream(filePath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return loadImageCmd;
    }

    /**
     * repository 镜像名称:tag名称
     **/
    public PullImageCmd pullImage(DockerClient client, String repository){
        PullImageCmd pullImageCmd = client.pullImageCmd(repository);
        return pullImageCmd;
    }
    //删除镜像
    public void removeImage(DockerClient client,String imageId){
        client.removeImageCmd(imageId).exec();
    }



    public static void main(String[] args) {
        DockerProtocol docker = new DockerProtocol();

        DockerClient dockerClient = docker.connectDocker();
        docker.startContainer(dockerClient,"21e7d7460196");
//        docker.startContainer(dockerClient,"38dc3681aa87");
//        docker.stopContainer(dockerClient,"38dc3681aa87");


    }

}

这里面防止了一些常用的工具类。还有就是为了更好的与web继承。需要引入springboot 依赖。
有一个依赖需要注意一下。

  <dependency>
            <groupId>com.rose.yan</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <groupId>javax.validation</groupId>
                    <artifactId>validation-api</artifactId>
                </exclusion>

                <exclusion>
                    <groupId>javax.ws.rs</groupId>
                    <artifactId>jsr311-api</artifactId>
                </exclusion>
            </exclusions>


        </dependency>

我的项目是这个common包里面包含了很多的服务发现服务注册和熔断限流等功能。但是其中一个包有冲突。需要将javax.ws.rs这个排除掉。否则web端调用的时候会出现调用不通的问题。

3.3 controller层的调用方法
    /**
     * 启动容器.
     * @return
     */
    @GetMapping("/containerStart")
    public GenericResponse containerStart(@RequestParam("type") String file) {
        try {
            DockerProtocol dockerProtocol = new DockerProtocol();
            DockerClient dockerClient = dockerProtocol.connectDocker();
            if(ContainerId.RABBITMQ.equals(file)){
                dockerProtocol.startContainer(dockerClient, ContainerId.RABBIT_ID);
            }
            if(ContainerId.REDIS.equals(file)){
                dockerProtocol.startContainer(dockerClient, ContainerId.REDIS_ID);
            }
            return GenericResponse.response(ServiceError.NORMAL);
        }catch(Exception e){
            return GenericResponse.response(ServiceError.DevopsError);
        }


    }

4. dockerfile 构建镜像

每次本地启用sentinel 太过于麻烦。所以采用docker镜像管理 更方便的使用。

4.1 第一步 自己构建docker镜像

#java 版本
FROM java:8
##挂载的docker卷
VOLUME /tmp
#前者是要操作的jar包  后者自定义jar包名
ADD *.jar sentinel-dashboard.jar
#定义时区参数
ENV TZ=Asia/Shanghai
#设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
#配置启动命令,-D表示设置JVM参数
ENTRYPOINT ["java","-jar","-Dserver.port=8858","-Dcsp.sentinel.dashboard.server=172.18.181.35:8858","-Dproject.name=sentinel-dashboard","/sentinel-dashboard.jar"]

4.2 在目录下面输入命令

docker build -t saas/collectcode/sentinel-dashboard .(镜像名称自行定义)

4.3启动镜像

docker run --name collectcode_sentinel --restart=always --privileged=true -p 8858:8858 -d saas/collectcode/sentinel-dashboard

访问端口

你可能感兴趣的:(docker,java)