企业级SpringBoot与Dubbo的使用方式

SpringBoot越来越热门以至于达到满大街可见的程度,而Dubbo这个基于二进制的微服务框架又捐献给Apache孵化,如果不会如何使用那么是不是很不好意思呢?

这次从公司的项目中抽一个小列子来熟悉下如果从零构建,至于深入了解->传送门:Dubbo官方中文手册

版本:

  1. Springboot2.x
  2. Double2.6
  3. Zk3.4.14
  4. JDK8

这里就不介绍Dubbo了,传送去看看以前的:互联网级微服务架构神器Duubo

zookeepr安装

下载去官网查找稳定的版本进行使用:http://www.apache.org/dyn/closer.cgi/zookeeper/

先在服务器上安装zookeeper。

  1. cd /usr/local/src/
  2. #下载
  3. sudo wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
  4. #解压
  5. tar -zxvf zookeeper-3.4.14.tar.gz
  6. #修改配置文件名称
  7. mv conf/zoo_sample.cfg zoo.cfg
  8. #启动zk
  9. ./bin/zkServer.sh start
  10. #出现以下字样代表启动成功,默认端口2181
  11. Starting zookeeper ... STARTED

SpringBoot2.x整合Dubbo

父工程搭建(pom工程)
  1. <groupId>com.simple.springboot</groupId>
  2. <artifactId>yun-double</artifactId>
  3. <version>0.0.1-SNAPSHOT</version>
  4. <packaging>pom</packaging>
  5. <name>yun-double</name>
  6. <description>double</description>
  7. <!--统一管理依赖版本-->
  8. <properties>
  9. <java.version>1.8</java.version>
  10. <double.version>2.0.0</double.version>
  11. <zkclient.version>0.10</zkclient.version>
  12. </properties>
  13. <!-- 依赖于SpringBoot -->
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>2.1.4.RELEASE</version>
  18. <relativePath/>
  19. </parent>
  20. <!--依赖定义-->
  21. <dependencyManagement>
  22. <dependencies>
  23. <dependency>
  24. <groupId>com.alibaba.spring.boot</groupId>
  25. <artifactId>dubbo-spring-boot-starter</artifactId>
  26. <version>${double.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>com.101tec</groupId>
  30. <artifactId>zkclient</artifactId>
  31. <version>${zkclient.version}</version>
  32. </dependency>
  33. </dependencies>
  34. </dependencyManagement>
创建公共接口工程common

该工程用于存储服务层接口,以减少代码的冗余。

  1. <modelVersion>4.0.0</modelVersion>
  2. <parent>
  3. <groupId>com.simple.springboot</groupId>
  4. <artifactId>yun-double</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. </parent>
  7. <groupId>com.simple.springboot</groupId>
  8. <artifactId>common</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. <name>common</name>
  11. <description>公共接口</description>

创建公共接口

  1. public interface UserService {
  2. String getUserById(int id);
  3. }
创建服务提供者(provider)

Pom文件

  1. <modelVersion>4.0.0</modelVersion>
  2. <groupId>com.simple.springboot</groupId>
  3. <artifactId>provider</artifactId>
  4. <version>0.0.1-SNAPSHOT</version>
  5. <packaging>jar</packaging>
  6. <name>provider</name>
  7. <description>生产者</description>
  8. <parent>
  9. <groupId>com.simple.springboot</groupId>
  10. <artifactId>yun-double</artifactId>
  11. <version>0.0.1-SNAPSHOT</version>
  12. </parent>
  13. <dependencies>
  14. <!-- SpringBoot快速启动Duubbo -->
  15. <dependency>
  16. <groupId>com.alibaba.spring.boot</groupId>
  17. <artifactId>dubbo-spring-boot-starter</artifactId>
  18. </dependency>
  19. <!-- Zk客户端依赖 -->
  20. <dependency>
  21. <groupId>com.101tec</groupId>
  22. <artifactId>zkclient</artifactId>
  23. <!-- 排除依赖里的日志 -->
  24. <exclusions>
  25. <exclusion>
  26. <groupId>log4j</groupId>
  27. <artifactId>log4j</artifactId>
  28. </exclusion>
  29. <exclusion>
  30. <groupId>org.slf4j</groupId>
  31. <artifactId>slf4j-api</artifactId>
  32. </exclusion>
  33. <exclusion>
  34. <groupId>org.slf4j</groupId>
  35. <artifactId>slf4j-log4j12</artifactId>
  36. </exclusion>
  37. </exclusions>
  38. </dependency>
  39. <!-- 导入公共接口依赖 -->
  40. <dependency>
  41. <groupId>com.simple.springboot</groupId>
  42. <artifactId>common</artifactId>
  43. <version>0.0.1-SNAPSHOT</version>
  44. </dependency>
  45. </dependencies>
  46. <build>
  47. <plugins>
  48. <plugin>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-maven-plugin</artifactId>
  51. </plugin>
  52. </plugins>
  53. </build>

在pom文件中我们需要引入Dubbo,Zk客户端并且引入公共接口工程

application.properties配置文件

  1. #dubbo.application.name 应用名称
  2. #dubbo.registry.address 注册中心地址
  3. #dubbo.protocol.name 协议名称
  4. #dubbo.protocol.port 协议端口
  5. #dubbo.scan dubbo 服务类包目录
  6. #server.port=8080
  7. spring.application.name=user-pro
  8. dubbo.application.name=user-provider1
  9. dubbo.registry.address=zookeeper://192.168.197.133:2181
  10. dubbo.protocol.name=dubbo
  11. dubbo.protocol.port=20880

在这里dubbo.application.name应用名称一定不能重复

实现UserService

  1. @Component
  2. @Service(timeout = 10000,interfaceClass = UserService.class)
  3. public class UserServiceImpl implements UserService {
  4. @Override
  5. public String getUserById(int id) {
  6. if(id == 1) {
  7. return "SimpleWu";
  8. }else {
  9. return "Apache Dubbo";
  10. }
  11. }
  12. }

@Service 这个注解使用的不是Spring里面的而是com.alibaba.dubbo.config.annotation.Service

timeout 配置超时时间

interfaceClass 接口类

version 服务版本,如果配置了服务版本在消费端引用也必须一样,具体等会说

创建启动类

在该工程中我们不需要引入Web模块浪费端口号,只需要这样写启动类

  1. @EnableDubbo
  2. @EnableDubboConfiguration
  3. @DubboComponentScan("com.simple.springboot.provider.common.impl")
  4. public class ProviderApplication {
  5. public static void main(String[] args) {
  6. SpringApplication app = new SpringApplication(ProviderApplication.class);
  7. app.run(args);
  8. //dubbo Main独立运行,脱离web容器
  9. Main.main(args);
  10. }
  11. }

@EnableDubbo 启动Dubbo功能

@EnableDubboConfiguration 启动Duubbo配置

@DubboComponentScan 扫描提供者实现类

创建服务消费者(consumer)

POM文件

  1. <modelVersion>4.0.0</modelVersion>
  2. <groupId>com.simple.springboot</groupId>
  3. <artifactId>consumer</artifactId>
  4. <version>0.0.1-SNAPSHOT</version>
  5. <name>consumer</name>
  6. <description>消费者</description>
  7. <parent>
  8. <groupId>com.simple.springboot</groupId>
  9. <artifactId>yun-double</artifactId>
  10. <version>0.0.1-SNAPSHOT</version>
  11. </parent>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-test</artifactId>
  20. </dependency>
  21. <!-- SpringBoot快速启动Duubbo -->
  22. <dependency>
  23. <groupId>com.alibaba.spring.boot</groupId>
  24. <artifactId>dubbo-spring-boot-starter</artifactId>
  25. </dependency>
  26. <!-- Zk客户端依赖 -->
  27. <dependency>
  28. <groupId>com.101tec</groupId>
  29. <artifactId>zkclient</artifactId>
  30. <!-- 排除依赖里的日志 -->
  31. <exclusions>
  32. <exclusion>
  33. <groupId>log4j</groupId>
  34. <artifactId>log4j</artifactId>
  35. </exclusion>
  36. <exclusion>
  37. <groupId>org.slf4j</groupId>
  38. <artifactId>slf4j-api</artifactId>
  39. </exclusion>
  40. <exclusion>
  41. <groupId>org.slf4j</groupId>
  42. <artifactId>slf4j-log4j12</artifactId>
  43. </exclusion>
  44. </exclusions>
  45. </dependency>
  46. <!-- 导入公共接口依赖 -->
  47. <dependency>
  48. <groupId>com.simple.springboot</groupId>
  49. <artifactId>common</artifactId>
  50. <version>0.0.1-SNAPSHOT</version>
  51. </dependency>
  52. </dependencies>
  53. <build>
  54. <plugins>
  55. <plugin>
  56. <groupId>org.springframework.boot</groupId>
  57. <artifactId>spring-boot-maven-plugin</artifactId>
  58. </plugin>
  59. </plugins>
  60. </build>

在这个工程中我们是需要依赖Web的,不然咋访问呢

编写Application.properties配置文件

  1. spring.application.name=user-con
  2. server.port=8080
  3. dubbo.application.name=user-consumer
  4. dubbo.registry.address=zookeeper://192.168.197.133:2181
  5. dubbo.protocol.name=dubbo
  6. dubbo.protocol.port=20880
  7. #dubbo.scan=com.simple.springboot.provider.common.impl

在这里dubbo.application.name应用名称一定不能重复

dubbo.scan 该配置指向应该是要和服务提供方一致

编写Controller

  1. @RestController
  2. public class UserController {
  3. //timeout 可以不指定,如果提供则有填写但是version一定要指定 不然会找不到服务 直连需要加url="dubbo://localhost:20880"
  4. @Reference
  5. private UserService userService;
  6. @GetMapping("/dubbo/user/{id}")
  7. public String getUserById(@PathVariable int id){
  8. return userService.getUserById(id);
  9. }
  10. }

在这里是使用@Reference去发现服务而不是@Autowired去注入Bean

@Reference 里面可以配置version,timeout超时时间

如果需要Dubbo直连url="dubbo://localhost:20880"

dubbo提供了四种负载均衡策略,分别是:

1、Random LoadBalance 按权重的随机负载均衡,也是dubbo默认的负载均衡策略

2、RoundRobin LoadBalance 按权重的轮询负载均衡,即在轮询的基础上添加了权重的策略

3、LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机访问,活跃数指调用前后的计数差即响应时间的长短;这种策略可以使响应慢的提供者收到的请求较少,大大提供系统性能

4、ConsistentHash LoadBalance 一致性哈希;相同参数的请求总是发到同一提供者

负载均衡的配置:@Reference(loadbalance = "roundrobin"),loadbalance 的值即为四种负载均衡的名称,全部小写

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。下面列举dubbo支持的容错策略:

1、Failover Cluster:失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="XXX" 来设置重试次数(不含第一次)。

2、Failfast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

3、Failsafe Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

4、Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

5、Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

6、Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

配置如下:@Reference(cluster = "failsafe")这里表示使用失败安全的容错策略

编写启动类

  1. /**
  2. * @author:SimpleWu
  3. * @date: 2019-05-08
  4. */
  5. @EnableDubbo
  6. @SpringBootApplication
  7. @EnableDubboConfiguration
  8. @DubboComponentScan("com.simple.springboot.provider.common.impl")
  9. public class ConsumerApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(ConsumerApplication.class,args);
  12. }
  13. }

