Dubbo学习记录(二)Dubbo实现SOA服务治理简单实例

前言

 本文主要接着 上篇 接着Dubbo学习记录(一)zookeeper、dubbo-admin管理平台安装部署来基于springboot用dubbo写了一个简单的实例:实现创建一个简单的服务接口,然后在dubbo的服务端实现该接口并向zookeeper服务器进行注册,客户端向zookeeper服务器订阅该接口并使用。同时,也介绍了一下dubbo,总结了一下spring通过xml配置使用dubbo,并收集和提供了一些相关资料方便查阅。

 本文完整源码已上传至github:https://github.com/leon2016/dubbo-parent

Dubbo简介

官网(中文):http://dubbo.apache.org/zh-cn/
git源码:https://github.com/apache/incubator-dubbo.git
官方文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html (必读)
dubbo-admin:https://github.com/apache/incubator-dubbo-admin/tree/master
dubbo-admin打好的war包:https://pan.baidu.com/s/1UuCWpUeTm0riumnKmKE2eg 密码:e5ic

Dubbo是什么

 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

Dubbo能做什么

  • 远程通讯:透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  • 集群容错:软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  • 自动发现:服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

特性

Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java
RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。-- 摘自官网(中文)

在这里插入图片描述

架构

在这里插入图片描述

节点角色说明
  • Provider 暴露服务的服务提供方
  • Consumer 调用远程服务的服务消费方
  • Registry 服务注册与发现的注册中心(zookeeper)
  • Monitor 统计服务的调用次数和调用时间的监控中心
  • Container 服务运行容器
调用关系说明

1.服务容器负责启动,加载,运行服务提供者。
2.服务提供者在启动时,向注册中心注册自己提供的服务。
3.服务消费者在启动时,向注册中心订阅自己所需的服务。
4.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

基本应用

如图,系统A通过系统B查询数据库获得数据:
在这里插入图片描述

更多dubbo自身技术选型及原理可参考官方文档,很详细的。

 


通过注解使用dubbo实例(springboot版)

1.创建Maven项目(分模块)

(1)新建Maven Project : dubbo-parent (作为父级模块)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)新建Maven Module:egg-api (服务端、客户端共享的接口模块)
在这里插入图片描述
在这里插入图片描述
(3)同理,新建Maven Module:egg-provider(服务端)、egg-consumer(客户端)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4)目录结构
 下面是我的项目最终目录结构:
在这里插入图片描述

2.配置依赖(pom.xml)

