高并发下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. SDKStyle的Framework项目使用旧版项目文件生成的Nuget包遇到的问题

    随笔-2021-11-10 SDKStyle的Framework项目使用旧版项目文件生成的Nuget包遇到的问题 简介 C#从NetCore之后使用了新版的项目文件,SDK-Style项目,新版本的项 ...

  2. [源码解析] PyTorch 分布式(3) ----- DataParallel(下)

    [源码解析] PyTorch 分布式(3) ----- DataParallel(下) 目录 [源码解析] PyTorch 分布式(3) ----- DataParallel(下) 0x00 摘要 0 ...

  3. 线性规划之单纯形算法矩阵描述与python实现

    声明 本文为本人原创,转载请注明出处.本文仅发表在博客园,作者LightningStar. 问题描述 所有的线性规划问题都可以归约到标准型的问题,规约过程比较简单且已经超出本文范围,不再描述,可以参考 ...

  4. [bzoj2743]采花

    预处理出每一个点下一个相同颜色的位置,记为next,然后将询问按左端点排序后不断右移左指针,设要删除i位置,就令f[next[next[i]]+1,同时还要删除原来的标记,即令f[next[i]]-1 ...

  5. 【k8s】在AWS EKS部署并通过ALB访问k8s Dashboard保姆级教程

    本教程适用范围 在AWS上使用EKS服务部署k8s Dashboard,并通过ALB访问 EKS集群计算节点采用托管EC2,并使用启动模板. 使用AWS海外账号,us-west-2区域 使用账号默认v ...

  6. 解决texlive化学式转换镜像经常偶发性进程堆积导致卡顿问题

    前言 之前在 使用Python定时清理运行超时的pdflatex僵尸进程 博文中我采用python脚本开启定时任务清理pdflatex僵尸进程,线上4u2G的k8s pod部署了3个,pdflatex ...

  7. [USACO17FEB]Why Did the Cow Cross the Road III P

    [USACO17FEB]Why Did the Cow Cross the Road III P 考虑我们对每种颜色记录这样一个信息 \((x,y,z)\),即左边出现的位置,右边出现的位置,该颜色. ...

  8. Java培训班学员如何找工作?如何过试用期?

    在本文里,首先将结合我了解的多家培训班辅导学员就业的情况,来讲讲培训班学员如何高效找工作.由于本人在周末会兼职在培训班讲课,也帮助过不少学员成功入职,所以下文还会给出"培训班学员如何快速适应 ...

  9. doxygen相关命令

    主要配置修改 整个程序配置分几个部分 Project related configuration options 项目相关,包括: 项目名 输出目录 输出语言 是否显示继承属性 是否对C.Java.F ...

  10. 【转】NG:垂枝桦基因组图谱构建(2+3组装)及重测序分析

    转自希望组公众号.学习二代+三代组装策略的流程 垂枝桦(Betula pendula)是一种速生乔木,能在短短一年时间内开花,木质坚实,可做细工.家具等,经济价值极高.近日,芬兰研究人员对垂枝桦自交系 ...