入门级-最详细的springboot dubbo分布式项目docker部署全过程

一 项目的准备

没有项目的同学,可以跳过
项目目录结构
项目目录

项目的部分配置文件

server:
  port: 2002
spring:
  datasource:
    username: root
    password: 你的密码
    #mysql8版本以上的驱动包,需要指定以下时区
    url: jdbc:mysql://193.112.249.143:3306/dgut_bilibili?serverTimezone=GMT%2B8&characterEncoding=utf-8
    #mysql8版本以上指定新的驱动类
    driver-class-name: com.mysql.cj.jdbc.Driver
    #引入Druid数据源
    type: com.alibaba.druid.pool.DruidDataSource




#当前服务/应用的名字
dubbo:
  application:
    name: video

  #注册中心的协议和地址
  registry:
    address: 193.112.249.143:2181
    protocol: zookeeper

  #通信规则(通信协议和接口)
  protocol:
    name: dubbo
    port: 20883

  #连接监控中心
  monitor:
    protocol: register


#配置mybatis相关文件路径
mybatis:
  #映射配置文件路径
  mapper-locations: classpath:mybatis/mapper/*.xml
  #核心配置文件路径
  #  config-location: classpath:mybatis/mybatis-config.xml
  type-aliases-package: com.dgut.entity.video
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    com.dgut.video.mapper: debug

二 项目的打包

本项目部署是打包成jar包,使用docker,前后端分离部署。前后端不分离的同学,建议打包成war进行tomcat部署。本教程没有哦~~

1.项目打包需要的pom配置

首先是父工程的pom文件配置

	因为是springboot的项目,所以继承spring-boot-starter-parent。
	重要的需要指定每个<module>子项目。
	注意父工程是不需要maven打包插件的。
	
    <modelVersion>4.0.0</modelVersion>

    <packaging>pom</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.dgut</groupId>
    <artifactId>dgut-bilibili</artifactId>
    <version>1.0-SNAPSHOT</version>


    <modules>
        <module>bilibili-client</module>
        <module>user</module>
        <module>service-api</module>
        <module>redis</module>
        <module>video</module>
        <module>log</module>
        <module>comment</module>
        <module>album</module>
        <module>admin</module>
        <module>manager</module>
        <module>authority</module>
    </modules>

然后是子工程pom配置

	你的父工程配置

    <parent>
        <artifactId>dgut-bilibili</artifactId>
        <groupId>com.dgut</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    
    注意需要指定当前工程的Id
    <artifactId>redis</artifactId>


    <dependencies>
        你的相关依赖
    </dependencies>
	
	打包一定需要,每一个子模块都需要打包插件,不然不能打包
	这个需要注意的是,最后的业务项目模块才需要。如果是只需要被引用的一个单独的包,
	是不需要添加打包插件的。比如单独抽离的service-api包,是被每个业务模块共同引用的,
	是不需要插件打包的。
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2 项目打包

使用idea打包成jar包

打包的时候注意将右上角的闪电标志点击去掉打包测试test,不然打包会很慢

直接到父工程dgut-bilibili项目打包会将所有的工程都打包成jar包
到单独的模块打包是只打包一个模块

使用idea的maven打包工具打包后的jar包一般在target目录中

在这里插入图片描述

三 Centos中docker的安装和使用

本教程只是Centos镜像下的安装,如果是ubuntu的同学请另寻教程

1.Centos 6+版本,安装docker,依次执行以下命令

安装epel仓库
yum install -y epel-release

安装docker
yum install -y docker-io

安装后的配置文件查看
cat /etc/sysconfig/docker

启动docker服务
service docker start 

验证docker
docker version

2.Centos 7+版本,安装docker,依次执行以下命令

安装gcc相关依赖
yum -y install gcc
yun -y install gcc-c++

卸载旧版本
yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-selinux \
    docker-engine-selinux \
    docker-engine
    
安装需要的软件包
yum install install -y yum-utils device-mapper-persistent-data lvm2

设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum软件索引
yum makecache fast

安装docker
yun -y install docker-ce

启动docker
systemctl start docker 

测试
docker version #查看版本
docker run hello-world #运行hello-world镜像
docker ps #查看运行容器

配置阿里云镜像加速,如果不配的话镜像下载会从国外下载,会很慢。
mkdir -p /etc/docker #新建一个目录
vim /etc/docker/daemon.json # 新建编辑json文件

打开文件后输入
{
  "registry-mirrors": ["https://5hrp3vzq.mirror.aliyuncs.com"]
}
然后退出保存,继续执行

systemctl daemon-reload
systemctl restart docker

配置完成

可以参考官网的配置:docker官网centos安装

四.docker中安装mysql

安装

#拉取mysql镜像,我拉取的是5.6版本,需要其他版本的可以自行拉取,注意事项未知。
docker pull mysql:5.6

#启动mysql容器
docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

命令说明:
-p 3306:3306:将主机的3306端口映射到docker容器的3306端口。
--name mysql:运行服务名字
-v /home/mysql/conf:/etc/mysql/conf.d :将主机/home/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d
-v /home/mysql/logs:/logs:将主机/home/mysql目录下的 logs 目录挂载到容器的 /logs。
-v /home/mysql/data:/var/lib/mysql:将主机/home/mysql目录下的data目录挂载到容器的 /var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
-d mysql:5.6:后台程序运行mysql5.6

使用window连接服务器的mysql,使用的navicat工具,注意服务器的主机ip的外网ip,云服务器的3306端口需要对外暴露,也就是配置好安全组
连接服务器

五.docker中安装redis

安装

#拉取redis镜像
docker pull redis:3.2

#运行redis容器
docker run -p 6379:6379 --requirepass "mypassword" -v /home/myredis/data:/data -v /home/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf  -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes

命令说明:
--requirepass "mypassword" : 设置redis的密码

window连接redis,使用的是RedisDesktopManager管理工具连接,同样的需要配置安全组,暴露6379端口,使用外网ip连接
window连接redis

六.docker安装配置fastDfs

安装

拉取fastDfs镜像
docker pull delron/fastdfs #拉取最新版本

启动tracker容器
docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs -v /etc/localtime:/etc/localtime delron/fastdfs tracker

启动storage容器
docker run -d  --network=host --name storage -e TRACKER_SERVER=192.168.56.1:22122 -v /var/fdfs/storage:/var/fdfs  -v /etc/localtime:/etc/localtime  delron/fastdfs storage

说明:
-e TRACKER_SERVER=192.168.56.1:22122    ip地址使用服务器的外网ip地址

storage的内置nginx端口是8888
可进入storage容器测试文件上传。

java使用fastDfs

pom文件中引用客户端支持

      <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.2</version>
        </dependency>

yml中配置

# 分布式文件系统FDFS配置
fdfs:
  soTimeout: 6000 #socket连接超时时长
  connectTimeout: 6000 #连接tracker服务器超时时长
  reqHost: 193.112.249.143   #nginx访问地址
  reqPort: 8888              #nginx访问端口
  thumbImage: #缩略图生成参数,可选
    width: 150
    height: 150
  trackerList: #TrackerList参数,支持多个,我这里只有一个,如果有多个在下方加- x.x.x.x:port
    193.112.249.143:22122

java上传下载工具类

public class FastDFSClientUtil {

	//nginx访问地址
    @Value("${fdfs.reqHost}")
    private String reqHost;
    
	//nginx访问端口
    @Value("${fdfs.reqPort}")
    private String reqPort;

	//自动注入storage客户端
    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private ThumbImageConfig thumbImageConfig; //创建缩略图   , 缩略图访问有问题,暂未解决


    public String uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null);
        String path = thumbImageConfig.getThumbImagePath(storePath.getPath()) ;
        System.out.println("thumbImage :" + path);  //   缩略图访问有问题,暂未解决
        return getResAccessUrl(storePath);
    }

    public void delFile(String filePath) {
        storageClient.deleteFile(filePath);

    }


    public InputStream download(String groupName, String path) {
        InputStream ins =  storageClient.downloadFile(groupName, path, new DownloadCallback<InputStream>(){
            @Override
            public InputStream recv(InputStream ins) throws IOException {
                // 将此ins返回给上面的ins
                return ins;
            }}) ;
        return ins ;
    }

    /**
     * 封装文件完整URL地址
     * @param storePath
     * @return
     */
    private String getResAccessUrl(StorePath storePath) {
        String fileUrl = "http://" + reqHost + ":" + reqPort + "/" + storePath.getFullPath();
        return fileUrl;
    }
}

