来自于Spring-Colud与Dubbo的战争之__Dubbo超入门篇

一、Dubbo为什么出生?

在传统应用系统中,主要使用的是三层架构:表示层、业务层、和数据访问层。
传统web应用程序客户端发起请求,由业务层执行逻辑业务,获得数据,然后再结合视图展示个用户,但是,在这种体系架构中有一些问题,所有的代码(表示层、业务层、数据访问层)都在同一个项目中维护,虽然逻辑上我们也是用一些外部扩展服务,但是最终还是部署子同一个应用中。
但系统的架构模式在系统业务庞大的情况下,有很多的不做之处
1.所有的项目都会使用同一个代码库,每一个团队成员都会提交维护代码库的内容,当内容逐渐增多的时候效率就会降低
2.如果采用多模块开发模式,模块之间相互依赖,极小的改动都会引起其他的开发环境同步跟新,如果有以上线的产品,那么发布也会是一个很大的工作量。
3.但系统架构模式,虽然采用了三层架构来区分不同层的责任与任务,但是从实际的操作中来看,难免存在责任交叉,因此某些地方改动可能会带来其他层的同步变动,失去了分层独立性。
4.很多团队分为开发团队和运营支持团队,开发团队只负责开发,在完成后交与运营团队管理,虽然运营团队能很好的处理一些日常问题,但是遇到系统为佳问题时,也不得不求助于开发团队。
5.当业务逐渐增长,但系统可能直接别拆分为多个独立的子系统,但系统间存在一些业务关联的,这时解决基础服务公用的问题就势在必行,需要开发者将通用服务独立发布以便于其他系统调用
为了解决以上出现的问题,为服务的概念就被提了出来
为服务的理念就是,将产品或者项目分解为多个独立的服务,
这些服务独立的部署,并且不依赖其他服务。
微服务没有集中的数据库,每个模块都具有自己独立的存储系统,可能时MySQL、也可能时Redis,技术选型可以根据模块的特点来进行选择。

微服务的优势

1.单系统只用一种开发语言,但微服务每个服务都是独立的,每个服务都也可以看成一个项目,因此每个服务可以选择最适合服特色的技术开发
2.开发集中在一个服务,业务和代码量都不大,开发人员可能很好的把握代码。
3.服务间进行掉用时,开一通过API来进行通讯,如REST,也可以使用分布式管理框架Dubbo、SpringCloud等

微服务的缺点

应为每个功能都是独立的服务,因此在一个较大的项目中,检测管理这些服务就变得复杂,如果某个服务出现故障,那么调试跟踪比但系统更加的复杂,应为日志分布在不同的系统中,所以调式起来需要花费跟多的时间与精力。建立统一的日志管理可以解决。

二、Dubbo

Dubbo是一个分布式服务治理框架,致力于高性能和透明化的RPC原创服务调用方案,可以和Spring框架进行无缝集成,是阿里巴巴SOA服务化治理方案的核心框架。
dubbo采用的是一种非常简单的模型,要么是提供服务方,要么是消费服务方,所以基于这一点可以抽象出服务方(Provider)和消费服务方(Consumer)两个角色。

Dubbo核心架构

Dubbo框架设计一共划分了10个层:
服务接口层(Service)、配置层(Config)、服务代理层(Proxy)、服务注册层(Registry)、集群层(Cluster)、监控层(Monitor)、远程调用层(Protocol)、信息交换层(Exchange)、网络传输层(Transport)和数据序列化层(Serialize)。

Dubbo核心要点

1.服务定义
服务是围绕服务提供方和服务消费方的,服务提供方实现服务,而服务消费方调用服务。
2. 服务注册
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择:
Multicast(多播/组播)注册中心(开发测试用)、Zookeeper注册中心(生产环境用官方推荐)、Redis注册中心、Simple注册中心
3. 服务监控
无论是服务提供方,还是服务消费方,他们都需要对服务调用的实际状态进行有效的监控,从而改进服务质量。
4. 远程通信与信息交换
远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个:
Mina、Netty、Grizzly
5. 服务调用

节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
(1) 服务容器负责启动,加载,运行服务提供者。
(2)服务提供者在启动时,向注册中心注册自己提供的服务。
(3)服务消费者在启动时,向注册中心订阅自己所需的服务。
(4) 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
(5)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
(6)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo使用Maven获取
<project>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
    </dependencies>
</project>
4.Dubbo本地服务化实现

对于传统工程而言,分层的依据是按照包来区分,由于在相同的工程中,所以服务的提供和调用可以方便地实现,但是对于分布式服务架构而言,服务的提供者负责服务的具体实现和接口规范,服务的消费者只关心接口规范即可,但无论是服务提供者还是消费者都会涉及到诸如公共工具类、接口、DO、VO等公共代码,因此,一个最简单的DUBBO服务架构模式如下:
在这里插入图片描述
服务提供者: 提供服务接口的实现,发布服务地址,提供服务。
服务消费者:获取服务地址,使用服务接口调用服务,处理服务调用结果。
公共项目:包含公共配置、DO、VO、工具包等、

服务提供者实现

项目搭建(Maven项目管理方式):

  1. 创建公共项目工程:普通的Maven工程,提供utils、DO、接口的代码。
    pom.xml 无任何依赖
  2. 创建服务提供者项目:普通的Maven工程(依赖Dubbo),提供服务实现、服务启动功能。
    pom.xml
