一、前言

上篇介绍了 Redis 的集成过程,可用于解决热点数据访问的性能问题。随着业务复杂度的提高,单体应用越来越庞大,就好比一个类的代码行数越来越多,分而治之,切成多个类应该是更好的解决方法,所以一个庞大的单体应用分出多个小应用也更符合这种分治的思想。于是乎微服务化的概念油然而生,微服务化的第一步就是选择适用的分布式服务框架,基于团队成员有使用过「 Dubbo 」的经验,我们放弃了完全陌生的「 Spring Cloud 」。本篇将主要介绍在 Spring Boot 中集成 Dubbo 的过程。


二、集成 Dubbo

2.1 引入 Dubbo 依赖包

① 首先在项目父 pom 文件中声明 Dubbo 依赖。

<dependencyManagement>
<dependencies>
...省略其余部分...
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
</dependencyManagement>

② 其次在 demo-biz 层中的 pom 文件添加上述 Dubbo 依赖。

<dependencies>
...省略其余部分...
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
</dependencies>

2.2 添加 Dubbo 常用配置项

在 application.properties 文件中的添加 Dubbo 相关的配置项:

# 当前应用名称,用于注册中心计算应用间依赖关系
dubbo.application.name = demo
# 组织名称,用于注册中心区分服务来源
dubbo.application.organization = example
# 应用负责人,用于服务治理
dubbo.application.owner = linjian
# 注册中心地址协议
dubbo.registry.protocol = zookeeper
# 注册中心服务器地址
dubbo.registry.address = 127.0.0.1:2181
# 协议名称
dubbo.protocol.name = dubbo
# 服务端口
dubbo.protocol.port = 20880
# 服务版本
dubbo.provider.version = 1.0.0.dev
# 远程服务调用超时时间(毫秒)
dubbo.provider.timeout = 60000
# 启动时检查提供者是否存在
dubbo.consumer.check = false

注:详细配置见 官方配置参考手册


三、接口服务化

3.1 Dubbo 接口编程规约

  • Dubbo 接口类以 Rpc 为前缀命名并剥离出一个单独的模块,称之为远程服务层
  • 请求参数类以 Param 为后缀命名并统一存放于「 param 」目录
  • 返回结果类以 DTO 为后缀命名并统一存放于「 result 」目录

还有一条重要规则下篇「统一接口返回值」再说明

3.2 创建远程服务层

① 首先按照该篇博客 Spring Boot 项目实战(一)Maven 多模块项目搭建 中的「4.2 创建子模块」一节添加「 demo-remote 」子模块。

② 其次在项目父 pom 文件的 dependencyManagement 标签中声明 demo-remote 子模块的依赖。

<dependency>
<groupId>com.example.demo</groupId>
<artifactId>demo-remote</artifactId>
<version>${demo.version}</version>
</dependency>

③ 然后在 demo-biz 层中的 pom 文件中添加 demo-remote 依赖。

<dependencies>
...省略其余部分...
<dependency>
<groupId>com.example.demo</groupId>
<artifactId>demo-remote</artifactId>
</dependency>
</dependencies>

由于 demo-remote 层最终是要打成一个 JAR 包供外部引入,而其接口的内部实现还是需要写在 demo-biz 层,所以我们将这两个模块之间建立了依赖关系,并在 demo-biz 层 com.example.demo.biz.service.impl 包中,新建 remote 目录存放 demo-remote 层远程服务接口的具体实现。

④ 在 DemoWebApplication 入口类中增加 Dubbo 接口实现类包扫描,设置 @DubboComponentScan 注解中的 basePackages 值为 com.example.demo.biz.service.impl.remote

@DubboComponentScan(basePackages = "com.example.demo.biz.service.impl.remote")

3.3 简易 Dubbo 接口测试

配置完模块间的依赖关系后,我们通过一个简易的 Dubbo 接口测试是否可用。

① 首先在 demo-remote 层的 pom 文件中添加必要的 lombok 依赖

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

