前言

在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使用的 xml 配置方式。

改造前

之前在 SpringBoot 中使用 Dubbox是这样的。先简单记录下版本,Dubbox-2.8.4、zkclient-0.6、zookeeper-3.4.6。

项目中引入 spring-context-dubbo.xml 配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 记录监控信息 -->
<dubbo:monitor protocol="registry"/>
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="spring-boot-pay" />
<!-- 使用zookeeper注册中心暴露服务地址 subscribe 默认:true 是否向此注册中心订阅服务,如果设为false,将只注册,不订阅 check 默认:true 注册中心不存在时,是否报错 -->
<dubbo:registry protocol="zookeeper" address="192.168.1.180:2181" check="false"/>
<!--
生产者配置 生产者 远程默认调用3次 参数 retries="2" async="true" 异步返回结果 默认是同步 timeout="10000" 毫秒
用dubbo协议在20882端口暴露服务 固定线程池 10 启动时建立线程,不关闭,一直持有 负载均衡策略 轮询
-->
<dubbo:provider timeout="10000" threads="10" threadpool="fixed" loadbalance="roundrobin"/>
<!-- name="dubbo" 协议名称 为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护。 host 部署外网设置为内网通信地址-->
<dubbo:protocol name="dubbo" port="-1" dispatcher="all" accepts="1000" /> <!-- 使用注解方式-->
<dubbo:annotation package="com.itstyle"/>
</beans>

启动类引入以下注解:

@SpringBootApplication
@ImportResource({"classpath:spring-context-dubbo.xml"})
public class Application{
private static final Logger logger = Logger.getLogger(Application.class); public static void main(String[] args) throws InterruptedException,
IOException {
logger.info("支付项目启动 ");
} }

改造后

然而 SpringBoot 引入了新的概念 Spring Boot Starter,它有效的降低了项目开发过程的复杂程度,对于简化开发操作有着非常好的效果。

starter的理念

starter 会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦。

需要注意的是不同的 starter 是为了解决不同的依赖,所以它们内部的实现可能会有很大的差异,例如 jpa 的starter 和 Redis 的 starter 可能实现就不一样,这是因为 starter 的本质在于 synthesize,这是一层在逻辑层面的抽象,也许这种理念有点类似于 Docker,因为它们都是在做一个“包装”的操作,如果你知道 Docker 是为了解决什么问题的,也许你可以用 Docker 和 starter 做一个类比。

starter的实现

虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfiguration。

因为Spring Boot坚信“约定大于配置”这一理念,所以我们使用ConfigurationProperties来保存我们的配置,并且这些配置都可以有一个默认值,即在我们没有主动覆写原始配置的情况下,默认值就会生效,这在很多情况下是非常有用的。

除此之外,starter的ConfigurationProperties还使得所有的配置属性被聚集到一个文件中(一般在resources目录下的application.properties),这样我们就告别了Spring项目中XML地狱。

starter的整体逻辑

强如Dubbo,当然也会创建属于自己的 starter 来迎合Spring Boot 的火热。

这里我们使用Dubbo比较新的版本,pom.xml 引入以下:

<!-- dubbo 替换  dubbox-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- curator-recipes 替换 zkclient-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>

application.properties 配置:

## dubbo springboot 配置
spring.dubbo.application.id=springboot_pay
spring.dubbo.application.name=springboot_pay
spring.dubbo.registry.address=zookeeper://192.168.1.127:2181
spring.dubbo.provider.threads=10
spring.dubbo.provider.threadpool=fixed
spring.dubbo.provider.loadbalance=roundrobin
spring.dubbo.server=true
spring.dubbo.protocol.name=dubbo

启动类加入以下注解:

@EnableDubboConfiguration
@SpringBootApplication
public class Application{
private static final Logger logger = Logger.getLogger(Application.class); public static void main(String[] args) throws InterruptedException,
IOException {
logger.info("支付项目启动 ");
} }

相关暴露接口实现配置:

import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Service; @Service
@Component
public class AliPayServiceImpl implements IAliPayService {
//省略代码
}

最后启动服务,如果启动成功并注册到注册中心,说明改造成功。

补充

Dubbo 2.6.1 是改变结构后首次发布的版本,Dubbo 2.6.0 已合并当当网提供的 Dubbox 分支。

Dubbo的版本策略:两个大版本并行发展,2.5.x是稳定版本,2.6.x是新功能实验版本。2.6上实验都稳定了以后,会迁移到2.5。

总结

  • 原当当 Dubbox 2.8.4 替换为 Dubbo 2.6.2
  • 原 spring-context-dubbo.xml 配置 替换为 dubbo-spring-boot-starter 2.0.0
  • 原 zkclient 0.6 替换为 curator-recipes 4.0.1
  • 原 zookeeper 3.4.6 升级为 zookeeper 3.5.3