<dependencies>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.2</version>
		</dependency>
		<dependency>
			<groupId>dubbo-api</groupId>
			<artifactId>dubbo-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
         <dependency>
   			 <groupId>com.github.sgroschupf</groupId>
   			 <artifactId>zkclient</artifactId>
   			 <version>0.1</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.3.16.RELEASE</version>
		</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-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	<dubbo:application name="dubbo-test-provider" owner="sampson"></dubbo:application>
	<dubbo:protocol name="dubbo" port="20880" ></dubbo:protocol>
	<!-- 局域网广播注册中心 -->
	<dubbo:registry address="multicast://239.5.6.7:1234" />
	<!-- 配置式发布 -->
	<bean id="userService" class="cn.itsource.dubbo.provider.service.UserServiceImpl"></bean>
	<dubbo:service interface="cn.itsource.dubbo.core.service.IUserService" ref="userService"></dubbo:service>
<!-- 注解式发布 -->
	<!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
	<dubbo:annotation package="cn.itsource.dubbo.provider.service" />
</beans>

启动服务监听

String configLocation = "classpath*:/dubbo-provider.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
System.out.println("dubbo-server服务正在监听,按任意键退出");
System.in.read();
服务消费者实现

创建服务消费者项目:普通的Maven工程(依赖Dubbo),完成服务调用功能。
pom.xml

<dependencies>
	<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.2</version>
		</dependency>
	<dependency>
			<groupId>dubbo-api</groupId>
			<artifactId>dubbo-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
   <dependency>
    	<groupId>com.github.sgroschupf</groupId>
   		 <artifactId>zkclient</artifactId>
    	<version>0.1</version>
	</dependency>
</dependencies>

dubbo-consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	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-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd 
	http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context.xsd">
	<dubbo:application name="dubbo-test-consumer"></dubbo:application>
	<!-- 局域网广播注册中心 -->
	<dubbo:registry address="multicast://239.5.6.7:1234" />	
	<!-- 配置式调用服务 -->
	<!-- <dubbo:reference id="helloService" interface="cn.itsource.dubbo.core.service.IHelloService"></dubbo:reference> -->
	<!-- 注解式调用服务 -->
	<!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
	<dubbo:annotation package="cn.itsource.dubbo.consumer" />
</beans>

JUnit4调用dubbo服务测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:/dubbo-consumer.xml"})
public class DubboServiceTest {
	@Reference
	private IHelloService helloService;
	
	@Test
	public void testHello(){
		String sayHi = helloService.sayHi("老宋");
		System.out.println(sayHi);
	}
}
Dubbo服务打包

1.使用Servlet容器(不用)
利用Tomcat、Jetty等WEB容器启动Dubbo服务。
缺点:增加管理配置的复杂性,不必要地使用http端口,浪费内存资源
2.Java的Main方法(不建议,本地调试可以用)
基于Spring框架,写一个Java类并提供Main方法启动。
缺点:无法使用Dubbo的一些高级特性,服务的管理需要自己额外提供实现
3.Dubbo框架Main方法
Dubbo框架本身提供了服务运行支持方法,基于com.alibaba.dubbo.container.Main
简单高效地运行服务
很好地支持Dubbo服务的发布、关停(ShutdownHook)

三、Dubbo服务jar包运行

定位到jar包所在位置
然后用cmd执行 这一段代码 java -jar xxxx.jar
在这里插入图片描述
在这里插入图片描述
然后再浏览器输入 localhost:7001打开管理器 用户名密码默认都是:root
在这里插入图片描述

Zookeeper注册中心

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集, 提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口。其中分布锁和队列有Java和C两个版本。
Zookeeper作为Dubbo服务的注册中心,Dubbo原先基于数据库的注册中心,没采用Zookeeper,Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心,Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求。我们先在windows上安装Zookeeper,我们安装最简单的单点,集群环境需要有兴趣的同学主动查找资料并利用虚拟机搭建。

使用步骤:

1.官方下载地址:http://mirrors.cnnic.cn/apache/zookeeper/
2.把conf目录下的zoo_sample.cfg改名成zoo.cfg,这里我是先备份了zoo_sample.cfg再改的名。修改zoo.cfg的值如下:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:/zookeeper-3.4.9/data/data
dataLogDir=D:/zookeeper-3.4.9/data/log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

3.配置Zookeeper环境变量
我们再配置一下这个环境变量就可以运行zookeeper了。(本文基于Windows已经配置过JAVA_HOME并且配置正确)
新增环境变量:ZOOKEEPER_HOME 值:D:/zookeeper-3.4.9(根据你的主目录设置)
新增Path: ;%ZOOKEEPER_HOME%/bin; %ZOOKEEPER_HOME%/conf
4.点击bin目录下的zkServer.cmd 这时候出现下面的提示就说明配置成功了。

四、P2P项目的分布式服务调用实现

1 .pom.xml项目引用jar包
2.实现大概思路
在这里插入图片描述
在项目引入p2p-api
在这里插入图片描述
然后在p2p-api中暴露接口给其他人调用
在这里插入图片描述
在这里插入图片描述
然后在项目中实现
在这里插入图片描述
在这里插入图片描述

注意:因为Dubbo涉及远程调用传输对象,所有需要传输的对象的类都必须实现Serializable接口,如Domain层的所有类。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值