今日练习

简介: 本作业旨在掌握Docker部署微服务中间件及完整工程的流程,涵盖Nacos、MySQL、耗材中心、医生站与网关服务的安装、配置、容器化构建与访问验证,结合Dockerfile和docker-compose实现多服务协同。

作业目标

  • 掌握Docker对于常见微服务中间件的安装、部署、运行
  • 掌握Docker对于微服务的安装,尤其是陌生的一个工程从数据库->工程->访问

工程介绍

工程结构图

技术架构图

物理部署图


环境准备

  • 通过docker images、docker ps -a指令确保本地无任何镜像、运行中的容器,如有借助
  • docker rmi -f 镜像,删除镜像
  • docker rm -f 容器,删除容器
  • mysql涉及的表结构语句,数据库:doctor_station,建表语句: 📎doctor_station.sql
  • 今日所有镜像文件上传路径:/tmp/docker,需在tmp下手动创建docker文件夹
cd /tmp
mkdir docker

题目一

目标

完成Docker环境下Nacos服务部署、启动、访问验证

提示

  • 去dockerhub官网找到Nacos,查看拉取、启动指令,启动完成后浏览器验证

参考答案

  • dockerhub查看服务拉取指令:docker pull nacos/nacos-server

  • /tmp/docker路径下,执行docker pull指令

  • 查看官网启动指令,并调整如下:
  • 官网 Quick Start
docker run --name nacos-quick -e MODE=standalone -p 8849:8848 -d nacos/nacos-server:2.0.2
  • 调整指令如下:
  • 修改登录用户名:nacos,密码默认是nacos不用修改
  • 修改宿主机暴露端口:8848
  • 修改镜像名称:当前使用latest,不用声明
docker run --name nacos -e MODE=standalone -p 8848:8848 -d nacos/nacos-server
  • 访问验证


题目二

目标

完成Docker环境下MySQL服务部署、启动、访问验证,并完成表结构、数据导入

提示

  • 参照dockerhub官网完成mysql安装
  • 本地Navicat等可视化工具连接后,完成表结构、数据的导入

参考答案

  • dockerhub查看服务拉取指令:docker pull mysql

  • /tmp/docker路径下,执行docker pull指令

  • 官网查看启动指令,并调整如下:
  • 官网 Quick Start
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
  • 修改如下,并执行启动
  • 修改用户名
  • 修改密码
  • 修改镜像名称
docker run --name root -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
  • 启动后,客户端连接访问

  • 注意:此时安装的latest版本比较高,部分可视化工具可能链接不是
  • 导入环境准备中的表结构语句,如下:


题目三(*)

目标

完成Docker环境下耗材中心服务部署、启动、访问验证

提示

  • mysql服务、nacos需更改原来的localhost为对应ip
  • 需创建对应的Dockerfile、docker-compose.yml,其中docker-compose.yml不要重复定义nacos、mysql,避免重复启动
  • nacos配置文件需同步过来:inventoryservice-dev.yaml
inventory:
 stopStartTime: 2023-10-01 23:59:59
 stopEndTime: 2023-10-02 02:00:00
  • 为保证访问,前期可以在docker-compose.yml中暴露此服务端口,以验证是否部署成功
  • 日志查看路径:/var/lib/docker/containers/容器ID-json.log,如启动失败可以在这里查看错误原因,如我最初没有同步nacos配置文件

参考答案

  • 修改application.yml、bootstrap.yml,这里更改了IP【注意你自己的需调整成自己的】
server:
  port: 8081
spring:
  application:
    name: inventoryservice # 库存服务
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.206.129:3306/doctor_station?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
    username: root
    password: root
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
  • pom.xml增加构建信息
<build>
    <!-- 服务打包的最终名称 -->
    <finalName>inventory</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  • 执行maven-clean-package,编译打包,在target中找到上述finalName名称的jar
  • 新建:Dockerfile,并与inventory.jar放在文件夹:inventory中
FROM java:8-alpine
COPY ./inventory.jar /tmp/inventory.jar
ENTRYPOINT java -jar /tmp/inventory.jar
  • 新建:docker-compose.yml,放在文件夹:doctor-station中
version: "3.2"
services:
  inventoryservice:
    build: ./inventory
    ports:
      - "8081:8081"
  • 上述整体目录结构目前如下:
  • doctor-station
  • inventory
  • Dockerfile
  • inventory.jar
  • docker-compose.yml
  • 上传整个文件夹,到:/tmp/docker/
  • 执行启动命令: docker-compose up -d

  • postman请求验证:


题目四

目标

完成Docker环境下医生站部署、启动、访问验证

提示

同题目二提示

参考答案

  • 修改doctor-service配置文件
  • application.yml
server:
  port: 8088
spring:
  application:
    name: doctorservice
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.206.129:3306/doctor_station?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
    username: root
    password: root
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
feign:
  client:
    config:
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: BASIC #  日志级别
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数
  • bootstrap.yml
spring:
  application:
    name: doctorservice # 服务名称
  profiles:
    active: test # 当前使用test环境
  cloud:
    nacos:
      server-addr: 192.168.206.129:8848
      config:
        file-extension: yaml # 文件后缀名
  • pom文件增加构建信息,并打包
<build>
    <!-- 服务打包的最终名称 -->
    <finalName>doctor</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  • 创建Dockerfile
FROM java:8-alpine
COPY ./doctor.jar /tmp/doctor.jar
ENTRYPOINT java -jar /tmp/doctor.jar
  • 修改docker-compose.yml,追加doctor相关信息
