Dubbo项目入门
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
它的特性如下
- 面向接口代理的高性能RPC调用
- 智能负载均衡
- 服务自动注册与发现
- 高度可扩展能力
- 运行期流量调度
- 可视化的服务治理与运维
Talk is cheap, Show me the code。现在来着手搭建一个Dubbo项目吧。
搭建一个xml配置的Dubbo项目
创建三个项目
service-api 服务提供者和服务消费者共用的接口
service-consumer 服务消费者
service-provider 服务提供者
共用的接口
先在service-api定义一个公用接口
public interface DemoService {
String sayHello(String name);
}
服务提供者
服务提供者service-provider提供一个DemoService的实现类
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
System.out.println("[" + LocalDate.now() + "] Hello " + name );
return "Hello " + name;
}
}
编写xml配置文件
配置应用名称
<dubbo:application name="demo-provider"/>
配置注册中心
可以使用Multicast、Redis、Zookeeper、Simple这四个作为注册中心。
<dubbo:registry address="multicast://224.5.6.7:1234"/>
配置协议
默认为dubbo
<dubbo:protocol name="dubbo" port="20880"/>
定义bean
然后定义bean,以及将bean作为服务暴露出去
<bean id="demoService" class="com.learnDubbo.demo.provider.DemoServiceImpl"/>
<dubbo:service interface="com.learnDubbo.demo.DemoService" ref="demoService"/>
main函数
编写一个main函数用于启动服务提供者
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
context.start();
System.in.read();//用于阻塞函数,使其一直运行
}
服务消费者
服务消费者需要调用service-provider 服务提供者提供的DemoService实现类
同样需要编写xml文件,配置文件和服务提供者的类似,不同的是需要将暴露服务的配置修改为引用服务的配置,如下
引用服务
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
main函数
编写一个main函数用于启动服务消费者,然后一直循环调用服务提供者提供的服务
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // 调用服务提供者提供的服务
while (true) {
try {
Thread.sleep(1000);
String hello = demoService.sayHello("Dubbo"); // call remote method
System.out.println(hello); // get result
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
测试
先启动service-provider项目,然后在启动service-consumer,输出结果如下
搭建一个注解的Dubbo项目
服务提供者和服务消费者共用的接口还是使用service-api,新建下面两个项目
service-consumer-annotation 基于注解的服务消费者
service-provider-annotation 基于注解的服务提供者
基于注解的服务提供者
新建一个springboot项目
同样需要提供一个DemoService的实现类,且在类上增加@Service
注解
注:是com.alibaba.dubbo.config.annotation.Service
不是org.springframework.stereotype.Service
别导错了
接下来需要增加dubbo的配置类
@Configuration
public class DubboConfiguration {
/**
* 对应xml配置:<dubbo:application name="demo-provider"/>
* @return
*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("demo-provider--annotation");
return applicationConfig;
}
/**
* 对应xml配置:<dubbo:registry address="multicast://224.5.6.7:1234"/>
* @return
*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("multicast://224.5.6.7:1234");
return registryConfig;
}
}
最后一步在启动类上增加注解@DubboComponentScan(basePackages = "com.learnDubbo.demo.provider.service")
basePackages自行修改为提供服务类所在的包路径
基于注解的服务消费者
也是需要有一个配置类,和服务提供者类似,这里就不贴代码了
接下来创建一个Controller,用于测试结果,代码如下
@RestController
public class DemoController {
@Reference
private DemoService demoService;
@GetMapping("sayHello")
public String sayHello(){
return demoService.sayHello("Dubbo");
}
}
@Reference
注解表示引用服务类似于xml配置
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
在项目启动类上同样需要注解@DubboComponentScan
指定dubbo扫描路径
测试
同xml配置的一样,需要先启动服务提供者
配置信息
配置信息主要包括3大块,注册中心、协议和schema配置
注册中心
注册中心总共有4个,如下
注册中心 | 简要说明 | dubbo文档介绍 |
---|---|---|
Multicast | 不需要启动任何中心节点,只要广播地址一样,就可以互相发现。 | 链接 |
zookeeper | Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。 | 链接 |
Redis | 一个高效的 KV 存储服务器 , 从 2.1.0 版本开始支持 。 |
链接 |
Simple | 一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。 | 链接 |
使用Redis注册中心
当使用Redis注册中心,需先把服务提供方和消费放的注册中心xml配置修改为下方
<dubbo:registry address="redis://localhost:6379"/>
对应的redis会产生如下数据
可以看到有两个key,分别对应服务提供者和消费者。两个key对应的数据类型为Hash,可以看到服务消费者key的数据如下
1) "consumer://192.168.79.170/com.learnDubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.6.2&interface=com.learnDubbo.demo.DemoService&methods=sayHello&pid=14208&side=consumer×tamp=1534389723130"
2) "1534389813690"
第一个为URL址,第二个为过期时间。
官网给的图如下
使用Zookeeper注册中心
当使用Zookeeper注册中心,需先把服务提供方和消费放的注册中心xml配置修改为下方
<dubbo:registry address="zookeeper://localhost:2181"/>
对应的Zookeeper会产生如下数据
下图是官网给出的数据图
有些出入,但大致还是相同的,多了configurators和routers。
当服务提供者启动时: 会创建对应的目录结构,例如我上面代码中的共用接口名为com.learnDubbo.demo.DemoService
,就会创建 /dubbo/com.learnDubbo.demo.DemoService
目录,然后在创建providers
目录,再在providers
目录下写入自己的 URL 地址。
当服务消费者启动时:会在/dubbo/com.learnDubbo.demo.DemoService
目录创建 consumers
目录,并在consumers
目录写入自己的 URL 地址。
当监控中心启动时: 订阅 /dubbo/com.learnDubbo.demo.DemoService
目录下的所有提供者和消费者 URL 地址。
协议
协议 | 简要说明 | dubbo文档介绍 |
---|---|---|
dubbo | Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 | 链接 |
rmi | RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。 |
链接 |
hessian | Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。 | 链接 |
http | 基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现。 | 链接 |
webservice | 基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现 。 | 链接 |
thrift | 当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。 | 链接 |
memcached | 基于 memcached实现的 RPC 协议。 | 链接 |
redis | 基于 Redis 实现的 RPC 协议。 | 链接 |
rest | 基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持 | 链接 |
schema配置的涉及的东西有点多这里就不列出来了
参考资料:Dubbo官网
官网的介绍都很详细了,从官网中一般都能获取到你想到的信息。
有需要查看这篇博文的源码的可以点这里:Github地址
Dubbo项目入门的更多相关文章
- 基于springboot构建dubbo的入门demo
之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...
- Dubbo从入门到实战:入门篇
很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮 ...
- Dubbo从入门到实战视频教程
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.这里整理了一套关于dubbo的视频教程分享给大家,包 ...
- 【dubbo】dubbo项目基本结构及provider构建
dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ...
- 在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程
http://jijiaa12345.iteye.com/blog/1739754 在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程 本文是一篇在Myeclipse下构建Jav ...
- Intellij Idea 创建Web项目入门(一)转
Intellij Idea 创建Web项目入门(一) 相关软件: Intellij Idea14:http://pan.baidu.com/s/1nu16VyD JDK7:http://pan.bai ...
- 第一章 第一个dubbo项目
为了安全:服务启动的ip全部使用10.10.10.10 版本: dubbo:2.5.5 重要的网址: dubbo的github:https://github.com/alibaba/dubbo dub ...
- Dubbo项目一段时间后提供者消失
Dubbo项目用了一段时间后发现接口不通了,错误500 打开监控中心发现提供者不见了 查看下日志文件发现报如下错 2018-08-06 15:10:18,008 [localhost-startSto ...
- 使用tomcat启动dubbo项目
首先,黑体标出 官方不推荐使用web容器进行dubbo的启动 但是,有些时候,我们不采用他们的建议. 背景: 之前用的dubbo项目,是由main函数启动的,每次发布项目,需要启动两项: 1. tom ...
随机推荐
- [BZOJ5249][多省联测2018]IIIDX
bzoj luogu sol 首先可以把依赖关系转成一个森林.自下而上维护出每个点的\(size\),表示这关解锁以后一共有多少关. 考虑没有重复数字的情况. 直接从小往大贪心把每个数赋给当前已解锁的 ...
- LeetCode Design Compressed String Iterator
原题链接在这里:https://leetcode.com/problems/design-compressed-string-iterator/description/ 题目: Design and ...
- ASP.NET MVC 缓存Outputcache (局部动态)
首先说一下需求: 比如我需要对网站首页做缓存,于是在首页对于的Action上贴上了Outputcache,接着问题就来了,首页上的有部分数据是不能做缓存的,比如个人信息,不然,每个人登陆都是看到第一个 ...
- Python函数-callable()
callable(object) 作用: 检查对象object是否可调用.如果返回True,object仍然可能调用失败:但如果返回False,调用对象ojbect绝对不会成功. 注意: 类是可调用的 ...
- ubuntu 迁移部分 / 目录下的存储空间到 /home目录
状况:当时给系统分区的时候,home和根目录都是25GB左右,突然发现home 目录不够用了,于是决定进行将根目录的部分空间挪移到home下去 主要方法:使用Gparted的LIve USB的方法. ...
- centos下wget: command not found的解决方法
今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装,这里是C ...
- CentOS 7 安装Percona,Xtrabackup
CentOS 7 安装Percona 5.7,Xtrabackup 简介 Percona Server为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升.该版本提升 ...
- fastjson --JSONObject 和JSONArray 转换
fastjson解析:resultValue=[ { "total": 1, "saleLists": [ ...
- GPIO编程2:使用GPIO监听中断完整程序
一个完整的使用GPIO捕捉中断的程序: #include<stdlib.h> #include<stdio.h> #include<string.h> #inclu ...
- SQL字符串拼接
不同的数据库,相应的字符串拼接方式不同,通过对比加深一下记忆. 一.MySQL字符串拼接 1.CONCAT函数 语法格式:CONCAT(char c1, char c2, ..., char cn) ...