文章目录
项目中用到了 dubbo 服务,于是业余时间了解下 dubbo,以及实现一个基于 springboot 的 demo
前言
dubbo 是一款由阿里巴巴开源,现已进入 Apache 开源孵化器的一个 RPC(Remote Procedure Call)框架。
它能做什么?
- 提供高性能、透明化的远程服务调用方案,服务调用者使用服务可以像调用本地方法那样调用远端的服务。
特点:
- 高性能:服务的远程调用以接口为粒度,调用者只需关注接口的功能,屏蔽底层的接口实现
- 轻量级:采用 Spring 配置方式,没有任何 API 的侵入,所有功能通过注解或者配置文件即可实现
架构: 包括 5 个部分
暴露服务的服务提供方(Provider),调用远程服务的服务消费方(Consumer),服务注册与发现的注册中心(Registry),统计服务的调用次数和调用时间的监控中心(Monitor), 服务运行容器(Container)。
- Container 启动运行 Provider
- Provider 向 Registry 注册自己提供的服务,Consumer 向 Registry 订阅自己所需要的服务
- Registry 向 Consumer 返回 Provider 的地址列表,Consumer 从地址列表中选择一个 Provider 进行调用
- Monitor 统计 Provider,Consumer 的调用次数和调用时间
代码实现
- dubbo-demo 工程定义了三个模块,其中服务提供者 provider 和服务消费者 consumer 模块均引用 api 模块
- api :定义服务的接口
- provider:服务提供者,实现 api 模块定义的服务接口
- consumer:服务消费者,调用 api 定义的接口,具体功能由 Provider 实现
基本 jar 包依赖,上面三个模块共同拥有下面依赖:
<dependencies>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--zookeeper依赖 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
服务接口定义 api,定义接口 getTime
import java.util.Date;
public interface HelloService {
Date getTime();
}
服务提供者 Provider,定义接口的实现。其中 Service 注解是 com.alibaba.dubbo.config.annotation.Service
import com.alibaba.dubbo.config.annotation.Service;
import com.cn.HelloService;
import org.springframework.stereotype.Component;
import java.util.Date;
@Service // 注意引用的包 import com.alibaba.dubbo.config.annotation.Service;
@Component
public class HelloServiceImpl implements HelloService {
public Date getTime() {
return new Date();
}
}
application.yml
server:
port: 8101
spring:
dubbo:
application:
id: dubbo-provider #注册在注册中心的名称,唯一标识,请勿重复
name: dubbo-provider
registry:
address: zookeeper://127.0.0.1:2181
protocol: #暴露服务方式
id: dubbo
name: dubbo
port: 20885 #暴露服务端口 (默认是20880,修改端口,不同的服务提供者端口不能重复)
status : server
#scan: com.cn.provider.service #调用dubbo组建扫描的项目路径
服务消费者 Consumer ,调用 Provider 中提供的服务
import com.alibaba.dubbo.config.annotation.Reference;
import com.cn.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.text.SimpleDateFormat;
import java.util.Date;
@Controller
public class HelloController {
@Reference // 引用服务
private HelloService helloService;
@RequestMapping("/get")
@ResponseBody
public String getName(){
Date date = helloService.getTime();
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
}
Consumer 配置文件 application.yml
#spring.application.name=dubbo-consumer
server:
port: 8102
servlet:
context-path: /dubbo
#应用名称
spring:
dubbo:
application:
name: dubbo-consumer
#注册中心地址
protocol:
name: dubbo
registry:
address: zookeeper://127.0.0.1:2181 # 注册中心地址
#调用dubbo组建扫描的项目路径
# scan: com.cn.consumer.controller
运行: 先启动 Zookeeper,然后启动 Provider,最后启动 Consumer,地址栏输入 http://localhost:8102/dubbo/get 即可返回当前时间。
至此一个简单的基于 Springboot 的 dubbo 服务框架配置完成。有了这个基本的框架之后,一些常见的非核心业务如短信服务,发票服务等就可以抽取出来,作为独立的微服务提供远程调用。
dubbo 服务监控
dubbo 服务建立起来之后,有相应的可视化服务监控平台,包括以前用的版本 2.6.0 之后不再启用的 dubbo-admin 和现在官方文档推荐的 dubbo-ops
dubbo-admin 启用,部署方式 参考
总结
这里只是对 dubbo 基本的配置做一个总结,具体细节配置,还需要参照具体文档进行,先用起来,再研究是什么情况。