七.zookeeper服务器的搭建

安装

#拉取镜像
docker pull zookeeper

#运行容器
docker run --privileged=true -d --name zookeeper --publish 2181:2181  -d zookeeper:latest

进行到这一步的linux的容器运行情况,应有redis,mysql,tracker,storage,zookeeper
在这里插入图片描述连接使用zookeeper
服务器配置安全组,暴露2081端口
然后dubbo服务yml配置

#当前服务/应用的名字
dubbo:
  application:
    name: user

  #注册中心的协议和地址
  registry:
    address: 193.112.249.143:2181 #这个端口应该是服务器的外网ip
    protocol: zookeeper

  #通信规则(通信协议和端口口)
  protocol:
    name: dubbo
    port: 20882 #每个服务的协议端口不同

  #连接监控中心
  monitor:
    protocol: register

启动单个服务进行测试服务注册

八.duboo服务部署

博主使用的是MobaXterm工具连接服务器的。同时可以上传文件,比较方便

1.上传jar包至服务器,并编写Dockerfile文件
上传jar包Dockerfile文件内容

# 加载java8进项
FROM java:8
# 作者
MAINTAINER eangulee <eangulee@gmail.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME  /home/tmp

#注意你的包名
# 将jar包添加到容器中并更名为app.jar
ADD app-1.0-SNAPSHOT.jar app.jar 