dubbo-parent/pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.leon</groupId>
	<artifactId>dubbo-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<modules>
		<module>egg-api</module>
		<module>egg-provider</module>
		<module>egg-consumer</module>
	</modules>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<curator-framework.version>4.0.1</curator-framework.version>
		<zookeeper.version>3.4.13</zookeeper.version>
		<dubbo.starter.version>0.2.0</dubbo.starter.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>${dubbo.starter.version}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-framework</artifactId>
			<version>${curator-framework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>${zookeeper.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

egg-api/pom.xml:

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.leon</groupId>
		<artifactId>dubbo-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>egg-api</artifactId>
	<name>egg-api</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<phase>none</phase>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

egg-provider/pom.xml:

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.leon</groupId>
		<artifactId>dubbo-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>egg-provider</artifactId>
	<name>egg-provider</name>
	<url>http://maven.apache.org</url>

	<dependencies>
		<dependency>
			<groupId>com.leon</groupId>
			<artifactId>egg-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

dubbo-consumer/pom.xml:

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.leon</groupId>
		<artifactId>dubbo-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>egg-consumer</artifactId>
	<name>egg-consumer</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>com.leon</groupId>
			<artifactId>egg-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

配置完pom.xml,更新一下maven项目:右键dubbo-parent>maven->update project…
在这里插入图片描述

3.配置dubbo属性(application.properties)

(1)服务提供方(服务端)dubbo配置
 新建/egg-provider/src/main/resources/application.properties:


#服务器端口配置
spring.application.name = dubbo-provider
server.port = 9090

#提供方应用名称,用于计算依赖关系(同样的服务名字相同,不要和别的服务同名,下面这4个个结合@service注解是dubbo核心配置)
dubbo.application.name = dubbo-provider
#指定注册中心的位置,使用zookeeper注册中心暴露服务地址
dubbo.registry.address = zookeeper://localhost:2181
#用dubbo协议在20880端口暴露服务
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880


#统一设置服务提供方的规则
dubbo.provider.timeout = 2000

#服务提供方版本号
demo.service.version = 1.0.0

 
(2)服务消费方(客户端)dubbo配置
 新建/egg-consumer/src/main/resources/application.properties:

#服务器端口配置
spring.application.name = dubbo-consumer
server.port = 9091

#服务消费方方应用名称,用于计算依赖关系(同样的服务名字相同,不要和别的服务同名,下面这4个个结合@service注解是dubbo核心配置)
dubbo.application.name = egg-consumer
#指定注册中心的位置,使用zookeeper注册中心暴露服务地址
dubbo.registry.address = zookeeper://localhost:2181
#用dubbo协议在20880端口暴露服务
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880

#统一设置服务消费方的规则
dubbo.provider.timeout = 2000

#调用的服务提供方的版本号
demo.service.version = 1.0.0

4.定义服务接口

新建/egg-api/src/main/java/com/leon/api/service/IHelloworldService.java:

package com.leon.api.service;

/**
 * API接口
 * 
 * @author leon
 *
 */
public interface IHelloworldService {
	String dubbo();
}

5.服务端实现接口

新建/egg-provider/src/main/java/com/leon/provider/service/impl/HelloworldImpl.java:

package com.leon.provider.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.leon.api.service.IHelloworldService;

/**
 * 服务提供方实现API接口
 * 
 * 注解"@service" 声明需要暴露的服务接口
 * 
 * 
 * @author leon
 *
 */
@Service(version = "${demo.service.version}")
public class HelloworldImpl implements IHelloworldService {

	@Override
	public String dubbo() {

		return "hello world!";

	}

}

为了springboot方式启动服务端,新建一个启动类
/egg-provider/src/main/java/com/leon/provider/EggProviderApplication.java:

package com.leon.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;

/**
 * 服务提供启动类
 * 
 * "@EnableDubbo"开启dubbo支持
 * 
 * @author leon
 *
 */
@EnableDubbo
@SpringBootApplication
public class EggProviderApplication {

	public static void main(String[] args) {
		SpringApplication.run(EggProviderApplication.class, args);
	}
}
6.客户端引用接口

新建/egg-consumer/src/main/java/com/leon/consumer/controller/ConsumerController.java:

package com.leon.consumer.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.dubbo.config.annotation.Reference;
import com.leon.api.service.IHelloworldService;

/**
 * 服务消费方
 * 
 * 注解"@Reference(version = "${demo.service.version}")"引用服务方提供的接口
 * 
 * @author leon
 */
@RestController
public class ConsumerController {
	@Reference(version = "${demo.service.version}")
	private IHelloworldService helloWorld;

	@RequestMapping("/dubbo/helloWorld")
	public String helloWorld() {
		return helloWorld.dubbo();
	}
}

为了springboot方式启动客户端,新建一个启动类
/egg-consumer/src/main/java/com/leon/consumer/EggConsumerApplication.java:

package com.leon.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;

/**
 * 服务消费方启动类
 * 
 * "@EnableDubbo"开启dubbo支持
 * 
 * @author leon
 *
 */
@EnableDubbo
@SpringBootApplication
public class EggConsumerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EggConsumerApplication.class, args);
	}
}

7.启动项目

(1)先启动服务端:右键EggProviderApplication.java执行main函数
在这里插入图片描述
(2)再启动客户端:右键EggConsumerApplication.java执行main函数

(3)访问:http://localhost:9091/dubbo/helloWorld/
打印:hello world !代表egg-consumer成功调用egg-consumer的HelloWorldImpl.dubbo()
在这里插入图片描述
(4)访问dubbo-admin:http://localhost:8080/dubbo-admin-2.6.0/
home页红框 stat显示了当前服务方与消费方状态:
在这里插入图片描述
点击services可以看到所有注册的接口:
在这里插入图片描述
点击接口可以查看详情:
在这里插入图片描述

8.源码

本文完整源码已上传
至github:https://github.com/leon2016/dubbo-parent


参考文献

https://www.cnblogs.com/gengaixue/p/8976891.html


后记

一波走下来,发现dubbo真的很优秀,学习曲线也还比较平滑。
by the way, 要在spring中通过xml配置使用dubbo的话,
可以参考官方文档
http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

https://blog.csdn.net/smilefyx/article/details/71024394

XML方式使用dubbo核心配置如下:

在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章