version: "3.2"
services:
  doctorservice:
    build: ./doctor
    ports:
      - "8088:8088"
  inventoryservice:
    build: ./inventory
    ports:
      - "8081:8081"
  • 上述整体目录结构目前如下:
  • doctor-station
  • inventory
  • Dockerfile
  • inventory.jar
  • doctor
  • Dockerfile
  • doctor.jar
  • docker-compose.yml

  • 上传doctor到doctor-station文件夹下,重新上传:docker-compose.yml
  • 停止原inventory服务:docker rm -f,并删除已有的镜像
  • 执行语句重启整个微服务:docker-compose up -d。注意一定是重新构建两个才可以,否则删除镜像、容器后重新启动

  • postman测试验证,启动构建完成后稍等一下再访问,可以通过查看日志是否启动成功再决定是否访问


题目五

目标

完成Docker环境下网关服务部署、启动、访问验证

提示

  • 参照作业二完成部署,但是此时暴露端口只暴露网关,其余都不暴露

参考答案

  • 修改配置文件:application.yml
server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.206.129:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: inventory-service # 路由id,自定义,只要唯一即可
          uri: lb://inventoryservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/inventory/** # 这个是按照路径匹配,只要以/user/开头就符合要求
        - id: doctor-service # 路由id,自定义,只要唯一即可
          uri: lb://doctorservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/doctor/** # 这个是按照路径匹配,只要以/user/开头就符合要求
  • pom文件增加构建信息,并打包
<build>
    <!-- 服务打包的最终名称 -->
    <finalName>gateway</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  • 创建Dockerfile
FROM java:8-alpine
COPY ./gateway.jar /tmp/gateway.jar
ENTRYPOINT java -jar /tmp/gateway.jar
  • 修改:docker-compose.yml文件,注意端口
version: "3.2"
services:
  doctorservice:
    build: ./doctor
  inventoryservice:
    build: ./inventory
  gateway:
    build: ./gateway
    ports:
      - "10010:10010"
  • 上传gateway,重新上传:docker-compose.yml文件,整体结构如下

  • 删除容器、镜像,并重启

  • 重启:docker-compose up -d

  • postman验证
  • 不设置权限,403禁止访问

  • 设置后访问正常


相关文章
|
2月前
|
Java 测试技术 Linux
生产环境发布管理
本文介绍大型团队中多环境自动化部署实践,涵盖DEV、TEST、PRE、PROD各环境职责,结合CI/CD平台实现代码发布与回滚,并通过Skywalking等工具高效排查日志,提升发布效率与系统稳定性。
|
2月前
|
关系型数据库 应用服务中间件 nginx
容器化部署引擎Docker
Docker是一种轻量级容器化技术,通过镜像打包应用及依赖,实现跨环境一致部署。它利用沙箱机制隔离容器,解决开发、测试、生产环境差异与组件兼容性问题,相比虚拟机更高效便捷,提升应用交付效率。
容器化部署引擎Docker
|
10月前
|
人工智能 网络协议 Linux
MCP 协议: Streamable HTTP 是最佳选择
随着AI应用变得越来越复杂并被广泛部署,原有的通信机制面临着一系列挑战。近期MCP仓库的PR #206引入了一个全新的Streamable HTTP传输层替代原有的HTTP+SSE传输层。本文将详细分析该协议的技术细节和实际优势。
5905 102
|
2月前
|
Kubernetes IDE 应用服务中间件
2.部署篇(开发部署)
本文介绍如何将SpringCloud应用部署到Kubernetes云端,基于EDAS实现快速上云。涵盖集群导入、应用初始化及通过IDE插件高效部署,助力开发者提升发布效率。
|
2月前
|
SQL 容灾 数据库
分布式事务Seata
本章节深入探讨分布式事务问题,涵盖CAP定理与BASE理论,重点讲解Seata框架的XA、AT、TCC及SAGA四种模式原理与实现,并指导搭建高可用TC服务集群,确保微服务架构下的数据一致性与系统可靠性。
分布式事务Seata
|
2月前
|
消息中间件 Java Nacos
SpringCloud概述
Spring Cloud是Spring团队推出的微服务一站式解决方案,弥补了各独立组件(如Nacos、RabbitMQ等)缺乏统一架构的不足。其特点为约定优于配置、组件丰富、开箱即用,支持云原生。版本以伦敦地铁站命名,避免与子项目冲突。Spring Cloud Alibaba由阿里贡献,集成Nacos、Sentinel、Seata等成熟组件,因Netflix套件停更,现成为主流选择,功能更完整且经大规模验证,是当前微服务架构的优选技术栈。
|
2月前
|
消息中间件 负载均衡 Linux
RabbitMQ部署指南
本文介绍了RabbitMQ在CentOS7上基于Docker的单机与集群部署方案,涵盖镜像安装、DelayExchange插件配置、普通模式与镜像模式集群搭建,并重点演示了仲裁队列的高可用特性及集群扩容方法,助力构建稳定可靠的消息中间件服务。
RabbitMQ部署指南
|
11月前
|
消息中间件 算法 数据库
如果解决MQ消息堆积问题
如果解决MQ消息堆积问题
|
2月前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图。横轴为对象,纵轴为时间,通过生命线、控制焦点和各类消息展示动态协作过程,强调交互的时间先后与并发行为,常用于系统设计与分析。
|
2月前
|
存储 Dubbo API
SpringCloud工程部署启动
本文介绍SpringCloud微服务工程搭建全过程,涵盖项目创建、模块配置、数据库部署及服务远程调用实现。通过两种方案导入工程,完成user-service与order-service的构建,并使用RestTemplate实现跨服务数据调用,帮助理解微服务间通信机制与拆分设计。