一款分布式服务框架
高性能和透明化的RPC远程服务调用方案
SOA服务治理方案
每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中。
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次数和调用时间的监控中心。
调用流程
0.服务容器负责启动,加载,运行服务提供者。
1.服务提供者在启动时,向注册中心注册自己提供的服务。
2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
Dubbo注册中心
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;
对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。
而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。
Dubbo提供的注册中心有如下几种类型可供选择:
Multicast注册中心
Zookeeper注册中心
Redis注册中心
Simple注册中心
Dubbo优缺点
优点:
透明化的远程方法调用
缺点:
只支持JAVA语言
Dubbo入门Demo
了解了Dubbo以后,自然要搭建一个简单的Demo实现。本文采用Dubbo与Zookeeper、Spring框架的整合。
主要是以下几个步骤:
1、 Zookeeper介绍与安装
本Demo中的Dubbo注册中心采用的是Zookeeper。为什么采用Zookeeper呢?
Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心。
Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求
具体的安装方法在此不一一叙述,可参考博文:zookeeper安装教程
安装完成后,进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个java进程:
(注:需要先启动zookeeper后,后续dubbo demo代码运行才能使用zookeeper注册中心的功能)
2 、创建MAVEN项目
项目结构:
主要分三大模块:
dubbo-api : 存放定义的服务接口;
dubbo-consumer : 服务消费者;
dubbo-provider : 服务提供者(也是服务接口实现者)
公共依赖pom.xml
4.0.0
dubbo
dubbo
1.0.0
pom
this is fist dubbo demo
dubbo-consumer
dubbo-provider
dubbo-api
1.8
1.8
UTF-8
UTF-8
4.2.5.RELEASE
3.2.8
5.1.29
1.7.18
1.2.17
junit
junit
3.8.1
test
jstl
jstl
1.2
javax
javaee-api
7.0
junit
junit
4.11
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
mysql
mysql-connector-java
${mysql-driver.version}
commons-dbcp
commons-dbcp
1.2.2
com.alibaba
fastjson
1.2.22
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.codehaus.jackson
jackson-mapper-asl
1.9.13
;
com.fasterxml.jackson.core
jackson-core
2.8.0
;
com.fasterxml.jackson.core
jackson-databind
2.8.0
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
commons-codec
commons-codec
1.9
org.quartz-scheduler
quartz
2.2.1
org.apache.shiro
shiro-core
1.3.2
org.apache.shiro
shiro-web
1.3.2
org.apache.shiro
shiro-spring
1.3.2
org.apache.shiro
shiro-ehcache
1.3.2
org.apache.zookeeper
zookeeper
3.4.9
com.alibaba
dubbo
2.5.3
org.springframework
spring
com.101tec
zkclient
0.10
dubbo
下面,我为大家具体讲解三个子项目。
1、服务接口dubbo-api
pom.xml
4.0.0
dubbo
dubbo
1.0.0
dubbo
dubbo-api
1.0.0
dubbo-api
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
DemoService.java
package com.dubbo.api.demo;
/**
*
* @ClassName: DemoService
* @Description: 定义服务接口
* @author chenqi
* @date 2018年10月4日
*
*/
public interface DemoService {
String helloDubbo(String str);
}
2、 服务提供者(也是服务接口实现者)dubbo-provider
pom依赖
4.0.0
dubbo
dubbo
1.0.0
dubbo-provider
dubbo-provider
服务提供者
http://maven.apache.org
UTF-8
dubbo
dubbo-api
${project.version}
junit
junit
3.8.1
test
配置文件provider.xml
服务接口实现类(用于提供服务)
实现服务接口,此实现对消费者隐藏
package com.dubbo.provider.demo;
import com.dubbo.api.demo.DemoService;
/**
*
* @ClassName: DemoServiceImpl
* @Description: 服务接口实现类(用于提供服务)
* @author chenqi
* @date 2018年10月4日
*
*/
public class DemoServiceImpl implements DemoService {
/**
* 实现 DemoService 中的 helloDubbo 接口
*/
public String helloDubbo(String str) {
return "hello " + str;
}
}
服务启动类
package com.dubbo.provider.demo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
*
* @ClassName: Provider
* @Description: 服务启动类
* @author chenqi
* @date 2018年10月4日
*
*/
public class ProviderApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
System.out.println(context.getDisplayName() + ": here");
context.start();
System.out.println("服务已经启动...");
System.in.read();
}
}
3、服务消费者dubbo-consumer
pom依赖
4.0.0
dubbo
dubbo
1.0.0
dubbo-consumer
dubbo-consumer
服务消费者
http://maven.apache.org
UTF-8
dubbo
dubbo-api
${project.version}
junit
junit
3.8.1
test
配置文件consumer.xml
通过Spring配置引用远程服务:
测试服务消费者获取服务接口
package com.dubbo.consumer.demo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dubbo.api.demo.DemoService;
/**
*
* @ClassName: ConsumerTest
* @Description: 测试服务消费者获取服务接口
* @author chenqi
* @date 2018年10月7日
*
*/
public class ConsumerTest {
public static void main(String[] args) {
//测试常规服务
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("consumer.xml");
context.start();
System.out.println("consumer start");
DemoService demoService = context.getBean(DemoService.class);
System.out.println("consumer");
System.out.println(demoService.helloDubbo("dubbo"));
}
}
OK,下面我们依次启动服务提供者和服务消费者,注意确保provider已被运行后再启动consumer
启动服务提供者:
启动报了点错误,暂时忽略。
可以看到,消费者成功调用提供者所提供的远程服务。当然,这只是一个模拟的项目,实际中有多提供者多消费者情况,比这要复杂的多,当然只有这样才能体现dubbo的特性。
管理控制台功能
网上自行下载dubbo-admin,下载后是一个war包,直接放到tomcat安装目录的webapps目录下,然后启动tomcat即可
浏览器访问:http://localhost:28080/dubbo-admin/
输入用户名密码 root
查看服务提供者
通过上面的内容,相信大家应该对dubbo有了初步的认知和了解。
ps:如果该文章有帮助到您,就点个赞吧!您的支持与肯定是我持续更新最大的动力。