① 其次在该层创建 com.example.demo.remote 包,添加 param 目录并在其中创建 DemoParam 请求参数类,添加 result 目录并在其中创建 DemoDTO 返回结果类,添加 service 目录并在其中创建 RpcDemoService 接口类。

package com.example.demo.remote.model.param;

import lombok.Data;

import java.io.Serializable;

/**
* @author linjian
* @date 2019/3/15
*/
@Data
public class DemoParam implements Serializable { private Integer id;
}
package com.example.demo.remote.model.result;

import lombok.Data;

import java.io.Serializable;

/**
* @author linjian
* @date 2019/3/15
*/
@Data
public class DemoDTO implements Serializable { private Integer id; private String name;
}
package com.example.demo.remote.service;

import com.example.demo.remote.model.param.DemoParam;
import com.example.demo.remote.model.result.DemoDTO; /**
* @author linjian
* @date 2019/3/15
*/
public interface RpcDemoService { /**
* Dubbo 接口测试
*
* @param param DemoParam
* @return DemoDTO
*/
DemoDTO test(DemoParam param);
}

② 在 demo-biz 层 com.example.demo.biz.service.impl.remote 包中新建 RpcDemoServiceImpl 接口实现类。

package com.example.demo.biz.service.impl.remote;

import com.alibaba.dubbo.config.annotation.Service;
import com.example.demo.biz.service.DemoService;
import com.example.demo.remote.model.param.DemoParam;
import com.example.demo.remote.model.result.DemoDTO;
import com.example.demo.remote.service.RpcDemoService;
import org.springframework.beans.factory.annotation.Autowired; /**
* @author linjian
* @date 2019/3/15
*/
@Service
public class RpcDemoServiceImpl implements RpcDemoService { @Autowired
private DemoService demoService; @Override
public DemoDTO test(DemoParam param) {
DemoDTO demo = new DemoDTO();
demo.setId(1);
demo.setName(demoService.test());
return demo;
}
}

③ 运行 DemoWebApplication 启动类的 main 方法,查看控制台打印日志可以得到如下结果:



从上图可以看出服务已经注册成功

④ 同时通过 Dubbo Admin 管理控制台也可以看到刚注册的服务:

3.4 暴露远程服务

① 在 demo-remote 层的 pom 文件中添加 distributionManagement 标签并在其中配置 Nexus 私服的 snapshot 快照库及 release 发布库。

<distributionManagement>
<repository>
<id>yibao-releases</id>
<url>http://127.0.0.1:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>yibao-snapshots</id>
<url>http://127.0.0.1:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>

② cd 到 demo-remote 目录,执行 mvn deploy 命令打包,完成后可在 Nexus 私服看到刚打的依赖包。



③ 搭建一个测试项目并引入 demo-remote 依赖包,新建 TestController 类测试 Dubbo 接口。

注:该测试项目也需集成 Dubbo

package com.example.dawn.web.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.example.demo.remote.model.param.DemoParam;
import com.example.demo.remote.model.result.DemoDTO;
import com.example.demo.remote.service.RpcDemoService;
import com.yibao.dawn.web.annotation.LoginIgnore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author linjian
* @date 2019/3/7
*/
@RestController
@RequestMapping("test")
public class TestController { @Reference(version = "1.0.0.dev")
private RpcDemoService rpcDemoService; @GetMapping("dubbo")
public DemoDTO test() {
DemoParam param = new DemoParam();
param.setId(1);
return rpcDemoService.test(param);
}
}

③ 启动测试项目,观察 Dubbo Admin 管理控制台消费者一栏,可以看到测试项目已经作为一个消费者调用 RpcDemoService 接口类。



④ 访问 http://localhost:8079/test/dubbo 查看接口返回结果。


四、结语

至此 Spring Boot 集成 Dubbo 的过程介绍完毕,我们通过一个简易的 Dubbo 接口测试其可用性,下篇我们将介绍 HTTP 接口及 Dubbo 接口的一个重要编程规约 — 统一返回值

注:相关代码已同步至 GitHub

