微服务与docker

发布于:2025-02-10 ⋅ 阅读:(47) ⋅ 点赞:(0)

准备工作

在课前资料中给大家提供了黑马商城项目的资料,我们需要先导入这个单体项目。不过需要注意的是,本篇及后续的微服务学习都是基于Centos7系统下的Docker部署,因此你必须做好一些准备:

  • Centos7的环境及一个好用的SSH客户端
  • 装好Docker
  • 会使用Docker

如果是学习过上面Docker课程的同学,虚拟机中已经有了黑马商城项目及MySQL数据库了,不过为了跟其他同学保持一致,可以先将整个项目移除。使用下面的命令:

cd /root
docker compose down

移除掉之前的MySQL的相关镜像

docker rmi root-hmall:latest mysql

删除所有的mysql相关配置

这里是引用

将之前准备的mysql的文件移动到Linux服务器上的root文件夹下

在这里插入图片描述

重新安装MySQL之前,需要配置重新创建网络,保证后续容器都在一个网络中

docker network create hm-net
docker network ls

在这里插入图片描述

创建MySQL的容器

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v /root/mysql/data:/var/lib/mysql \
  -v /root/mysql/conf:/etc/mysql/conf.d \
  -v /root/mysql/init:/docker-entrypoint-initdb.d \
  --network hm-net\
  mysql

查看一下容器列表

docker ps

在这里插入图片描述

看一下java的项目结构

将项目移动到自己的本地目录下

在这里插入图片描述

开发环境和正式环境的主要是靠profile进行区分的

在这里插入图片描述

直接启动会使用默认的配置:dev

在这里插入图片描述

启动参数是可以配置的,我们可以配置成local

在这里插入图片描述

在这里插入图片描述

启动之后显示的配置文件是这样的

在这里插入图片描述

访问一下这个地址:http://localhost:8080/hi

在这里插入图片描述

将nginx也移动到到这个目录下

在这里插入图片描述

启动一下,发现一闪而过,其实已经启动成功

start nginx.exe

在这里插入图片描述

启动异常的话,可以在日志文件中查看详细的信息

在这里插入图片描述

访问一下这个地址:http://localhost:18080/

在这里插入图片描述
在这里插入图片描述

能够登录成功说明,前后端是通的,不通的话,查看Java程序,看看哪个地方报错

单体架构

> 单体架构存在一些问题:

并发量大的时候,重要的功能可能被不重要的功能阻塞

搜索功能的平均响应时间是60ms

在这里插入图片描述

  • 高并发的访问不重要的接口,会导致这个接口的新能下降

在这里插入图片描述

微服务

微服务架构,是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体体架构中的功能模块拆分为多个独立的项目。

  • 粒度小
  • 团队自治
  • 服务自治

各个服务在不同容器中,商品服务宕机了不会导致交易容器的卡顿

在这里插入图片描述

熟悉原项目

登录

在这里插入图片描述

创建token使用的是hutool工具类中的方法

在这里插入图片描述

String token = jwtTool.createToken(user.getId(), jwtProperties.getTokenTTL());

自定义了一个工具类,工具类调用的其实还是hutool的create方法来创建JWT

/**
 * 创建 access-token
 *
 * @param userDTO 用户信息
 * @return access-token
 */
public String createToken(Long userId, Duration ttl) {
   
    // 1.生成jws
    return JWT.create()
            .setPayload("user", userId)
            .setExpiresAt(new Date(System.currentTimeMillis() + ttl.toMillis()))
            .setSigner(jwtSigner)
            .sign();
}

拦截器获取用户的信息(用于权限鉴定和提示用户登录)

拦截器中定义了一个前置方法,用于获取请求头中的token,

在这里插入图片描述

  • tomcat对于每个请求,都是一个请求单独一个线程
  • 在UserContext中,用户的id只会设置在当前线程的线程域中

在这里插入图片描述

购物车

当商品价格变化的时候,可以看到价格的变化

  • 因为购物车中存储的是当时价格,然后再去获取现在商品的价格

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模块

在这里插入图片描述

服务拆分原则

什么时候需要拆分

在这里插入图片描述

如何进行拆分

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到