然后直接就可以访问成功了。

如果不想使用注解扫描可以使用properties进行配置

  1. #dubbo.scan=com.simple.springboot.provider.common.impl

参考代码:传送门

注意事项:

Dubbo是一个二进制的Rpc框架在传输数据过程中,实体类必须经过序列化。

在使用poi导出功能时一定不能把response传到Service层,否则传输到Service是导出不了文件而报错,至于文件下载也一样但是相信一般都会有单独的文件服务器。

企业级SpringBoot与Dubbo的使用方式的更多相关文章

  1. dubbo与springboot的三种整合方式

    SpringBoot与dubbo整合的三种方式:1.导入dubbo-starter,在application.properties配置属性,使用@Service暴露服务,使用@Reference引用服 ...

  2. springboot与dubbo整合入门(三种方式)

    Springboot与Dubbo整合三种方式详解 整合环境: jdk:8.0 dubbo:2.6.2 springboot:2.1.5 项目结构: 1.搭建项目环境: (1)创建父项目与三个子项目,创 ...

  3. SpringBoot集成dubbo实例

    项目总览图: 最下面有项目的pom,具体内容: 项目运行注意事项: 先启动 provider, 将providers.xml中 port 先修改为20187 执行test目录 下的DubboProvi ...

  4. 5 springboot 集成dubbo

    Apache Dubbo 是一款高性能Java RPC框架 由阿里巴巴开源并进入Apache孵化器,官网 http://dubbo.apache.org 提供服务化基础功能: 接口远程调用,智能负载均 ...

  5. 【转】SpringBoot学习笔记(7) SpringBoot整合Dubbo(使用yml配置)

    http://blog.csdn.net/a67474506/article/details/61640548 Dubbo是什么东西我这里就不详细介绍了,自己可以去谷歌 SpringBoot整合Dub ...

  6. Springboot整合Dubbo和Zookeeper

    Dubbo是一款由阿里巴巴开发的远程服务调用框架(RPC),其可以透明化的调用远程服务,就像调用本地服务一样简单.截至目前,Dubbo发布了基于Spring Boot构建的版本,版本号为0.2.0,这 ...

  7. IDEA上创建 Maven SpringBoot + zookeeper +dubbo 实例

    概述 首先声明,本文是学习总结类型的博客内容,如有雷同纯属学习.本位主要结合zookeeper和dubbo做个简单实例.目前来说,一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越 ...

  8. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  9. springboot整合dubbo\zookeeper做注册中心

    springboot整合dubbo发布服务,zookeeper做注册中心.前期的安装zookeeper以及启动zookeeper集群就不说了. dubbo-admin-2.5.4.war:dubbo服 ...

