Dubbo一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案。
Consumer : 是一个抽象概念,是Dubbo抽象出来的消费者角色;
Provider : 是一个提供服务的生产者角色;
Registry : 表示Dubbo的注册中心,实际上Dubbo并没有这样的注册中心,只是抽象出了这个概念;
Monitor : 监控类型的一个角色;
首先 Provider 把一个服务注册到注册中心上,然后Consumer 获取到这些服务,来调用Provider 或者当Provider 提供的服务有变化时,也会相应的通知Consumer ,Provider 和 Consumer 发生调用是都会通知Monitor ;
生产者 是Dubbo抽象出来的一个角色,又叫服务提供者 主要是暴露服务的提供方,在生产者中通常是提供一个既有的接口然后将其发布到服务的注册中心上,发布完后等待其他的消费者消费它,启动生产者的时候,通常伴随着启动容器,如一些IO容器,http、Netty等容器启动好容器后,会有监听者监听请求,而Dubbo是一个多线程的处理机制,他的主函数会一直等待,直到java进程shut down的时候,他会同时停止相应的容器,伴随启动容器会有个特征,就是通常我们启动了Dubbo应用,就会占用一个端口,作为生产者来说,只要是服务提供方,所以他会将服务注册到注册中心上,一般注册上zookeeper或者其他上,消费者就会发现这些服务
生产者配置
消费者 (consumer)
消费者 也是Dubbo抽象出来的一个角色,主要是作为dubbo接口的消费的一方,dubbo要消费服务,必须要启动远程调用,同时还要做服务发现和接口代理,他需要zookeeper和其它的方式来发现以及提供的接口,同时还要根据配置的接口生成的对象,这样是使用接口的时候会更加方便,对dubbo来说他还提供了负责均衡和服务容错策略,所以在消费者这一层,负载均衡和服务容错的是比较重要。
定义接口
定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)
DemoService.java
package com.jxl.cloub.dubbo;
public interface DemoService {
String sayHello(String name);
}
服务提供方实现接口(对服务消费方隐藏实现):
DemoServiceImpl.java
package com.jxl.cloub.kafka.dubbo.prvoider;
import com.jxl.cloub.dubbo.DemoService;
public class DemoServiceImpl implements DemoService{
public String sayHello(String name) {
return "hello"+name;
}
}
用Spring配置声明暴露服务:
spring-dubbo-provider.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider" />
<dubbo:registry id="zk1" address="centos-node6:2181" protocol="zookeeper" />
<dubbo:protocol id="mydubbo" name="dubbo" port="20880" />
<dubbo:provider registry="zk1" protocol="mydubbo" />
<dubbo:service interface="com.jxl.cloub.dubbo.DemoService" ref="demoService" />
<bean id="demoService" class="com.jxl.cloub.kafka.dubbo.prvoider.DemoServiceImpl" />
beans>
加载Spring配置:
Provider.java
package com.jxl.cloub.kafka.dubbo.prvoider;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider{
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"META-INF.spring/spring-dubbo-provider.xml"});
context.start();
System.in.read();
}
}
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
命令进入zookeeper集群客户端查看 声明需要暴露的服务接口com.jxl.cloub.dubbo.DemoService,是否有注册到zk中;命令进入到zookeeper/bin/目录下,执行一下命令:
# ./zkCli.sh
执行一下命令:
ls /
执行一下命令:
ls /dubbo/com.jxl.cloub.dubbo.DemoService/providers
暴露的服务接口com.jxl.cloub.dubbo.DemoService 已经注册成功
通过Spring配置引用远程服务:
spring-dubbo-consumer.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer" />
<dubbo:registry id="zk1" address="centos-node6:2181" protocol="zookeeper" />
<dubbo:consumer registry="zk1" />
<dubbo:reference id="demoService" interface="com.jxl.cloub.dubbo.DemoService" />
beans>
加载Spring配置,并调用远程服务:(也可以使用IoC注入)
Consumer.java
package com.jxl.cloub.kafka.dubbo.consumer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.jxl.cloub.dubbo.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"META-INF.spring/spring-dubbo-consumer.xml"});
context.start();
DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
String st = demoService.sayHello(" world"); // 执行远程方法
System.out.println( st ); // 显示调用结果
}
}
我们看到 控制台 打印出了 hello world ,说明 Provider 发布远程服务到注册中心
Consumer 自动发现远程服务并完成服务调用;
这里最好用Maven项目,方便包的依赖 以及Dubbo包的依赖,项目pom.xml配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.jxl.cloubgroupId>
<artifactId>jxl_kafkademoartifactId>
<packaging>warpackaging>
<version>0.0.1-SNAPSHOTversion>
<name>jxl Maven Webappname>
<url>http://maven.apache.orgurl>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>3.8.1version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.apache.kafkagroupId>
<artifactId>kafka_2.10artifactId>
<version>0.8.2.0version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>dubboartifactId>
<version>2.4.10version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.4version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>3.2.8.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>3.2.8.RELEASEversion>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>3.2.8.RELEASEversion>
dependency>
<dependency>
<groupId>com.jxl.cloubgroupId>
<artifactId>demo_dubboartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
dependencies>
<build>
<finalName>jxl_kafkademofinalName>
build>
project>