Spring Boot 项目实战(五)集成 Dubbo的更多相关文章

  1. Spring Boot 项目实战(六)集成 Apollo

    一.前言 上篇介绍了 Spring Boot 集成 Dubbo,使我们的系统打下了分布式的基础.随着程序功能的日益复杂,程序的配置日益增多:各种功能开关.参数配置.服务器地址等:对程序配置的期望值也越 ...

  2. Spring Boot 项目实战(四)集成 Redis

    一.前言 上篇介绍了接口文档工具 Swagger 及项目监控工具 JavaMelody 的集成过程,使项目更加健壮.在 JAVA Web 项目某些场景中,我们需要用缓存解决如热点数据访问的性能问题,业 ...

  3. Spring Boot 项目实战(三)集成 Swagger 及 JavaMelody

    一.前言 上篇介绍了 Logback 的集成过程,总体已经达到了基本可用的项目结构.本篇主要介绍两个常用工具,接口文档工具 Swagger .项目监控工具 JavaMelody 的集成步骤. 二.Sw ...

  4. Spring Boot 项目实战(二)集成 Logback

    一.前言 上篇介绍了 Spring Boot Maven 多模块项目的搭建方法以及 MyBatis 的集成.通常在调试接口或者排查问题时我们主要借助于日志,一个设计合理的日志文件配置能大大降低我们的排 ...

  5. Spring Boot 项目实战(一)Maven 多模块项目搭建

    一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...

  6. Github 上热门的 Spring Boot 项目实战推荐

    最近经常被读者问到有没有 Spring Boot 实战项目可以学习,于是,我就去 Github 上找了 10 个我觉得还不错的实战项目.对于这些实战项目,有部分是比较适合 Spring Boot 刚入 ...

  7. 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成

    前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...

  8. Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

    在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...

  9. [转帖]spring boot项目集成jacoco

    小试牛刀:spring boot项目集成jacoco 2019-03-28 20:14:36 zyq23333 阅读数 509   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议, ...

随机推荐

  1. iPhone各种机型尺寸、屏幕分辨率

    px与pt区别 字体大小的设置单位,常用的有2种:px.pt.这两个有什么区别呢? 先搞清基本概念: px就是表示pixel,像素,是屏幕上显示数据的最基本的点: pt就是point,是印刷行业常用单 ...

  2. Python【第四篇】函数、内置函数、递归、装饰器、生成器和迭代器

    一.函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 1.定义 def 函数名(参数): ...

  3. 走进Java中的持有对象(容器类)之一 容器分类

    Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类. 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 ...

  4. python+turtle 笔记

    用Python+turtle绘制佩琪: from turtle import * def nose(x,y):#鼻子 penup()#提起笔 goto(x,y)#定位 pendown()#落笔,开始画 ...

  5. echarts 修改y轴name的样式

    option = {    xAxis: {        type: 'category',        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sa ...

  6. python之OpenCv(五)---抓取摄像头视频图像

    OpenCV 可以通过 头videoCapture()方法打开摄像 摄像头变量 = cv2.VideoCapture(n)   n为整数,内置摄像头为0,若有其他摄像头则依次为1,2,3,4,... ...

  7. tty

    tty一词源于Teletypes,或teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘和显示器取代,所以现在叫终端比较合适. 终端 ...

  8. Go-常用库的介绍

    一.Go常用包介绍  fmt.它实现了格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开 发者使用最为频繁的函数.  io.它实现了一系列非平台相关的IO相关接口 ...

  9. 快速定位XPATH

    本文主要介绍如何快速定位WEB端的xpath. 浏览器:Chrome.火狐浏览器 两种浏览器的定位方法都是一样:按F12键,可查看开发者工具 上图,开发者工具最左上角是定位按钮,点击此按钮,再点击浏览 ...

  10. 一个select元素自定义设计的新思路:appearance: none之后利用<>符号制造小箭头

    最近工作时解决了一个前端小问题(如下图所示):在Safari中,select的控件之上有不和谐的灰色部分. 刚开始时我以为是backgrand或是border设置不当之类产生的问题,在搜索了很久之后终 ...