随机推荐

  1. IOS版App的控件元素定位

    前言 Android版App的控件元素可以通过Android studio自带的工具uiautomatorviewer来协助定位! IOS版App的控件元素可以通过Appium来实现(未实现),或ap ...

  2. 怎么将linux的动态IP设置成静态IP

    例如我的eth0网卡信息如下 eth0 Link encap:Ethernet HWaddr :0C::AA:B2:CA inet addr:192.168.79.135 Bcast:192.168. ...

  3. gridview 横向滚动 一行显示

    http://blog.csdn.net/chin3q/article/details/6559345 http://blog.csdn.net/yuzhouxiang/article/details ...

  4. EasyDarwin实现RTSP播放动态认证的两种方式:Basic/Digest & Token

    问题描述 目前为了能够方便开发者,我们将EasyDarwin中的RTSP认证过程直接忽略过了,如果要开启认证的方式,我们可以在代码中打开: case kRoutingRequest: { // Inv ...

  5. input光标位置

    兼容谷歌火狐-input光标位置 input框在没有添加任何效果的情况下,输入文字后光标始终在最后的位置,谷歌||火狐效果一样 但是在给input加入点击事件后 谷歌:input框插入文字后,光标会自 ...

  6. hdu1015 Safecracker —— 回溯

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015 代码1: #include<stdio.h>//hdu1015 #include&l ...

  7. C语言中的排序算法--冒泡排序,选择排序,希尔排序

    冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

  8. CentOS中文乱码之解决办法

    在学习Linux的过程中,最先碰到的是通过SSH终端连接时发现有乱码出现,使用这篇文章先从这里说起. 在 ssh , telnet 终端中文显示乱码解决办法#vim /etc/sysconfig/i1 ...

  9. 用HTML5 Canvas为Web图形创建特效

    HTML5 Canvas 将使用像素在屏幕上绘制图形图像. 本节演示了五种用于操作像素以创建摄影特效的 Canvas 技术. 您可使用这些技术来生成独具特色的图像,为您的网站.博客.视频游戏画面.广告 ...

  10. codeforces A. Fox and Box Accumulation 解题报告

    题目链接:http://codeforces.com/problemset/problem/388/A 题目意思:有 n 个 boxes,每个box 有相同的 size 和 weight,但是stre ...