SpringBoot2.1(9)使用Dubbo搭建分布式应用

《回顾》

之前已经写了8篇SpringBoot2相关的文章,如果你读过,应该可以学到一些东西。那些算是基础。后面Dubbo和SpringCloud的文章,都会依赖这些基础。

 

这一篇,就开始搭建分布式应用。

使用SpringBoot2.1.1结合Dubbo搭建第一个分布式应用。

 

一、为什么要使用分布式?

在系统越来越庞大的时候,单纯使用集群的方式来部署应用已经不能满足现实情况。此时就需要依照业务或技术维度,将系统拆分成多个模块,作为独立服务单独部署。

分布式系统,很灵活。

高复用的模块,可以多部署一些节点,边缘模块相对少部署几个节点。如此不仅降低了硬件成本,而且提升了系统整体的健壮性。

 

二、Dubbo在分布式系统中扮演什么角色?

有拆分,就有交互。

原来,所有模块都写在一个项目中,直接通过代码调用即可完成两个模块间的交互。

现在,将系统切割成多个单独运行的模块,系统间交互部分,就可以使用Dubbo来完成。

 

三、Dubbo前世今生

阿里巴巴2011年开源的优秀Java RPC框架

2013年以后,停止维护。

2017年9月,开始重新维护,并疯狂更新。

2018年2月15日,成为 Apache 基金会孵化项目。

近期,准备发布的2.7版本,有望成为Apache顶级项目

 

四、Dubbo架构介绍

 

  • 架构图

SpringBoot2.1(9)使用Dubbo搭建分布式应用

 

 

  • 节点角色说明

     

 

节点

角色说明

Provider

暴露服务的服务提供方

Consumer

调用远程服务的服务消费方

Registry

服务注册与发现的注册中心

Monitor

统计服务的调用次数和调用时间的监控中心

Container

服务运行容器

 

  • 调用关系说明,对应上图编号

0-服务容器负责启动,加载,运行服务提供者。

1-服务提供者在启动时,向注册中心注册自己提供的服务。

2-服务消费者在启动时,向注册中心订阅自己所需的服务。

3-注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4-服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5-服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

 

 

五、开发准备

1、搭建一个Maven多Module项目,结构如下:

SpringBoot2.1(9)使用Dubbo搭建分布式应用

 

1.1、模块介绍

demo-dubbo-api -> 普通jar包,provider和consumer共同调用的部分,放在该包中

demo-dubbo-provider -> 可启动的jar包,服务提供者

demo-dubbo-consumer -> 可启动的jar包,服务消费者

注:如果没有搭建过多Module项目,可以在文末获取本项目源码参考。

 

2、Zookeeper

注册中心,Dubbo官方推荐使用Zookeeper。

 

2.1、Zookeeper下载地址:

http://mirrors.hust.edu.cn/apache/zookeeper

 

3、引入Maven

<dependency>
   <groupId>com.alibaba.boot</groupId>
   <artifactId>dubbo-spring-boot-starter</artifactId>
   <version>0.2.0</version>
</dependency>

 

三个Module依赖如下图:

SpringBoot2.1(9)使用Dubbo搭建分布式应用

 

六、编写代码

 

1、在 demo-dubbo-api 项目中,新建接

public interface DemoService {
   String sayHello(String name);
}

 

2、在 demo-dubbo-provider 服务提供者项目中,新建接口实现

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

@Service
public class DemoServiceImpl implements DemoService {

   private Logger log = LoggerFactory.getLogger(getClass()); // 日志

   @Override
   public String sayHello(String name) {
       log.info("你好:{},我是服务提供者,这是第一个Dubbo分布式应用",name);
       return String.format("你好:%s,我是服务提供者,这是第一个Dubbo分布式应用",name);
   }
}

注意:此处的@Service 是alibaba包下面的

 

3、在 demo-dubbo-consumer 服务消费者项目中,新建Controller,并调用远程接口

@RestController
public class IndexController {
   private Logger log = LoggerFactory.getLogger(getClass()); // 日志

   @Reference
   private DemoService demoService;

   @GetMapping("/index")
   public Map<String,String> index(@RequestParam String name){
       log.info("服务消费者收到请求参数:{},开始请求远程接口...",name);
       return Map.of("result",demoService.sayHello(name));
   }
}

注意:此处的DemoService,要使用@Reference 注入。

 

 

七、配置文件配置

  • demo-dubbo-provider 服务提供者项目

#服务消费者端口号
server.port=9081
#指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)
dubbo.application.name=demo-dubbo-consumer
# 版本
demo.service.version=1.0.0
# 协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.protocol.host=192.168.22.215
# 指定注册中心的位置
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 统一设置服务提供方的规则
dubbo.consumer.timeout=5000

 

  • demo-dubbo-consumer 服务消费者项目

# 服务提供者端口号
server.port=9080
# 指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)
dubbo.application.name=demo-dubbo-provider
# 版本
demo.service.version=1.0.0
# 协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
# 指定注册中心的位置
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 统一设置服务提供方的规则
dubbo.provider.timeout=1000
# 实现类的包路径(换成自己的)
dubbo.scan.basePackages=com.zhou.springbootz09.dubboprovider.impl

 

八、启动应用

启动应用,有顺序要求

1、启动服务提供者(demo-dubbo-provider)

2、启动服务消费者(demo-dubbo-consumer)

 

九、测试

访问服务消费者Controller接口,此处使用Swagger-UI进行接口测试。

访问:

http://localhost:9081/swagger-ui.htm

 

SpringBoot2.1(9)使用Dubbo搭建分布式应用

 

查看日志输出

  • 服务消费者:

SpringBoot2.1(9)使用Dubbo搭建分布式应用

 

  • 服务提供者

SpringBoot2.1(9)使用Dubbo搭建分布式应用

这篇内容,相对有一些难度。从单个应用到分布式系统需要有一个观念转变。

 

 

博客内所有文章,每周从公众号同步一次。

文章源码均可从公众号获取。

如果您可以关注下,那就好了。

SpringBoot2.1(9)使用Dubbo搭建分布式应用