高并发下Redis会出现的问题:

  • 缓存穿透
  • 缓存雪崩
  • 热点缓存

一、定义commons工程11-dubboCommons

(1) 创建工程

创建Maven的Java工程,并命名为11-dubboCommons

(2) 定义pom文件


  1. <groupId>com.abc</groupId>
  2. <artifactId>11-dubboCommons</artifactId>
  3. <version>1.0-SNAPSHOT</version>
  4. <properties>
  5. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  6. <maven.compiler.source>1.8</maven.compiler.source>
  7. <maven.compiler.target>1.8</maven.compiler.target>
  8. </properties>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.projectlombok</groupId>
  12. <artifactId>lombok</artifactId>
  13. <version>1.18.4</version>
  14. <scope>provided</scope>
  15. </dependency>
  16. </dependencies>

(3) 定义实体类

(4) 定义业务接口

(5) 将工程安装到本地库

运行Maven的install命令,将工程安装到本地版本库,以备其它工程使用

二、定义提供者11-provider-springboot

(1) 创建工程

创建一个Spring Boot工程,并重命名为11-provider-springboot

(2) 定义pom文件

A、添加dubbo与spring boot整合依赖

B、添加zkClient依赖

C、其它依赖

  • dubboCommons依赖
  • spring boot与redis整合依赖
  • mybatis与spring boot整合依赖
  • 数据源Druid依赖
  • mysql驱动依赖
  • slf4j-log4j12依赖
  • spring-boot-starter-web依赖

  1. <groupId>com.abc</groupId>
  2. <artifactId>11-provider-springboot</artifactId>
  3. <version>0.0.1-SNAPSHOT</version>
  4. <parent>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-starter-parent</artifactId>
  7. <version>2.1.5.RELEASE</version>
  8. <relativePath/> <!-- lookup parent from repository -->
  9. </parent>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  13. <java.version>1.8</java.version>
  14. </properties>
  15. <dependencies>
  16. <!--dubbo与spring boot整合依赖-->
  17. <dependency>
  18. <groupId>com.alibaba.spring.boot</groupId>
  19. <artifactId>dubbo-spring-boot-starter</artifactId>
  20. <version>2.0.0</version>
  21. </dependency>
  22. <!-- zk客户端依赖:zkclient -->
  23. <dependency>
  24. <groupId>com.101tec</groupId>
  25. <artifactId>zkclient</artifactId>
  26. <version>0.10</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>com.abc</groupId>
  30. <artifactId>11-dubboCommons</artifactId>
  31. <version>1.0-SNAPSHOT</version>
  32. </dependency>
  33. <!--Spring Boot与Redis整合依赖-->
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-data-redis</artifactId>
  37. </dependency>
  38. <!--mybatis与Spring Boot整合依赖-->
  39. <dependency>
  40. <groupId>org.mybatis.spring.boot</groupId>
  41. <artifactId>mybatis-spring-boot-starter</artifactId>
  42. <version>1.3.2</version>
  43. </dependency>
  44. <!--数据源Druid依赖-->
  45. <dependency>
  46. <groupId>com.alibaba</groupId>
  47. <artifactId>druid</artifactId>
  48. <version>1.1.10</version>
  49. </dependency>
  50. <!--MySQL驱动依赖-->
  51. <dependency>
  52. <groupId>mysql</groupId>
  53. <artifactId>mysql-connector-java</artifactId>
  54. <version>5.1.47</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.slf4j</groupId>
  58. <artifactId>slf4j-log4j12</artifactId>
  59. <version>1.7.25</version>
  60. <scope>test</scope>
  61. </dependency>
  62. <dependency>
  63. <groupId>org.springframework.boot</groupId>
  64. <artifactId>spring-boot-starter-web</artifactId>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.springframework.boot</groupId>
  68. <artifactId>spring-boot-starter-test</artifactId>
  69. <scope>test</scope>
  70. </dependency>
  71. </dependencies>
  72. <build>
  73. <plugins>
  74. <plugin>
  75. <groupId>org.springframework.boot</groupId>
  76. <artifactId>spring-boot-maven-plugin</artifactId>
  77. </plugin>
  78. </plugins>
  79. <resources>
  80. <!--注册dao包下mybatis映射文件为资源目录-->
  81. <resource>
  82. <directory>src/main/java</directory>
  83. <includes>
  84. <include>**/*.xml</include>
  85. </includes>
  86. </resource>
  87. </resources>
  88. </build>

(3) 定义Service实现类


  1. import com.abc.bean.Employee;
  2. import com.abc.dao.EmployeeDao;
  3. import com.alibaba.dubbo.config.annotation.Service;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.cache.annotation.CacheEvict;
  6. import org.springframework.cache.annotation.Cacheable;
  7. import org.springframework.data.redis.core.BoundValueOperations;
  8. import org.springframework.data.redis.core.RedisTemplate;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.transaction.annotation.Transactional;
  11. import java.util.concurrent.TimeUnit;
  12. @Service // Dubbo的注解 <dubbo:service/>
  13. @Component
  14. public class EmployeeServiceImpl implements EmployeeService {
  15. @Autowired
  16. private EmployeeDao dao;
  17. @Autowired
  18. private RedisTemplate<Object, Object> redisTemplate;
  19. // 当有对象插入时会清空realTimeCache缓存空间
  20. @CacheEvict(value="realTimeCache", allEntries = true)
  21. @Transactional(rollbackFor = Exception.class)
  22. @Override
  23. public void addEmployee(Employee employee) {
  24. dao.insertEmployee(employee);
  25. }
  26. // 一旦有了查询结果,则会将此结果写入到realTimeCache缓存
  27. // key是employee_加上方法参数
  28. @Cacheable(value = {"realTimeCache"}, key = "'employee_'+#id")
  29. @Override
  30. public Employee findEmployeeById(int id) {
  31. // 从DB查询
  32. System.out.println("从DB查询id = " + id);
  33. return dao.selectEmployeeById(id);
  34. }
  35. private volatile Object count;
  36. // 双重检测锁机制解决Reids的热点缓存问题
  37. @Override
  38. public Integer findEmployeeCount() {
  39. // 获取Redis操作对象
  40. BoundValueOperations<Object, Object> ops = redisTemplate.boundValueOps("count");
  41. // 从缓存获取数据
  42. count = ops.get();
  43. if(count == null) {
  44. synchronized (this) {
  45. count = ops.get();
  46. if(count == null) {
  47. System.out.println("从DB中查询");
  48. // 从DB中查询
  49. count = dao.selectEmployeeCount();
  50. // 将查询结果存放到Redis
  51. ops.set(count, 10, TimeUnit.SECONDS);
  52. }
  53. }
  54. }
  55. return (Integer) count;
  56. }
  57. }

(4) 定义Dao接口

(5) 定义映射文件

(6) 修改启动类

在启动类上必须要添加@EnableDubboConfiguration注解,开启Dubbo的自动配置功能

(7) 修改主配置文件


  1. server:
  2. port: 8888
  3. mybatis:
  4. # 注册mybatis中实体类的别名
  5. type-aliases-package: com.abc.bean
  6. # 注册映射文件
  7. mapper-locations: classpath:com/abc/dao/*.xml
  8. spring:
  9. # 注册数据源
  10. datasource:
  11. # 指定数据源类型为Druid
  12. type: com.alibaba.druid.pool.DruidDataSource
  13. driver-class-name: com.mysql.jdbc.Driver
  14. url: jdbc:mysql:///test?useUnicode=true&amp;characterEncoding=utf8
  15. username: root
  16. password: root
  17. # 连接Redis服务器
  18. redis:
  19. host: 39.97.176.160
  20. port: 6379
  21. # 连接Redis高可有集群
  22. # redis:
  23. # sentinel:
  24. # master: mymaster
  25. # nodes:
  26. # - sentinelOS1:26379
  27. # - sentinelOS2:26379
  28. # - sentinelOS3:26379
  29. # 配置缓存
  30. cache:
  31. type: redis # 指定缓存类型
  32. cache-names: realTimeCache # 指定缓存区域名称
  33. # 功能等价于spring-boot配置文件中的<dubbo:application/>
  34. application:
  35. name: 11-provider-springboot
  36. # 指定zk注册中心
  37. dubbo:
  38. registry: zookeeper://39.97.176.160:2181
  39. # zk集群作注册中心
  40. # registry: zookeeper://zkOS1:2181?backup=zkOS2:2181,zkOS3:2181

三、定义消费者11-consumer-springboot

(1) 创建工程

创建一个Spring Boot工程,并重命名为11-consumer-springboot

(2) 定义pom文件

  • dubbo与spring boot整合依赖
  • zkClient依赖
  • dubboCommons依赖
  • JSP引擎jasper依赖
  • slf4j-log4j12依赖
  • spring-boot-starter-web依赖

(3) 修改主配置文件


  1. spring:
  2. # 功能等价于spring-dubbo配置文件中的<dubbo:application/>
  3. application:
  4. name: 11-consumer-springboot
  5. # 指定zk注册中心
  6. dubbo:
  7. registry: zookeeper://39.97.176.160:2181
  8. # zk集群作注册中心
  9. # registry: zookeeper://zkOS1:2181?backup=zkOS2:2181,zkOS3:2181

(4) 创建index.jsp页面

在src/main/webapp目录下定义index.jsp文件

(5) 定义处理器


  1. package com.abc.controller;
  2. import com.abc.bean.Employee;
  3. import com.abc.service.EmployeeService;
  4. import com.alibaba.dubbo.config.annotation.Reference;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.ui.Model;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.PostMapping;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. @Controller
  12. @RequestMapping("/consumer/employee")
  13. public class SomeController {
  14. // @Autowired
  15. @Reference // Dubbo的注解 <dubbo:reference />
  16. private EmployeeService employeeService;
  17. @PostMapping("/register")
  18. public String someHandle(Employee employee, Model model) {
  19. employeeService.addEmployee(employee);
  20. model.addAttribute("employee", employee);
  21. return "/welcome.jsp";
  22. }
  23. @RequestMapping("/find/{id}")
  24. @ResponseBody
  25. public Employee findHandle(@PathVariable("id") int id) {
  26. return employeeService.findEmployeeById(id);
  27. }
  28. @RequestMapping("/count")
  29. @ResponseBody
  30. public Integer countHandle() {
  31. return employeeService.findEmployeeCount();
  32. }
  33. }

(6) 定义welcome.jsp页面

(7) 修改入口类

四、测试

当有对象插入时会清空realTimeCache缓存空间

一旦有了查询结果,则会将此结果写入到realTimeCache缓存

http://localhost:8080/index.jsp  首页

http://localhost:8080//consumer/employee/find/2 根据Id查找

http://localhost:8080//consumer/employee/count 查找总数

Spring Boot中使用Dubbo的更多相关文章

  1. Dubbo在Spring和Spring Boot中的使用

    一.在Spring中使用Dubbo 1.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifa ...

  2. spring boot中的声明式事务管理及编程式事务管理

    这几天在做一个功能,具体的情况是这样的: 项目中原有的几个功能模块中有数据上报的功能,现在需要在这几个功能模块的上报之后生成一条消息记录,然后入库,在写个接口供前台来拉取消息记录. 看到这个需求,首先 ...

  3. Spring Boot 中如何支持异步方法

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  4. spring boot(三):Spring Boot中Redis的使用

    spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...

  5. Spring Boot中的事务管理

    原文  http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...

  6. Spring Boot中的注解

    文章来源:http://www.tuicool.com/articles/bQnMra 在Spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了 ...

  7. 在Spring Boot中使用Https

    本文介绍如何在Spring Boot中,使用Https提供服务,并将Http请求自动重定向到Https. Https证书 巧妇难为无米之炊,开始的开始,要先取得Https证书.你可以向证书机构申请证书 ...

  8. Spring Boot中使用Swagger2构建强大的RESTful API文档

    由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...

  9. springboot(十一):Spring boot中mongodb的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

随机推荐

  1. git rebase 合并提交

    git rebase 合并提交 合并最近多次提交记录 语法 git rebase -i HEAD~n 1.进入合并模式 合并最近三次提交 git rebase -i HEAD~3 然后你会看到一个像下 ...

  2. 合并代码操作 | git fetch 与 git pull

    前言 首先我们要说简单说git的运行机制.git分为本地仓库和远程仓库,我们一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程 ...

  3. uni-app视频组件设置圆角

    无法实现,建议写个image在中间位置加个播放按钮,点击播放跳转新页面只需要在跳转参数里面把视频链接加上,在onLoad里面获取视频链接,自动播放视频,很多app目前都是这样做的,关闭页面后视频会自动 ...

  4. Could not set property 'id' of 'class com.xxx.xxEntity'

    使用mybatisplus的save功能时,系统报错如下: Could not set property 'id' of 'class com.xxx.xxEntity' with value '13 ...

  5. part 36 AngularJS route reload

    In this video we will discuss angular route service reload() method. This method is useful when you ...

  6. python一对一教程:Computational Problems for Physics chapter 1 Code Listings

    作者自我介绍:大爽歌, b站小UP主 ,直播编程+红警三 ,python1对1辅导老师 . 本博客为一对一辅导学生python代码的教案, 获得学生允许公开. 具体辅导内容为<Computati ...

  7. python 格式化输出详解(占位符:%、format、f表达式)——上篇 理论篇

    0 - 占位符介绍 要实现字符串的拼接,使用占位符是的一种高效.常用的方式. 举个例子,下面是不使用占位符的一种写法,直接使用加号拼接字符串 name = "Li hua" age ...

  8. scrapy获取当当网多页的获取

    结合上节,网多页的获取只需要修改 dang.py import scrapy from scrapy_dangdang.items import ScrapyDangdang095Item class ...

  9. 日记啦QWWQ

    随便写写 时间 :2021年11月15日 今天是在博客园创建博客的第一天,彻底放弃在CSDN中的博客,广告实在是太多了,QWQ. 来计科的第一个学期就快要结束了,期间有很多的遗憾,往后加油吧! 没什么 ...

  10. [bzoj4553]序列

    记第i个位置有三个属性:1.ai表示原来的值:2.bi表示变成最大的值:3.ci表示变成最小的值.那么对于如果i在j的前面,那么必然有:$ai\le cj$且$bi\le aj$,那么令f[i]表示以 ...