Dubbo-01服务注册与发现

Dubbo简介

  • Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

Dubbo的架构图

Dubbo架构图

各角色说明

  • Provider

服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

  • Consumer

服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

  • Registry

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

  • Monitor

监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

工作流程

  • 第一步:provider 向注册中心去注册
  • 第二步:consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务
  • 第三步:consumer 调用 provider
  • 第四步:consumer 和 provider 都异步通知监控中心

dubbo 工作原理

  • 第一层:service 层,接口层,给服务提供者和消费者来实现的
  • 第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
  • 第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信
  • 第四层:register 层,服务注册层,负责服务的注册与发现
  • 第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
  • 第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控
  • 第七层:protocal 层,远程调用层,封装 rpc 调用
  • 第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
  • 第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口
  • 第十层:serialize 层,数据序列化层

Dubbo环境搭建

  • 注册中心,本案例使用Zookeeper做注册中心。

Dubbo提供的注册中心有如下几种类型可供选择:
Multicast注册中心
Zookeeper注册中心
Redis注册中心
Simple注册中心

首先安装Zookeeper

1、下载zookeeper
网址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/
2、解压zookeeper
解压运行zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件
3、修改zoo.cfg配置文件,将conf下的zoo_sample.cfg复制一份改名为zoo.cfg即可。
注意几个重要位置:

dataDir=./   -- 临时数据存储的目录(可写相对路径)
clientPort=2181   zookeeper的端口号
修改完成后再次启动zookeeper

创建Maven工程

  • 项目结构:
    dubbo-api : 存放公共接口;
    dubbo-consumer :调用远程服务;
    dubbo-provider : 提供远程服务。
dubbo-api工程详解
  • dubbo-api工程只用来存放接口的,他的实现类放在dubbo-provider中。
  • 新建DemoApiService接口
package com.dubbo.demo;

public interface DemoApiService {
	
	public String getUser(Long userId);
}
dubbo-provider工程详解
  • dubbo-provider用来提供服务的,实现dubbo-api中的接口。
  • 首先在pom文件添加以下依赖
<dependencies>
	<!-- 此处引入接口服务:dubbo-api -->
  	<dependency>
  		<groupId>com.dubbo</groupId>
  		<artifactId>dubbo-api</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  	
  	<dependency>
		<groupId>com.101tec</groupId>
		<artifactId>zkclient</artifactId>
		<version>0.10</version>
	</dependency>
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.2</version>
	</dependency>
	<dependency>
		<groupId>org.jboss.netty</groupId>
		<artifactId>netty</artifactId>
		<version>3.2.5.Final</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.3.9.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>dubbo</artifactId>
		<version>2.5.3</version>
		<exclusions>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.jboss.netty</groupId>
				<artifactId>netty</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
  	
  </dependencies>
  • 新建dubbo-provider.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
	<dubbo:application name="demotest-provider" />
	<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper -->
	<dubbo:registry address="zookeeper://localhost:2181" />
	<!-- 用dubbo协议在20880端口暴露服务 -->
	<dubbo:protocol name="dubbo" port="20880" />
	<!--使用 dubbo 协议实现定义好的 api.PermissionService 接口 -->
	<dubbo:service interface="com.dubbo.demo.DemoApiService"
		ref="demoService" protocol="dubbo" />
	<!--具体实现该接口的 bean -->
	<bean id="demoService" class="com.dubbo.demo.DemoApiServiceImpl" />
</beans>
  • 新建DemoApiServiceImpl
package com.dubbo.demo;

public class DemoApiServiceImpl implements DemoApiService {
	
	@Override
	public String getUser(Long userId) {
		System.out.println("调用服务接口userId:" + userId);		
		return "Hello Dubbo";
	}

}
  • 新建ProviderRun类,用来启动服务
public class ProviderRun {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
		context.start();
		System.out.println("服务已经启动..." + "端口号:" + 20881);
		// 处于启动状态,否则关闭后,Zookeeper节点会失效
		System.in.read();
	}
}
dubbo-consumer工程详解
  • dubbo-provider用来消费服务的。
  • 首先在pom文件添加以下依赖
<!-- 需要注意:我们在这里之引入了api工程,并没有引入实现类provider工程-->
<dependencies>
  	<dependency>
  		<groupId>com.dubbo</groupId>
  		<artifactId>dubbo-api</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  	
  	<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.10</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>org.jboss.netty</groupId>
			<artifactId>netty</artifactId>
			<version>3.2.5.Final</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.5.3</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.jboss.netty</groupId>
					<artifactId>netty</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
  </dependencies>
  • 新建dubbo-consumer.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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="demotest-consumer" />
	<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送 -->
	<dubbo:registry address="zookeeper://localhost:2181" />
	<!--使用 dubbo 协议调用定义好的 api.PermissionService 接口 -->
	<dubbo:reference id="permissionService"
		interface="com.dubbo.demo.DemoApiService" />
</beans>
  • 新建ConsumerTest
public class ConsumerTest {
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
		context.start();
		System.out.println("consumer start");
		DemoApiService demoApiService = context.getBean(DemoApiService.class);
		String result = demoApiService.getUser(1l);
		System.out.println("result:" + result);
	}
	
}

测试

注意需要先启动Zookeeper注册中心

  • 运行ProviderRun类,效果如下图所示:

  • 此时启动ConsumerTest类,效果如下图所示

  • 此时再看ProviderRun控制台:

本次案例只是让大家对Dubbo有个初步认识,下一篇会介绍Dubbo-admin平台,欢迎大家留言讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值