SpringBoot开发案例之整合Dubbo分布式服务

Easter79
• 阅读 463

SpringBoot开发案例之整合Dubbo分布式服务 前言

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

改造前

SpringBoot开发案例之整合Dubbo分布式服务

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

  4. xsi:schemaLocation="http://www.springframework.org/schema/beans

  5. http://www.springframework.org/schema/beans/spring-beans.xsd

  6. http://code.alibabatech.com/schema/dubbo

  7. http://code.alibabatech.com/schema/dubbo/dubbo.xsd

  8. ">

  9. <!-- 记录监控信息 -->

  10. <dubbo:monitor protocol="registry"/>

  11. <!-- 提供方应用信息,用于计算依赖关系 -->

  12. <dubbo:application name="spring-boot-pay" />

  13. <!-- 使用zookeeper注册中心暴露服务地址 subscribe 默认:true 是否向此注册中心订阅服务,如果设为false,将只注册,不订阅 check 默认:true 注册中心不存在时,是否报错    -->

  14. <dubbo:registry protocol="zookeeper" address="192.168.1.180:2181" check="false"/>

  15. <!--

  16. 生产者配置 生产者  远程默认调用3次 参数 retries="2" async="true" 异步返回结果 默认是同步 timeout="10000" 毫秒

  17. 用dubbo协议在20882端口暴露服务  固定线程池 10 启动时建立线程,不关闭,一直持有  负载均衡策略 轮询

  18. -->

  19. <dubbo:provider timeout="10000" threads="10" threadpool="fixed" loadbalance="roundrobin"/>

  20. <!-- name="dubbo" 协议名称   为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护。 host 部署外网设置为内网通信地址-->

  21. <dubbo:protocol name="dubbo" port="-1" dispatcher="all" accepts="1000" />

  22. <!-- 使用注解方式-->

  23. <dubbo:annotation package="com.itstyle"/>

  24. </beans>

启动类引入以下注解:

  1. @SpringBootApplication

  2. @ImportResource({"classpath:spring-context-dubbo.xml"})

  3. public class Application{

  4. private static final Logger logger = Logger.getLogger(Application.class);

  5. public static void main(String[] args) throws InterruptedException,

  6. IOException {

  7. logger.info("支付项目启动 ");

  8. }

  9. }

改造后

SpringBoot开发案例之整合Dubbo分布式服务

然而 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的整体逻辑

SpringBoot开发案例之整合Dubbo分布式服务

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

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

  1. <!-- dubbo 替换  dubbox-->

  2. <dependency>

  3. <groupId>com.alibaba</groupId>

  4. <artifactId>dubbo</artifactId>

  5. <version>2.6.2</version>

  6. </dependency>

  7. <dependency>

  8. <groupId>com.alibaba.spring.boot</groupId>

  9. <artifactId>dubbo-spring-boot-starter</artifactId>

  10. <version>2.0.0</version>

  11. </dependency>

  12. <!-- curator-recipes 替换  zkclient-->

  13. <dependency>

  14. <groupId>org.apache.curator</groupId>

  15. <artifactId>curator-recipes</artifactId>

  16. <version>4.0.1</version>

  17. </dependency>

application.properties 配置:

  1. ## dubbo springboot 配置

  2. spring.dubbo.application.id=springboot_pay

  3. spring.dubbo.application.name=springboot_pay

  4. spring.dubbo.registry.address=zookeeper://192.168.1.127:2181

  5. spring.dubbo.provider.threads=10

  6. spring.dubbo.provider.threadpool=fixed

  7. spring.dubbo.provider.loadbalance=roundrobin

  8. spring.dubbo.server=true

  9. spring.dubbo.protocol.name=dubbo

启动类加入以下注解:

  1. @EnableDubboConfiguration

  2. @SpringBootApplication

  3. public class Application{

  4. private static final Logger logger = Logger.getLogger(Application.class);

  5. public static void main(String[] args) throws InterruptedException,

  6. IOException {

  7. logger.info("支付项目启动 ");

  8. }

  9. }

相关暴露接口实现配置:

  1. import org.springframework.stereotype.Component;

  2. import com.alibaba.dubbo.config.annotation.Service;

  3. @Service

  4. @Component

  5. public class AliPayServiceImpl implements IAliPayService {

  6. //省略代码

  7. }

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

补充

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分布式服务

从构建分布式秒杀系统聊聊验证码

SpringBoot开发案例之整合Dubbo分布式服务

从构建分布式秒杀系统聊聊分布式锁

SpringBoot开发案例之整合Dubbo分布式服务

从构建分布式秒杀系统聊聊WebSocket推送通知

SpringBoot开发案例之整合Dubbo分布式服务

从构建分布式秒杀系统聊聊重复下单

最后给大家推荐一个走心的公众号,号主,倪升武,江湖人称武哥。同济大学硕士毕业,是一个被技术耽误的文艺青年。先后在eBay,爱奇艺,华为干过,目前在科大讯飞从事Java领域的开发。公号内有技术,也有段子,有个人感悟,也有视频资源,尿性十足。利用碎片时间学习,每天进步一点点,否则怎么叫"私房菜"呢?

SpringBoot开发案例之整合Dubbo分布式服务

本文分享自微信公众号 - 爪哇笔记(Java_notes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
SpringBoot开发案例之整合Dubbo分布式服务
!(https://oscimg.oschina.net/oscnet/28e6892843e943139df80dc6571b37ee.jpg)前言在SpringBoot很火热的时候,阿里巴巴的分布式框架Dubbo不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本Dubbox,整合方
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k