• 10_Spring Boot 集成Dubbo + Mybatis + Redis


      该实例目的是为了让同学们快速学会使用SpringBoot集成搭建SpringMVC、Spring、MyBatis及Redis    

     创建新的数据库springboot,指定数据库字符编码为utf-8

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;
    3. -- ----------------------------
    4. -- Table structure for t_student
    5. -- ----------------------------
    6. DROP TABLE IF EXISTS `t_student`;
    7. CREATE TABLE `t_student` (
    8. `id` int NOT NULL AUTO_INCREMENT,
    9. `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
    10. `age` int NULL DEFAULT NULL,
    11. PRIMARY KEY (`id`) USING BTREE
    12. ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
    13. -- ----------------------------
    14. -- Records of t_student
    15. -- ----------------------------
    16. INSERT INTO `t_student` VALUES (1, 'zhangsan', 25);
    17. INSERT INTO `t_student` VALUES (2, 'lisi', 28);
    18. INSERT INTO `t_student` VALUES (3, 'wangwu', 23);
    19. INSERT INTO `t_student` VALUES (4, 'Tom', 21);
    20. INSERT INTO `t_student` VALUES (5, 'Jck', 55);
    21. INSERT INTO `t_student` VALUES (6, 'Lucy', 27);
    22. INSERT INTO `t_student` VALUES (7, 'zhaoliu', 75);
    23. SET FOREIGN_KEY_CHECKS = 1;

    一、开发Dubbo服务接口-公共接口

    按照Dubbo官方开发建议,创建一个接口项目,该项目只定义接口和model类

    项目名称:009-springboot-ssm-dubbo-exterface

    A. 创建Maven Java工程,Dubbo接口工程

    B. 创建StudentService业务接口类

    1. /*
    2. * ClassName:StudentService
    3. * Package:com.abc.springboot.com.suke.springboot.service
    4. * Description:<br/>
    5. * */
    6. public interface StudentService {
    7. /*
    8. * 获取学生总人数
    9. *
    10. * @return
    11. * */
    12. Long queryAllStudentCount();
    13. }

    C. 创建model类Student

    1. public class Student implements Serializable {
    2. private Integer id;
    3. private String name;
    4. private Integer age;
    5. public Integer getId() {
    6. return id;
    7. }
    8. public void setId(Integer id) {
    9. this.id = id;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public Integer getAge() {
    18. return age;
    19. }
    20. public void setAge(Integer age) {
    21. this.age = age;
    22. }
    23. }

    二、开发Dubbo服务提供者

    项目名称:010-springboot-ssm-dubbo-provider

    A. 创建 SpringBoot Web项目

    B. 给Dubbo服务提供者添加依赖

    1. <!--SpringBoot集成Dubbo起步依赖-->
    2. <dependency>
    3. <groupId>com.alibaba.spring.boot</groupId>
    4. <artifactId>dubbo-spring-boot-starter</artifactId>
    5. <version>2.0.0</version>
    6. </dependency>
    7. <!--zookeeper注册中心-->
    8. <dependency>
    9. <groupId>com.101tec</groupId>
    10. <artifactId>zkclient</artifactId>
    11. <version>0.10</version>
    12. <exclusions>
    13. <exclusion>
    14. <groupId>log4j</groupId>
    15. <artifactId>log4j</artifactId>
    16. </exclusion>
    17. <exclusion>
    18. <groupId>org.slf4j</groupId>
    19. <artifactId>slf4j-log4j12</artifactId>
    20. </exclusion>
    21. </exclusions>
    22. </dependency>
    23. <!--MyBatis集成SpringBoot框架起步依赖-->
    24. <dependency>
    25. <groupId>org.mybatis.spring.boot</groupId>
    26. <artifactId>mybatis-spring-boot-starter</artifactId>
    27. <version>2.0.0</version>
    28. </dependency>
    29. <!--连接MySQL数据库驱动-->
    30. <dependency>
    31. <groupId>mysql</groupId>
    32. <artifactId>mysql-connector-java</artifactId>
    33. </dependency>
    34. <!--SpringBoot集成Redis起步依赖-->
    35. <dependency>
    36. <groupId>org.springframework.boot</groupId>
    37. <artifactId>spring-boot-starter-data-redis</artifactId>
    38. </dependency>
    39. <!--dubbo接口工程-->
    40. <dependency>
    41. <groupId>com.suke.springboot</groupId>
    42. <artifactId>009-springboot-ssm-dubbo-exterface</artifactId>
    43. <version>1.0-SNAPSHOT</version>
    44. </dependency>

    C. 手动指定资源配置文件路径

    在pom文件中的build标签中添加

    1. <!--手动指定资源配置文件路径-->
    2. <!--目的:将数据持久层映射文件编译到classpath中-->
    3. <resources>
    4. <resource>
    5. <directory>src/main/java</directory>
    6. <includes>
    7. <include>**/*.xml</include>
    8. </includes>
    9. </resource>
    10. </resources>

    D. 配置MyBatis逆向工程

    (1)添加插件

    1. <plugins>
    2. <plugin>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-maven-plugin</artifactId>
    5. </plugin>
    6. <!--mybatis代码自动生成插件-->
    7. <plugin>
    8. <groupId>org.mybatis.generator</groupId>
    9. <artifactId>mybatis-generator-maven-plugin</artifactId>
    10. <version>1.3.7</version>
    11. <configuration>
    12. <!--配置文件的位置-->
    13. <configurationFile>GeneratorMapper.xml</configurationFile>
    14. <verbose>true</verbose>
    15. <overwrite>true</overwrite>
    16. </configuration>
    17. </plugin>
    18. </plugins>

    (2)将配置文件存放到项目根据目录

    ​​​​​​(3)GeneratorMapper.xml内容如下

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE generatorConfiguration
    3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    5. <generatorConfiguration>
    6. <!-- 指定连接数据库的 JDBC 驱动包所在位置,指定到你本机的完整路径 -->
    7. <classPathEntry
    8. location="D:\IT\Java\maven_repository\mysql\mysql-connector-java\8.0.19\mysql-connector-java-8.0.19.jar"/>
    9. <!-- 配置 table 表信息内容体,targetRuntime 指定采用 MyBatis3 的版本 -->
    10. <context id="tables" targetRuntime="MyBatis3">
    11. <!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
    12. <commentGenerator>
    13. <property name="suppressAllComments" value="true"/>
    14. </commentGenerator>
    15. <!-- 配置数据库连接信息 -->
    16. <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
    17. connectionURL="jdbc:mysql://localhost:3306/springboot?characterEncoding=utf8&amp;
    18. useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true"
    19. userId="root"
    20. password="root">
    21. </jdbcConnection>
    22. <!-- 生成 com.suke.springboot.model 类,targetPackage 指定 com.suke.springboot.model 类的包名, targetProject 指定
    23. 生成的 com.suke.springboot.model 放在 eclipse 的哪个工程下面-->
    24. <javaModelGenerator targetPackage="com.suke.springboot.com.suke.springboot.model"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. <property name="trimStrings" value="false"/>
    28. </javaModelGenerator>
    29. <!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的
    30. 包名, targetProject 指定生成的 mapper.xml 放在 eclipse 的哪个工程下面 -->
    31. <sqlMapGenerator targetPackage="com.suke.springboot.mapper"
    32. targetProject="src/main/java">
    33. <property name="enableSubPackages" value="false"/>
    34. </sqlMapGenerator>
    35. <!-- 生成 MyBatis 的 Mapper 接口类文件,targetPackage 指定 Mapper 接口类的包
    36. 名, targetProject 指定生成的 Mapper 接口放在 eclipse 的哪个工程下面 -->
    37. <javaClientGenerator type="XMLMAPPER"
    38. targetPackage="com.suke.springboot.mapper"
    39. targetProject="src/main/java">
    40. <property name="enableSubPackages" value="false"/>
    41. </javaClientGenerator>
    42. <!-- 数据库表名及对应的 Java 模型类名 -->
    43. <!-- 指定数据库表
    44. schema:表示数据库名称-->
    45. <table tableName="tb_student" domainObjectName="Student"
    46. enableCountByExample="false"
    47. enableUpdateByExample="false"
    48. enableDeleteByExample="false"
    49. enableSelectByExample="false"
    50. selectByExampleQueryId="false"/>
    51. </context>
    52. </generatorConfiguration>

    (4)​​​​​​​点击插件生成

    E. ​​​​​​​实体bean必须实现序列化

    F. ​​​​​​​配置010-springboot-ssm-dubbo-provider核心配置文件

    1. #配置内嵌Tomcat端口号
    2. server.port=9010
    3. #配置项目上下文根
    4. server.servlet.context-path=/010-springboot-ssm-dubbo-provider
    5. #数据库的配置
    6. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    7. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
    8. spring.datasource.username=root
    9. spring.datasource.password=root
    10. #配置dubbo服务提供者
    11. spring.application.name=010-springboot-ssm-dubbo-provider
    12. #表示是服务提供者
    13. spring.dubbo.server=true
    14. #注册中心地址
    15. spring.dubbo.registry=zookeeper://192.168.60.130:2181
    16. #配置redis连接信息
    17. spring.redis.host=192.168.60.130
    18. spring.redis.port=6379
    19. spring.redis.password=123456

    G. ​​​​​​​StudentServiceImpl业务接口实现类

    1. /*
    2. * ClassName:StudentServiceImpl
    3. * Package:com.suke.springboot.service
    4. * Description:<br/>
    5. * */
    6. @Service(interfaceClass = StudentService.class, timeout = 20000, retries = 3, version = "1.0.0")
    7. @Component //将接口实现类交给spring容器进行管理
    8. public class StudentServiceImpl implements StudentService {
    9. @Autowired
    10. private StudentMapper studentMapper;
    11. @Autowired
    12. private RedisTemplate redisTemplate;
    13. @Override
    14. public Long queryAllStudentCount() {
    15. //设置key键,序列化,与功能无关
    16. redisTemplate.setKeySerializer(new StringRedisSerializer());
    17. //从redis缓存中获取总人数
    18. Long allStudentCount = (Long) redisTemplate.opsForValue().get("allStudentCount");
    19. //判断学生总人数是否为空
    20. if (allStudentCount == null) {
    21. //设置同步代码块
    22. synchronized (this) {
    23. //再次从redis缓存中获取学生总人数
    24. allStudentCount = (Long) redisTemplate.opsForValue().get("allStudentCount");
    25. //双重检测判断缓存中是否有数据
    26. if (allStudentCount == null) {
    27. System.out.println("----查询数据库-----");
    28. //从数据库查询
    29. allStudentCount = studentMapper.selectAllStudentCount();
    30. //将值再存放到redis缓存中
    31. redisTemplate.opsForValue().set("allStudentCount", allStudentCount, 20, TimeUnit.SECONDS);
    32. } else {
    33. System.out.println("-----缓存命中-------");
    34. }
    35. }
    36. } else {
    37. System.out.println("-----缓存命中-------");
    38. }
    39. return allStudentCount;
    40. }
    41. }

    H. ​​​​​​​StudentMapper接口

    1. //@Mapper
    2. @Repository
    3. public interface StudentMapper {
    4. /*
    5. * 获取学生总人数
    6. * */
    7. Long selectAllStudentCount();
    8. }

    I. ​​​​​​​StudentMapper.XML配置文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.suke.springboot.mapper.StudentMapper">
    4. <resultMap id="BaseResultMap" type="com.suke.springboot.model.Student">
    5. <id column="id" jdbcType="INTEGER" property="id"/>
    6. <result column="name" jdbcType="VARCHAR" property="name"/>
    7. <result column="age" jdbcType="INTEGER" property="age"/>
    8. </resultMap>
    9. <sql id="Base_Column_List">
    10. id
    11. , name, age
    12. </sql>
    13. <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    14. select
    15. <include refid="Base_Column_List"/>
    16. from tb_student
    17. where id = #{id,jdbcType=INTEGER}
    18. </select>
    19. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    20. delete
    21. from tb_student
    22. where id = #{id,jdbcType=INTEGER}
    23. </delete>
    24. <insert id="insert" parameterType="com.suke.springboot.model.Student">
    25. insert into tb_student (id, name, age)
    26. values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})
    27. </insert>
    28. <insert id="insertSelective" parameterType="com.suke.springboot.model.Student">
    29. insert into tb_student
    30. <trim prefix="(" suffix=")" suffixOverrides=",">
    31. <if test="id != null">
    32. id,
    33. </if>
    34. <if test="name != null">
    35. name,
    36. </if>
    37. <if test="age != null">
    38. age,
    39. </if>
    40. </trim>
    41. <trim prefix="values (" suffix=")" suffixOverrides=",">
    42. <if test="id != null">
    43. #{id,jdbcType=INTEGER},
    44. </if>
    45. <if test="name != null">
    46. #{name,jdbcType=VARCHAR},
    47. </if>
    48. <if test="age != null">
    49. #{age,jdbcType=INTEGER},
    50. </if>
    51. </trim>
    52. </insert>
    53. <update id="updateByPrimaryKeySelective" parameterType="com.suke.springboot.model.Student">
    54. update tb_student
    55. <set>
    56. <if test="name != null">
    57. name = #{name,jdbcType=VARCHAR},
    58. </if>
    59. <if test="age != null">
    60. age = #{age,jdbcType=INTEGER},
    61. </if>
    62. </set>
    63. where id = #{id,jdbcType=INTEGER}
    64. </update>
    65. <update id="updateByPrimaryKey" parameterType="com.suke.springboot.model.Student">
    66. update tb_student
    67. set name = #{name,jdbcType=VARCHAR},
    68. age = #{age,jdbcType=INTEGER}
    69. where id = #{id,jdbcType=INTEGER}
    70. </update>
    71. <select id="selectAllStudentCount" resultType="long">
    72. select count(*)
    73. from tb_student
    74. </select>
    75. </mapper>

    J. ​​​​​​​配置010-springboot-ssm-dubbo-provider启动类  

    1. @SpringBootApplication
    2. @EnableDubboConfiguration//开启Dubbo配置支持
    3. @MapperScan("com.suke.springboot.mapper")//扫描数据持久层
    4. public class Application {
    5. public static void main(String[] args) {
    6. SpringApplication.run(Application.class, args);
    7. }
    8. }

    三、开发Dubbo服务消费者

    项目名称:011-springboot-ssm-dubbo-consumer

    A. 创建SpringBoot Web项目 

    ​​​​​​​B. 给Dubbo服务消费者添加依赖​​​​​​​

    1. <!--SpringBoot集成Dubbo起步依赖-->
    2. <dependency>
    3. <groupId>com.alibaba.spring.boot</groupId>
    4. <artifactId>dubbo-spring-boot-starter</artifactId>
    5. <version>2.0.0</version>
    6. </dependency>
    7. <!--zookeeper注册中心-->
    8. <dependency>
    9. <groupId>com.101tec</groupId>
    10. <artifactId>zkclient</artifactId>
    11. <version>0.10</version>
    12. <exclusions>
    13. <exclusion>
    14. <groupId>log4j</groupId>
    15. <artifactId>log4j</artifactId>
    16. </exclusion>
    17. <exclusion>
    18. <groupId>org.slf4j</groupId>
    19. <artifactId>slf4j-log4j12</artifactId>
    20. </exclusion>
    21. </exclusions>
    22. </dependency>
    23. <!--dubbo接口工程-->
    24. <dependency>
    25. <groupId>com.suke.springboot</groupId>
    26. <artifactId>009-springboot-ssm-dubbo-exterface</artifactId>
    27. <version>1.0-SNAPSHOT</version>
    28. </dependency>

    C. 配置011-springboot-ssm-dubbo-consumer核心配置文件

    1. #配置内嵌Tomcat端口号
    2. server.port=9011
    3. #配置项目上下文根
    4. server.servlet.context-path=/011-springboot-ssm-dubbo-consumer
    5. #配置zookeeper注册中心
    6. spring.application.name=011-springboot-ssm-dubbo-consumer
    7. spring.dubbo.registry=zookeeper://192.168.60.130:2181

    ​​​​​​​D. StudentController控制层

    1. /*
    2. * ClassName:StudentController
    3. * Package:com.suke.springboot.web
    4. * Description:<br/>
    5. * */
    6. @RestController
    7. public class StudentController {
    8. @Reference(interfaceClass = StudentService.class, version = "1.0.0", timeout = 20000, retries = 3, check = false)
    9. StudentService studentService;
    10. @GetMapping(value = "/springBoot/student/count")
    11. public Object studentCount(HttpServletRequest request) {
    12. //创建线程池
    13. ExecutorService executorService = Executors.newFixedThreadPool(16);
    14. //模拟千人并发
    15. for (int i = 0; i < 1000; i++) {
    16. executorService.submit(new Runnable() {
    17. @Override
    18. public void run() {
    19. studentService.queryAllStudentCount();
    20. }
    21. });
    22. }
    23. return "学生总人数:" + 7;
    24. }
    25. }

    E. 配置011-springboot-ssm-dubbo-consumer启动类

    1. @SpringBootApplication
    2. @EnableDubboConfiguration //开启dubbo支持配置
    3. public class Application {
    4. public static void main(String[] args) {
    5. SpringApplication.run(Application.class, args);
    6. }
    7. }

    F. 启动项目和服务

    (1)启动redis服务

    01-Centos7安装Redis和启动Redishttps://blog.csdn.net/qq_45037155/article/details/124679838

    03-Redis客户端连接Redis服务器(redis.conf 文件配置没有生效导致redis运行报错Error: Connection reset by peer)https://blog.csdn.net/qq_45037155/article/details/124683432

    1. [root@Suke /]# cd /usr/local/redis-4.0.6/src/
    2. [root@Suke src]# ./redis-server ../redis.conf &

    (2)启动Zookeeper服务

    Zookeeper启动https://blog.csdn.net/qq_45037155/article/details/124959703

    ./zkServer.sh start
    1. [root@Suke ~]# cd /usr/local/apache-zookeeper-3.5.5-bin/bin/
    2. [root@Suke bin]# ./zkServer.sh help
    3. ZooKeeper JMX enabled by default
    4. Using config: /usr/local/apache-zookeeper-3.5.5-bin/bin/../conf/zoo.cfg
    5. Usage: ./zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|restart|status|print-cmd}
    6. [root@Suke bin]# ./zkServer.sh start
    7. ZooKeeper JMX enabled by default
    8. Using config: /usr/local/apache-zookeeper-3.5.5-bin/bin/../conf/zoo.cfg
    9. Starting zookeeper ... STARTED

    (3)​​​​​​​启动010-springboot-ssm-dubbo-provider

    (4)​​​​​​​启动011-springboot-ssm-dubbo-consumer

    G. ​​​​​​​启动浏览器进行测试    

    (1)浏览器访问结果

    (2)RedisDesktopManager访问结果

    (3)控制台访问结果

  • 相关阅读:
    软件测试/测试开发丨接口自动化测试学习笔记,多环境自动切换
    1.12 字典(Python)
    MySQL 事件调度
    黑马课程 Mybatis依赖出现报红
    【SpringMVC】SSM整合
    MySQL学习——在用Connector/NET处理BLOB数据
    Android聚合SDK母包反编译出包教程
    IPv6进阶:IPv6 过渡技术之 GRE 隧道
    【windows】网络设置了代理,怎么关闭
    服务注册中心Eureka
  • 原文地址:https://blog.csdn.net/qq_45037155/article/details/125481250