案例

支付宝,微信,银联详细代码案例:https://gitee.com/52itstyle/spring-boot-pay

参考

https://github.com/apache/incubator-dubbo

https://github.com/alibaba/dubbo-spring-boot-starter/blob/master/README_zh.md

https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters

https://www.nosuchfield.com/2017/10/15/Spring-Boot-Starters/

SpringBoot开发案例之整合Dubbo分布式服务的更多相关文章

  1. SpringBoot 开发案例之整合FastDFS分布式文件系统

    1.pom依赖 <!--fastdfs--> <dependency> <groupId>com.github.tobato</groupId> < ...

  2. SpringBoot开发案例之整合Kafka实现消息队列

    前言 最近在做一款秒杀的案例,涉及到了同步锁.数据库锁.分布式锁.进程内队列以及分布式消息队列,这里对SpringBoot集成Kafka实现消息队列做一个简单的记录. Kafka简介 Kafka是由A ...

  3. SpringBoot开发案例之整合Activiti工作流引擎

    前言 JBPM是目前市场上主流开源工作引擎之一,在创建者Tom Baeyens离开JBoss后,JBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过,目前官 ...

  4. 转载-SpringBoot开发案例之整合日志管理

    转载:https://cloud.tencent.com/developer/article/1097579 有一种力量无人能抵挡,它永不言败生来倔强.有一种理想照亮了迷茫,在那写满荣耀的地方. 00 ...

  5. SpringBoot开发案例从0到1构建分布式秒杀系统

    前言 ​最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...

  6. Dubbo 分布式服务框架简介

    1.分布式服务框架 1.1 Dubbo 简介 Dubbo 是一个分布式服务框架,以及阿里巴巴内部的 SOA 服务化治理方案的核心框架.其功能主要包括:高性能 NIO 通讯及多协议集成,服务动态寻址与路 ...

  7. dubbo 分布式服务框架 介绍

    Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo自2011年开源后, ...

  8. Dubbo分布式服务子系统的划分

    一.划分子系统的策略 按照系统的业务模块的独立性划分 二.划分时服务子系统的数量的控制 过多:可能划分过细,破坏业务子系统的独立性,部署维护工作量大,独立进程占用内存多 过少:没能很好的解耦,开发维护 ...

  9. SpringBoot开发案例之多任务并行+线程池处理

    前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...

随机推荐

  1. 【软件需求工程与建模 - 小组项目】第6周 - 成果展示2 - 软件需求规格说明书V4.3

    成果展示2 - 软件需求规格说明书V4.3

  2. C#面向对象 类

    ; i < ; i++) { student.b++;//静态字段若不赋值,默认为1: new student().a++;//引用类型变量定义后,必须使用new关键字创建对象 才能后才能使用 ...

  3. mssql sqlserver 获取指定汉字的笔画数的方法分享

    转自:http://www.maomao365.com/?p=6421 摘要: 下文讲述计算汉字笔画数的sql函数分享,如下所示: 例:建立汉字笔画数sql函数 )) returns int as b ...

  4. c#核心基础--类的构造方法

    一.构造方法 类的构造方法是类的成员方法的一种,它的作用是对类中的成员进行初始化操作.类的构造方法分为: 1.静态构造方法 2.实例构造方法 3.私有构造方法 1.静态构造方法 类的静态构造方法是类的 ...

  5. 洗礼灵魂,修炼python(64)--爬虫篇—re模块/正则表达式(2)

    前面学习了元家军以及其他的字符匹配方法,那得会用啊对吧?本篇博文就简单的解析怎么运用 正则表达式使用 前面说了正则表达式的知识点,本篇博文就是针对常用的正则表达式进行举例解析.相信你知道要用正则表达式 ...

  6. java 根据实体对象生成 增删改的SQL语句 ModelToSQL

    package com.xxx.utils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import jav ...

  7. SQL Server datetime类型转换超出范围的报错

    一个很基础的插入语句: insert into table1 select col1,convert(datetime,col2),convert(datetime,col3),col4,col5 f ...

  8. 获取url查询参数的方法

    /** * 获取url查询参数的方法 * @param name * @returns {null} * @constructor */ function GetQueryString(name) { ...

  9. March 10th, 2018 Week 10th Saturday

    All good things must come to an end. 好景无常. Love is when the other person's happiness is more importa ...

  10. 移动端rem flexible方案

    一.px 自动转换为rem sublim Text3 下载本项目,比如:git clone https://github.com/flashlizi/cssrem 进入packages目录(在Subl ...