# 运行jar包
#注意你的包名
RUN bash -c 'touch /app.jar'

#注意你的包名
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2.然后进入Dockerfile的文件目录下构建镜像

#image-name 是你要取的镜像名字 
docker build -t images-name .

#查看构建的镜像
docker images

大概如下
镜像列表3.运行dubbo服务容器

重点:

  1. 注册ip一定是外网ip
  2. 不同服务器访问服务,一定要使dubbo协议端口对另一台机器暴露。比如 ‘服务提供者-1’ 在linux-1上,zookeeper和‘服务消费者-1’在linux-2上,消费者需要调用服务提供者-1,则‘服务提供者-1’ 的linux-1上需要对linux-2暴露它的dubbo协议端口。
docker run -d --name serviceName -e DUBBO_IP_TO_REGISTRY=30.5.97.6 -e DUBBO_PORT_TO_REGISTRY=20881 -p 2001:2001 -p 20881:20881 imagesName

命令说明
-d  后台运行
--name  设置启动容器的名字
-e DUBBO_IP_TO_REGISTRY=30.5.97.6  这个是设置向zookeeper祖册服务的ip地址,一定要是当前服务所在机器的公网ip地址,不然不同服务器之间会访问不了,因为默认的本机的内网ip地址
-e DUBBO_PORT_TO_REGISTRY=20881  这个是协议的注册端口
-p 2001:2001 -p 20881:20881 对外暴露server端口和dubbo协议端口
serviceName 容器名称
imagesName  要运行的镜像

运行后通过

docker logs -f 容器id或者容器名

查看运行日志,日志输出格式就是项目运行的格式,都是info就对了

后面重复步骤搭建每个dubbo服务镜像,并启动每个服务,建议是先启动单独服务,需要依赖其他服务的后启动,逐个启动便可以在本机上启动前端去测试了。注意服务的安全组哦~~

下面附上我的项目全部启动后的结果

服务部署机器

在这里插入图片描述

各种服务器部署和数个dubbo服务部署机器

在这里插入图片描述温馨提示: 服务器可以从阿里云或者腾讯云获取10块钱每月的学生机器,亚马逊云也是有学生机器的。

本博主是分别在两个地方各买一台才勉强配置完的~~~

九.docker安装nginx并部署vue项目

vue项目打包

#在vue项目目录下执行
npm run build

然后复制打包后的文件夹dist到linux服务器上
在这里插入图片描述
这是我的两个vue项目打包上传到服务器上的样子。

docker安装nginx

#拉取镜像
docker pull nginx 

#运行容器,自定义名称和暴露端口
docker run -d --name xxx -p 3000:80 nginx:latest

复制vue项目到nginx容器内

#复制,将/home/client/目录下的全部文件复制到容器/usr/share/nginx/html/目录下
docker cp /home/client/. 容器名称或ID:/usr/share/nginx/html/

修改nginx配置文件

新建一个nginx.conf文件,如图

在这里插入图片描述
修改文件内容如下:

 
#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    client_max_body_size   20m;
    server {
        listen       80;
        server_name  localhost;
  
        location / {
        	#是你vue项目在容器内存放的位置
            root  /usr/share/nginx/html/
            try_files $uri $uri/ /index.html;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

复制文件到容器内,覆盖掉原本的配置文件

docker cp /home/nginx.conf 容器名称或ID:/etc/nginx/

操作完成后进入容器,查看对应目录是否存在和配置文件是否修改

docker exec -it 容器ID或名称 bash

#检查完毕后停止容器后在开启
docker stop 容器ID
docker start 容器ID

配置文件目录:/etc/nginx/nginx.conf
vue项目文件目录:/usr/share/nginx/html/
最后服务器设置安全组端口3000,就可以用 外网ip:端口号访问vue项目了

十.博主的项目介绍

项目是模仿bilibili的视频网站哦

使用技术:

MySQL
idea vsCode
Spring MVC,Spring,mybatis技术
Spring boot 整合dubbo,zookeeper搭建分布式微服务。
Shiro框架实现权限管理
使用maven管理,Redis服务器进行缓存管理。
使用fastdfs进行文件分布式管理。
使用docker进行服务运营。
前端使用vue、ElementUI、axios、

不多说上图:

在这里插入图片描述分类查看
在这里插入图片描述视频查看
在这里插入图片描述评论
在这里插入图片描述主页
在这里插入图片描述
在这里插入图片描述最后放一张后台管理
在这里插入图片描述图就不放太多了。

附上项目的访问地址:
客户端: http://193.112.249.143:3000
后台 http://193.112.249.143:3050
服务器学生机不能折腾哦,请收下留情,因为宽带低,网页初次加载会慢哦请等待。注:客户端不支持ie8一下哦,建议谷歌或者火狐浏览器。了解更多可以加q 820186198

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值