• Docker 容器编排


    是什么

            Docker-Compose是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。

            Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器

    能干嘛

            docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?

            如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具。

            例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。

            Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

            可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。

    去哪下

    官网:Compose file version 3 reference | Docker Docs

    官网下载:Overview of installing Docker Compose | Docker Docs

    安装步骤:

    1、验证网络并下载

            curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    2、给文件赋权限

            chmod +x /usr/local/bin/docker-compose

    3、查看安装版本号

            docker-compose --version

    卸载步骤:

    Compose核心概念

    一个文件:docker-compose.yml

    两个要素:

            1、服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器。

            2、工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

    Compose使用的三个步骤

    1、编写Dockerfile定义各个微服务应用并构建出对应的镜像文件。

    2、使用docker-compose.yml,定义一个完整业务单元,安排好整体应用中的各个容器服务。

    3、最后,执行docker-compose up命令,来启动并运行整个应用程序,完成一键部署上线。(加参数-d表示后台静默执行)

    Compose常用命令

    docker-compose -h                                              # 查看帮助

    docker-compose up                                             # 启动所有docker-compose服务

    docker-compose up -d                                         # 启动所有docker-compose服务并后台运行

    docker-compose down                                         # 停止并删除容器、网络、卷、镜像。

    docker-compose exec  yml里面的服务id             # 进入容器实例内部  docker-compose exec docker-compose.yml 文件中写的服务id /bin/bash

    docker-compose ps                               # 展示当前docker-compose编排过的运行的所有容器

    docker-compose top                              # 展示当前docker-compose编排过的容器进程

    docker-compose logs  yml里面的服务id              # 查看容器输出日志

    docker-compose config                                       # 检查配置

    docker-compose config -q                                   # 检查配置,有问题才有输出

    docker-compose restart                                       # 重启服务

    docker-compose start                                          # 启动服务

    docker-compose stop                                          # 停止服务

    Compose编排微服务

    创建微服务项目

    1、建表语句

    CREATE TABLE `t_user` (

      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

      `username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',

      `password` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',

      `sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',

      `deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',

      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表';

    2、建module,服务工程如下:

    3、pom文件

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.5.6version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.atguigu.dockergroupId>
    12. <artifactId>docker_bootartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <properties>
    15. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    16. <maven.compiler.source>1.8maven.compiler.source>
    17. <maven.compiler.target>1.8maven.compiler.target>
    18. <junit.version>4.12junit.version>
    19. <log4j.version>1.2.17log4j.version>
    20. <lombok.version>1.16.18lombok.version>
    21. <mysql.version>5.1.47mysql.version>
    22. <druid.version>1.1.16druid.version>
    23. <mapper.version>4.1.5mapper.version>
    24. <mybatis.spring.boot.version>1.3.0mybatis.spring.boot.version>
    25. properties>
    26. <dependencies>
    27. <dependency>
    28. <groupId>com.google.guavagroupId>
    29. <artifactId>guavaartifactId>
    30. <version>23.0version>
    31. dependency>
    32. <dependency>
    33. <groupId>org.redissongroupId>
    34. <artifactId>redissonartifactId>
    35. <version>3.13.4version>
    36. dependency>
    37. <dependency>
    38. <groupId>org.springframework.bootgroupId>
    39. <artifactId>spring-boot-starter-webartifactId>
    40. dependency>
    41. <dependency>
    42. <groupId>io.springfoxgroupId>
    43. <artifactId>springfox-swagger2artifactId>
    44. <version>2.9.2version>
    45. dependency>
    46. <dependency>
    47. <groupId>io.springfoxgroupId>
    48. <artifactId>springfox-swagger-uiartifactId>
    49. <version>2.9.2version>
    50. dependency>
    51. <dependency>
    52. <groupId>org.springframework.bootgroupId>
    53. <artifactId>spring-boot-starter-data-redisartifactId>
    54. dependency>
    55. <dependency>
    56. <groupId>org.springframework.bootgroupId>
    57. <artifactId>spring-boot-starter-cacheartifactId>
    58. dependency>
    59. <dependency>
    60. <groupId>org.apache.commonsgroupId>
    61. <artifactId>commons-pool2artifactId>
    62. dependency>
    63. <dependency>
    64. <groupId>redis.clientsgroupId>
    65. <artifactId>jedisartifactId>
    66. <version>3.1.0version>
    67. dependency>
    68. <dependency>
    69. <groupId>mysqlgroupId>
    70. <artifactId>mysql-connector-javaartifactId>
    71. <version>5.1.47version>
    72. dependency>
    73. <dependency>
    74. <groupId>com.alibabagroupId>
    75. <artifactId>druid-spring-boot-starterartifactId>
    76. <version>1.1.10version>
    77. dependency>
    78. <dependency>
    79. <groupId>com.alibabagroupId>
    80. <artifactId>druidartifactId>
    81. <version>${druid.version}version>
    82. dependency>
    83. <dependency>
    84. <groupId>org.mybatis.spring.bootgroupId>
    85. <artifactId>mybatis-spring-boot-starterartifactId>
    86. <version>${mybatis.spring.boot.version}version>
    87. dependency>
    88. <dependency>
    89. <groupId>org.springframework.bootgroupId>
    90. <artifactId>spring-boot-starter-amqpartifactId>
    91. dependency>
    92. <dependency>
    93. <groupId>commons-codecgroupId>
    94. <artifactId>commons-codecartifactId>
    95. <version>1.10version>
    96. dependency>
    97. <dependency>
    98. <groupId>cn.hutoolgroupId>
    99. <artifactId>hutool-allartifactId>
    100. <version>5.2.3version>
    101. dependency>
    102. <dependency>
    103. <groupId>junitgroupId>
    104. <artifactId>junitartifactId>
    105. <version>${junit.version}version>
    106. dependency>
    107. <dependency>
    108. <groupId>org.springframework.bootgroupId>
    109. <artifactId>spring-boot-devtoolsartifactId>
    110. <scope>runtimescope>
    111. <optional>trueoptional>
    112. dependency>
    113. <dependency>
    114. <groupId>org.springframework.bootgroupId>
    115. <artifactId>spring-boot-starter-testartifactId>
    116. <scope>testscope>
    117. dependency>
    118. <dependency>
    119. <groupId>log4jgroupId>
    120. <artifactId>log4jartifactId>
    121. <version>${log4j.version}version>
    122. dependency>
    123. <dependency>
    124. <groupId>org.projectlombokgroupId>
    125. <artifactId>lombokartifactId>
    126. <version>${lombok.version}version>
    127. <optional>trueoptional>
    128. dependency>
    129. <dependency>
    130. <groupId>javax.persistencegroupId>
    131. <artifactId>persistence-apiartifactId>
    132. <version>1.0.2version>
    133. dependency>
    134. <dependency>
    135. <groupId>tk.mybatisgroupId>
    136. <artifactId>mapperartifactId>
    137. <version>${mapper.version}version>
    138. dependency>
    139. dependencies>
    140. <build>
    141. <plugins>
    142. <plugin>
    143. <groupId>org.springframework.bootgroupId>
    144. <artifactId>spring-boot-maven-pluginartifactId>
    145. plugin>
    146. <plugin>
    147. <groupId>org.apache.maven.pluginsgroupId>
    148. <artifactId>maven-resources-pluginartifactId>
    149. <version>3.1.0version>
    150. plugin>
    151. plugins>
    152. build>
    153. project>

    4、yaml文件(这里的mysql和redis使用redis中的服务名、通过服务名访问,IP无关)

    server.port=6001
    # ========================alibaba.druid相关配置=====================
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://mysql:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.druid.test-while-idle=false
    # ========================redis相关配置=====================
    spring.redis.database=0
    spring.redis.host=redis
    spring.redis.port=6379
    spring.redis.password=
    spring.redis.lettuce.pool.max-active=8
    spring.redis.lettuce.pool.max-wait=-1ms
    spring.redis.lettuce.pool.max-idle=8
    spring.redis.lettuce.pool.min-idle=0
    # ========================mybatis相关配置===================
    mybatis.mapper-locations=classpath:mapper/*.xml
    mybatis.type-aliases-package=com.atguigu.docker.entities
    # ========================swagger=====================
    spring.swagger2.enabled=true

    5、主启动文件

    1. import org.springframework.boot.SpringApplication;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. import tk.mybatis.spring.annotation.MapperScan;
    4. @SpringBootApplication
    5. @MapperScan("com.atguigu.docker.mapper") //import tk.mybatis.spring.annotation.MapperScan;
    6. public class DockerBootApplication {
    7. public static void main(String[] args) {
    8. SpringApplication.run(DockerBootApplication.class, args);
    9. }
    10. }

    6、配置文件

    1. import lombok.extern.slf4j.Slf4j;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    5. import org.springframework.data.redis.core.RedisTemplate;
    6. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    7. import org.springframework.data.redis.serializer.StringRedisSerializer;
    8. import java.io.Serializable;
    9. @Configuration
    10. @Slf4j
    11. public class RedisConfig {
    12. /**
    13. * @param lettuceConnectionFactory
    14. * @return
    15. *
    16. * redis序列化的工具配置类,下面这个请一定开启配置
    17. * 127.0.0.1:6379> keys *
    18. * 1) "ord:102" 序列化过
    19. * 2) "\xac\xed\x00\x05t\x00\aord:102" 野生,没有序列化过
    20. */
    21. @Bean
    22. public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
    23. RedisTemplate redisTemplate = new RedisTemplate<>();
    24. redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    25. //设置key序列化方式string
    26. redisTemplate.setKeySerializer(new StringRedisSerializer());
    27. //设置value的序列化方式json
    28. redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    29. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    30. redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    31. redisTemplate.afterPropertiesSet();
    32. return redisTemplate;
    33. }
    34. }
    1. import org.springframework.beans.factory.annotation.Value;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import springfox.documentation.builders.ApiInfoBuilder;
    5. import springfox.documentation.builders.PathSelectors;
    6. import springfox.documentation.builders.RequestHandlerSelectors;
    7. import springfox.documentation.service.ApiInfo;
    8. import springfox.documentation.spi.DocumentationType;
    9. import springfox.documentation.spring.web.plugins.Docket;
    10. import springfox.documentation.swagger2.annotations.EnableSwagger2;
    11. import java.text.SimpleDateFormat;
    12. import java.util.Date;
    13. @Configuration
    14. @EnableSwagger2
    15. public class SwaggerConfig {
    16. @Value("${spring.swagger2.enabled}")
    17. private Boolean enabled;
    18. @Bean
    19. public Docket createRestApi() {
    20. return new Docket(DocumentationType.SWAGGER_2)
    21. .apiInfo(apiInfo())
    22. .enable(enabled)
    23. .select()
    24. .apis(RequestHandlerSelectors.basePackage("com.atguigu.docker")) //你自己的package
    25. .paths(PathSelectors.any())
    26. .build();
    27. }
    28. public ApiInfo apiInfo() {
    29. return new ApiInfoBuilder()
    30. .title("尚硅谷Java大厂技术"+"\t"+new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
    31. .description("docker-compose")
    32. .version("1.0")
    33. .termsOfServiceUrl("https://www.atguigu.com/")
    34. .build();
    35. }
    36. }

    7、entity-mapper-service-contrller文件

    1. import javax.persistence.Column;
    2. import javax.persistence.GeneratedValue;
    3. import javax.persistence.Id;
    4. import javax.persistence.Table;
    5. import java.util.Date;
    6. @Table(name = "t_user")
    7. public class User {
    8. @Id
    9. @GeneratedValue(generator = "JDBC")
    10. private Integer id;
    11. /**
    12. * 用户名
    13. */
    14. private String username;
    15. /**
    16. * 密码
    17. */
    18. private String password;
    19. /**
    20. * 性别 0=女 1=男
    21. */
    22. private Byte sex;
    23. /**
    24. * 删除标志,默认0不删除,1删除
    25. */
    26. private Byte deleted;
    27. /**
    28. * 更新时间
    29. */
    30. @Column(name = "update_time")
    31. private Date updateTime;
    32. /**
    33. * 创建时间
    34. */
    35. @Column(name = "create_time")
    36. private Date createTime;
    37. /**
    38. * @return id
    39. */
    40. public Integer getId() {
    41. return id;
    42. }
    43. /**
    44. * @param id
    45. */
    46. public void setId(Integer id) {
    47. this.id = id;
    48. }
    49. /**
    50. * 获取用户名
    51. *
    52. * @return username - 用户名
    53. */
    54. public String getUsername() {
    55. return username;
    56. }
    57. /**
    58. * 设置用户名
    59. *
    60. * @param username 用户名
    61. */
    62. public void setUsername(String username) {
    63. this.username = username;
    64. }
    65. /**
    66. * 获取密码
    67. *
    68. * @return password - 密码
    69. */
    70. public String getPassword() {
    71. return password;
    72. }
    73. /**
    74. * 设置密码
    75. *
    76. * @param password 密码
    77. */
    78. public void setPassword(String password) {
    79. this.password = password;
    80. }
    81. /**
    82. * 获取性别 0=女 1=男
    83. *
    84. * @return sex - 性别 0=女 1=男
    85. */
    86. public Byte getSex() {
    87. return sex;
    88. }
    89. /**
    90. * 设置性别 0=女 1=男
    91. *
    92. * @param sex 性别 0=女 1=男
    93. */
    94. public void setSex(Byte sex) {
    95. this.sex = sex;
    96. }
    97. /**
    98. * 获取删除标志,默认0不删除,1删除
    99. *
    100. * @return deleted - 删除标志,默认0不删除,1删除
    101. */
    102. public Byte getDeleted() {
    103. return deleted;
    104. }
    105. /**
    106. * 设置删除标志,默认0不删除,1删除
    107. *
    108. * @param deleted 删除标志,默认0不删除,1删除
    109. */
    110. public void setDeleted(Byte deleted) {
    111. this.deleted = deleted;
    112. }
    113. /**
    114. * 获取更新时间
    115. *
    116. * @return update_time - 更新时间
    117. */
    118. public Date getUpdateTime() {
    119. return updateTime;
    120. }
    121. /**
    122. * 设置更新时间
    123. *
    124. * @param updateTime 更新时间
    125. */
    126. public void setUpdateTime(Date updateTime) {
    127. this.updateTime = updateTime;
    128. }
    129. /**
    130. * 获取创建时间
    131. *
    132. * @return create_time - 创建时间
    133. */
    134. public Date getCreateTime() {
    135. return createTime;
    136. }
    137. /**
    138. * 设置创建时间
    139. *
    140. * @param createTime 创建时间
    141. */
    142. public void setCreateTime(Date createTime) {
    143. this.createTime = createTime;
    144. }
    145. }
    1. import io.swagger.annotations.ApiModel;
    2. import io.swagger.annotations.ApiModelProperty;
    3. import lombok.AllArgsConstructor;
    4. import lombok.Data;
    5. import lombok.NoArgsConstructor;
    6. import java.io.Serializable;
    7. import java.util.Date;
    8. @NoArgsConstructor
    9. @AllArgsConstructor
    10. @Data
    11. @ApiModel(value = "用户信息")
    12. public class UserDTO implements Serializable {
    13. @ApiModelProperty(value = "用户ID")
    14. private Integer id;
    15. @ApiModelProperty(value = "用户名")
    16. private String username;
    17. @ApiModelProperty(value = "密码")
    18. private String password;
    19. @ApiModelProperty(value = "性别 0=女 1=男 ")
    20. private Byte sex;
    21. @ApiModelProperty(value = "删除标志,默认0不删除,1删除")
    22. private Byte deleted;
    23. @ApiModelProperty(value = "更新时间")
    24. private Date updateTime;
    25. @ApiModelProperty(value = "创建时间")
    26. private Date createTime;
    27. /**
    28. * @return id
    29. */
    30. public Integer getId() {
    31. return id;
    32. }
    33. /**
    34. * @param id
    35. */
    36. public void setId(Integer id) {
    37. this.id = id;
    38. }
    39. /**
    40. * 获取用户名
    41. *
    42. * @return username - 用户名
    43. */
    44. public String getUsername() {
    45. return username;
    46. }
    47. /**
    48. * 设置用户名
    49. *
    50. * @param username 用户名
    51. */
    52. public void setUsername(String username) {
    53. this.username = username;
    54. }
    55. /**
    56. * 获取密码
    57. *
    58. * @return password - 密码
    59. */
    60. public String getPassword() {
    61. return password;
    62. }
    63. /**
    64. * 设置密码
    65. *
    66. * @param password 密码
    67. */
    68. public void setPassword(String password) {
    69. this.password = password;
    70. }
    71. /**
    72. * 获取性别 0=女 1=男
    73. *
    74. * @return sex - 性别 0=女 1=男
    75. */
    76. public Byte getSex() {
    77. return sex;
    78. }
    79. /**
    80. * 设置性别 0=女 1=男
    81. *
    82. * @param sex 性别 0=女 1=男
    83. */
    84. public void setSex(Byte sex) {
    85. this.sex = sex;
    86. }
    87. /**
    88. * 获取删除标志,默认0不删除,1删除
    89. *
    90. * @return deleted - 删除标志,默认0不删除,1删除
    91. */
    92. public Byte getDeleted() {
    93. return deleted;
    94. }
    95. /**
    96. * 设置删除标志,默认0不删除,1删除
    97. *
    98. * @param deleted 删除标志,默认0不删除,1删除
    99. */
    100. public void setDeleted(Byte deleted) {
    101. this.deleted = deleted;
    102. }
    103. /**
    104. * 获取更新时间
    105. *
    106. * @return update_time - 更新时间
    107. */
    108. public Date getUpdateTime() {
    109. return updateTime;
    110. }
    111. /**
    112. * 设置更新时间
    113. *
    114. * @param updateTime 更新时间
    115. */
    116. public void setUpdateTime(Date updateTime) {
    117. this.updateTime = updateTime;
    118. }
    119. /**
    120. * 获取创建时间
    121. *
    122. * @return create_time - 创建时间
    123. */
    124. public Date getCreateTime() {
    125. return createTime;
    126. }
    127. /**
    128. * 设置创建时间
    129. *
    130. * @param createTime 创建时间
    131. */
    132. public void setCreateTime(Date createTime) {
    133. this.createTime = createTime;
    134. }
    135. @Override
    136. public String toString() {
    137. return "User{" +
    138. "id=" + id +
    139. ", username='" + username + '\'' +
    140. ", password='" + password + '\'' +
    141. ", sex=" + sex +
    142. '}';
    143. }
    144. }
    1. import com.atguigu.docker.entities.User;
    2. import tk.mybatis.mapper.common.Mapper;
    3. public interface UserMapper extends Mapper {
    4. }
    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.atguigu.docker.mapper.UserMapper">
    4. <resultMap id="BaseResultMap" type="com.atguigu.docker.entities.User">
    5. <id column="id" jdbcType="INTEGER" property="id" />
    6. <result column="username" jdbcType="VARCHAR" property="username" />
    7. <result column="password" jdbcType="VARCHAR" property="password" />
    8. <result column="sex" jdbcType="TINYINT" property="sex" />
    9. <result column="deleted" jdbcType="TINYINT" property="deleted" />
    10. <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    11. <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    12. resultMap>
    13. mapper>
    1. import com.atguigu.docker.entities.User;
    2. import com.atguigu.docker.mapper.UserMapper;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.slf4j.Logger;
    5. import org.slf4j.LoggerFactory;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.data.redis.core.RedisTemplate;
    8. import org.springframework.data.redis.core.ValueOperations;
    9. import org.springframework.stereotype.Service;
    10. import org.springframework.web.bind.annotation.PathVariable;
    11. import javax.annotation.Resource;
    12. import java.util.concurrent.TimeUnit;
    13. @Service
    14. @Slf4j
    15. public class UserService {
    16. public static final String CACHE_KEY_USER = "user:";
    17. @Resource
    18. private UserMapper userMapper;
    19. @Resource
    20. private RedisTemplate redisTemplate;
    21. /**
    22. * addUser
    23. * @param user
    24. */
    25. public void addUser(User user)
    26. {
    27. //1 先插入mysql并成功
    28. int i = userMapper.insertSelective(user);
    29. if(i > 0)
    30. {
    31. //2 需要再次查询一下mysql将数据捞回来并ok
    32. user = userMapper.selectByPrimaryKey(user.getId());
    33. //3 将捞出来的user存进redis,完成新增功能的数据一致性。
    34. String key = CACHE_KEY_USER+user.getId();
    35. redisTemplate.opsForValue().set(key,user);
    36. }
    37. }
    38. /**
    39. * findUserById
    40. * @param id
    41. * @return
    42. */
    43. public User findUserById(Integer id)
    44. {
    45. User user = null;
    46. String key = CACHE_KEY_USER+id;
    47. //1 先从redis里面查询,如果有直接返回结果,如果没有再去查询mysql
    48. user = (User) redisTemplate.opsForValue().get(key);
    49. if(user == null)
    50. {
    51. //2 redis里面无,继续查询mysql
    52. user = userMapper.selectByPrimaryKey(id);
    53. if(user == null)
    54. {
    55. //3.1 redis+mysql 都无数据
    56. //你具体细化,防止多次穿透,我们规定,记录下导致穿透的这个key回写redis
    57. return user;
    58. }else{
    59. //3.2 mysql有,需要将数据写回redis,保证下一次的缓存命中率
    60. redisTemplate.opsForValue().set(key,user);
    61. }
    62. }
    63. return user;
    64. }
    65. }
    1. import cn.hutool.core.util.IdUtil;
    2. import cn.hutool.core.util.ReferenceUtil;
    3. import com.atguigu.docker.entities.User;
    4. import com.atguigu.docker.entities.UserDTO;
    5. import com.atguigu.docker.service.UserService;
    6. import io.swagger.annotations.Api;
    7. import io.swagger.annotations.ApiOperation;
    8. import io.swagger.models.auth.In;
    9. import lombok.extern.slf4j.Slf4j;
    10. import org.springframework.beans.BeanUtils;
    11. import org.springframework.beans.factory.annotation.Autowired;
    12. import org.springframework.web.bind.annotation.*;
    13. import javax.annotation.Resource;
    14. import java.util.Random;
    15. /**
    16. * @auther zzyy
    17. * @create 2021-05-01 15:02
    18. */
    19. @Api(description = "用户User接口")
    20. @RestController
    21. @Slf4j
    22. public class UserController {
    23. @Resource
    24. private UserService userService;
    25. @ApiOperation("数据库新增3条记录")
    26. @RequestMapping(value = "/user/add",method = RequestMethod.POST)
    27. public void addUser()
    28. {
    29. for (int i = 1; i <=3; i++) {
    30. User user = new User();
    31. user.setUsername("zzyy"+i);
    32. user.setPassword(IdUtil.simpleUUID().substring(0,6));
    33. user.setSex((byte) new Random().nextInt(2));
    34. userService.addUser(user);
    35. }
    36. }
    37. @ApiOperation("删除1条记录")
    38. @RequestMapping(value = "/user/delete/{id}",method = RequestMethod.POST)
    39. public void deleteUser(@PathVariable Integer id)
    40. {
    41. userService.deleteUser(id);
    42. }
    43. @ApiOperation("修改1条记录")
    44. @RequestMapping(value = "/user/update",method = RequestMethod.POST)
    45. public void updateUser(@RequestBody UserDTO userDTO)
    46. {
    47. User user = new User();
    48. BeanUtils.copyProperties(userDTO,user);
    49. userService.updateUser(user);
    50. }
    51. @ApiOperation("查询1条记录")
    52. @RequestMapping(value = "/user/find/{id}",method = RequestMethod.GET)
    53. public User findUserById(@PathVariable Integer id)
    54. {
    55. return userService.findUserById2(id);
    56. }
    57. }

    8、mvn package命令将微服务形成新的jar包并上传到Linux服务器/mydocker目录下

    构建微服务镜像

    1、编写Dockerfile

    # 基础镜像使用java

    FROM java:8

    # 作者

    MAINTAINER zzyy

    # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp

    VOLUME /tmp

    # 将jar包添加到容器中并更名为zzyy_docker.jar

    ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar

    # 运行jar包

    RUN bash -c 'touch /zzyy_docker.jar'

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

    #暴露6001端口作为微服务

    EXPOSE 6001

    2、构建镜像(注意后面有个点)

    docker build -t zzyy_docker:1.6 .

    编写docker-compose.yml文件

    包括微服务、mysql、redis镜像文件。

    1. version: "3"
    2. services:
    3.   microService:
    4.     image: zzyy_docker:1.6
    5.     container_name: ms01
    6.     ports:
    7.       - "6001:6001"
    8.     volumes:
    9.       - /app/microService:/data
    10.     networks: 
    11.       - atguigu_net 
    12.     depends_on: 
    13.       - redis
    14.       - mysql
    15.   redis:
    16.     image: redis:6.0.8
    17.     ports:
    18.       - "6379:6379"
    19.     volumes:
    20.       - /app/redis/redis.conf:/etc/redis/redis.conf
    21.       - /app/redis/data:/data
    22.     networks: 
    23.       - atguigu_net
    24.     command: redis-server /etc/redis/redis.conf
    25.   mysql:
    26.     image: mysql:5.7
    27.     environment:
    28.       MYSQL_ROOT_PASSWORD: '123456'
    29.       MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    30.       MYSQL_DATABASE: 'db2021'
    31.       MYSQL_USER: 'zzyy'
    32.       MYSQL_PASSWORD: 'zzyy123'
    33.     ports:
    34.        - "3306:3306"
    35.     volumes:
    36.        - /app/mysql/db:/var/lib/mysql
    37.        - /app/mysql/conf/my.cnf:/etc/my.cnf
    38.        - /app/mysql/init:/docker-entrypoint-initdb.d
    39.     networks:
    40.       - atguigu_net
    41.     command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
    42. # 自定义网络
    43. networks: 
    44.    atguigu_net:

    编译启动docker-compose

    执行docker-compose up
    或者
    执行docker-compose up -d

    创建数据库

    进入mysql容器实例并新建库db2021+新建表t_user

    docker exec -it 容器实例id /bin/bash

    mysql -uroot -p

    create database db2021;

    use db2021;

    CREATE TABLE `t_user` (
      `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
      `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
      `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
      `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
      `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

    停止服务

  • 相关阅读:
    cnn感受野计算方法
    【高等数学基础进阶】函数、极限、连续-补充+练习 & 导数与微分-练习
    人工智能、机器学习、深度学习的区别
    JsJavascriptEcma的eval性能测试2208011912
    1474_AURIX TC275 WDT的运行模式
    学会这些,QtIFW制作安装包不再是难题
    julia系列1:介绍与安装
    什么是 JVM ?
    性能测试的时间间隔获取方法
    防关联浏览器推荐:MuLogin指纹浏览器安全登录多平台账号
  • 原文地址:https://blog.csdn.net/qq_36942720/article/details/133279482