热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

架构设计:系统间通信(15)——服务治理与Dubbo上篇

http:blog.csdn.netyinwenjiearticledetails50113139版权声明:欢迎转载,但是看在我辛勤劳动的份上,请注明来源:http:blog.csdn

http://blog.csdn.net/yinwenjie/article/details/50113139

目录(?)[+]

1、上篇中“自定义服务治理框架”的问题

在之前的文章中(《架构设计:系统间通信(13)——RPC实例Apache Thrift 下篇(1)》、《架构设计:系统间通信(14)——RPC实例Apache Thrift 下篇(2)》),我们基于服务治理的基本原理,自己实现了一个基于zookeeper + thrift的服务治理框架。但实际上前文中我们自行设计的服务治理框架除了演示基本原理外,并没有多大的实际使用价值,因为还有很多硬性需求是没有实现的:

  • 访问权限:在整个系统生态环境中,不是任何用户都可以随意访问任何的接口。那么除了访问接口的用户组、用户和密码管理以外(或者是公私钥文件),还需要限制用户的访问权限。例如规定用户组A下所有的用户才能够访问接口X。

  • 版本控制:就像上篇文中描述的问题一样。在比较大的系统中,某一个子系统一般都是使用集群环境运行(有多个工作节点),且必须24小时连续工作不允许中断。那么要进行服务接口升级,一般是先升级一部分服务节点,其间让另一部分服务节点继续提供服务,造成了在一个时间段同一个子系统提供的某一个服务可能出现服务接口版本的不兼容。为了子系统能够保证24小时连续提供服务,就需要标注服务接口的版本号,让之前没有完成升级的服务节点提供/访问老版本的服务接口;已经完成升级的服务节点提供/访问新版本的服务接口。

  • 服务时效控制、次数控制:各个子系统提供的服务本身也是具有时效性的。比如某一个服务Y只在每天早上10:00——11:00才能提供访问服务,且对于某个用户来说每天只能调用100次。再比如说, 
    · `

  • 性能措施:性能是评价一款服务治理框架是否优秀的重要标准。在服务治理框架的各层都应该有足够的性能优化措施。例如在服务注册层/服务仓库层,注册通知是如何实现的、“能够提供的”服务列表是否进行本地缓存、缓存何时更新、访问令牌如何实现、如何确定访问节点等等问题都直接影响性能;在RPC层/服务实现层,如何支持非阻塞异步网络IO、是采用现成的网络通信框架(Netty、MINA、Grizzly等等)还是自行编写网络通信框架、如何进行信息的序列化等等问题也会直接影响性能。

  • 其他细节问题:能够应用到生产环境的服务治理框架还需要关注很多细节问题,例如多个子系统所注册服务可能出现的服务名称重复的问题,类似的这种问题如何解决、服务治理框架本身的稳定性如何进行保证、是否需要支持跨语言通信的问题等等。

从这篇文章开始,我们详细介绍一款能够应用到生产环境的服务治理框架:由阿里巴巴开发团开源贡献的DUBBO服务治理框架。希望能够帮助各位读者优化自己的生产环境架构方案。

2、服务治理框架:DUBBO

DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

——摘自DUBBO官网(http://dubbo.io/)

在DUBBO的官网有详细的学习资料和实例代码。这里我们介绍DUBBO服务治理框架,是为了将我们这个系列文章的中心思想:系统间通信原理,讲清楚。那么为了讲清楚DUBBO服务治理框架的工作原理,首先我们就要演示一下它的基本使用方法。

3、基本使用

3-1、准备示例工程

您可以在以下站点下载后文中提到的各种组件:

  • DUBBO官网和用户手册:

    http://dubbo.io/ 
    http://dubbo.io/User+Guide-zh.htm

  • DUBBO服务治理框架V2.4.10版本:

    http://repo1.maven.org/maven2/com/alibaba/dubbo/2.4.10/

  • zookeeper官网:

    http://zookeeper.apache.org/

  • Maven官网:

    http://maven.apache.org/

  • Maven官方仓库:

    http://mvnrepository.com/

3-1-1、示例工程基本环境

  • 请在工程中引入maven的支持。并且导入相关的依赖(如果您不知道maven为何物,请按这样的简单步骤做:下载一个纯净的eclipse->在市场搜索maven->安装maven插件->打开设置界面指定maven路径->创建maven工程->打开工程下的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/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0modelVersion>

<groupId>yinwenjie.testgroupId>
<artifactId>dubboServiceartifactId>
<version>0.0.1version>
<packaging>jarpackaging>

<name>dubboServicename>
<url>http://maven.apache.orgurl>

<properties>
<version.log4j>1.2.14version.log4j>
<version.slf4j.api>1.7.5version.slf4j.api>
<version.slf4j.log4j12>1.7.5version.slf4j.log4j12>
<version.slf4j.jcl.over.slf4j>1.7.5version.slf4j.jcl.over.slf4j>

<jackson.version>1.9.13jackson.version>
properties>

<dependencies>

<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
<version>2.5version>
dependency>


<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>${version.slf4j.api}version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>jcl-over-slf4jartifactId>
<version>${version.slf4j.jcl.over.slf4j}version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>${version.slf4j.log4j12}version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>${version.log4j}version>
dependency>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjrtartifactId>
<version>1.7.4version>
dependency>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
<version>1.7.4version>
dependency>


<dependency>
<groupId>com.alibabagroupId>
<artifactId>dubboartifactId>
<version>2.4.10version>
dependency>


<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>3.3.4version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.3version>
dependency>
dependencies>
project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

您已经注意到了我们使用的DUBBO的版本为2.4.10,并且准备使用zookeeper作为DUBBO服务管理仓库;zookeeper连接的版本使用3.3.4,还引入了一个0.3版本的zkclient组件。Log4j的支持是我自己的编码习惯,如果您不是用Log4j同样可以运行工程,但是您可以使用System.out的方式输出日志了。

3-1-2、安装并使用zookeeper

如果要使用zookeeper作为DUBBO服务管理仓库,那么您还应该安装zookeeper服务器(单点服务即可)。这篇文章主要讲解的是DUBBO的基本使用,如果您还不了解zookeeper服务的基本知识,可以参考我另外几篇文章《hadoop系列:zookeeper(1)——zookeeper单点和集群安装》、《hadoop系列:zookeeper(2)——zookeeper核心原理(选举)》、《hadoop系列:zookeeper(3)——zookeeper核心原理(事件)》。这里假定您用于测试的zookeeper服务器已经安装成功,并且能够正常使用。

这里要说明一下:在网上能够找到的很多文章中,都是介绍的DUBBO和zookeeper构建工作环境。这让很多读者误以为DUBBO只能和zookeeper联合工作,但实际情况并不是这样的。在DUBBO服务治理框架中,服务管理仓库的主要作用是记录服务状态,通知服务变化,管理服务信息,除了zookeeper以外实际上DUBBO服务治理框架还支持在Redis上实现注册管理仓库。另外还有一个Simple的用于在本地实现一个注册管理仓库,专门用于测试用。

3-3、定义和启动DUBBO-RPC服务器端

由于DUBBO和Spring是无缝集成的,所以当您通过maven引入DUBBO组件时,Spring的基础组件就会被自动引入。DUBBO V2.4.10 版本使用的是Spring 2.5.6的版本。

下面我们首先对DUBBO服务提供端的Spring进行配置:


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"
>



<context:component-scan base-package="yinwenjie.test.dubboService.*" />


<dubbo:application name="ws-demo" />


<dubbo:registry address="zookeeper://192.168.61.128:2181" />


<dubbo:protocol name="dubbo" port="20880" />


<dubbo:service interface="yinwenjie.test.dubboService.iface.MyService" ref="MyServiceImpl"/>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

下面是RPC服务接口和服务接口实现的代码:

package yinwenjie.test.dubboService.iface;

/**
* 这是服务接口
* @author yinwenjie
*/

public interface MyService {
/**
* 这是一个测试接口
* @param field1 参数1
* @param field2 参数2
* @return 相加后返回
*/

public String doMyTest(String field1 , String field2);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

服务接口的实现:

package yinwenjie.test.dubboService.impl;

import org.springframework.stereotype.Component;

import yinwenjie.test.dubboService.iface.MyService;

@Component("MyServiceImpl")
public class MyServiceImpl implements MyService {

/* (non-Javadoc)
* @see yinwenjie.test.dubboService.iface.MyService#doMyTest(java.lang.String, java.lang.String)
*/

@Override
public String doMyTest(String field1, String field2) {

return field1 + field2;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

服务接口和服务接口的实现都是非常简单的JAVA代码了,应该不需要进行什么特别的说明了。只需要补充两个注意事项:

  • 可以看出服务接口和服务接口的实现本身并没有引入和RPC结束任何相关的类,也就是说服务接口和服务接口的实现甚至自己都不知道将被某个RPC框架所调用

  • dubbo:protocol标签中,我们指定的协议名称为dubbo(小写)。这里的bubbo是指的DUBBO服务治理框架中自带的一种RPC协议。就像前文说到的那样,从官网给出的资料来看,DUBBO服务治理框架还支持rmi、hessian、http、webService、Hessian等多种通信协议。

下面我们启动DUBBO-RPC服务器端:

package yinwenjie.test.dubboService;

import org.apache.log4j.BasicConfigurator;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ServiceMainProcessor {
//Log4j的日志基本配置(要使用这种方式首先引入log4j的支持)
static {
BasicConfigurator.configure();
}

private static Object WAITOBJECT = new Object();

public static void main(String[] args) throws Exception {
new ClassPathXmlApplicationContext(new String[]{"application-service.xml"});

/*
* 这里锁定这个应用程序,和DUBBO框架本身的工作原理没有任何关系,只是为了让其不退出
* 当然您也可以使用ClassPathXmlApplicationContext中的start方法,效果一样。
*
* 个人习惯
* */

synchronized (ServiceMainProcessor.WAITOBJECT) {
ServiceMainProcessor.WAITOBJECT.wait();
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3-4、定义和启动DUBBO-RPC客户端

以下是RPC服务消费方(RPC客户端)的xml配置。在我们的测试工程中,客户端和服务端是放在一个工程里面的。放在一个工程里面是为了节约演示程序在工程设置方面不必要的工作量,但是这不影响它们在两个独立的JVM上面运行,也不影响DUBBO服务治理框架工作原理的演示。下面的XML是DUBBO服务治理框架RPC客户端的spring配置演示:



<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="ws-demo-client" />


<dubbo:registry address="zookeeper://192.168.61.128:2181" />


<dubbo:reference id="myService" interface="yinwenjie.test.dubboService.iface.MyService"/>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

对于DUBBO-RPC框架来说,它其中的服务消费者并不需要进行多余的任何定义。只需要知道要访问的服务接口(和定义的服务版本,如果没有定义服务版本默认为0.0.0)。下面的代码将启动DUBBO-RPC客户端,并且完成RPC调用:

package yinwenjie.test.dubboClient;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import yinwenjie.test.dubboService.iface.MyService;

public class ClientMainProcessor {
//Log4j的日志基本配置(要使用这种方式首先引入log4j的支持)
static {
BasicConfigurator.configure();
}

/**
* 日志
*/

private static final Log LOGGER = LogFactory.getLog(ClientMainProcessor.class);

/**
* 锁定用
*/

private static Object WAITOBJECT = new Object();

public static void main(String[] args) throws Exception {
ApplicationContext app = new ClassPathXmlApplicationContext(new String[]{"application-client.xml"});

// 开始RPC调用
MyService myService = (MyService)app.getBean("myService");
LOGGER.info("myService = " + myService.doMyTest("1234", "abcde"));

// 这里锁定这个应用程序,和DUBBO框架本身的工作原理没有任何关系,只是为了让其不退出
synchronized (ClientMainProcessor.WAITOBJECT) {
ClientMainProcessor.WAITOBJECT.wait();
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

3-5、运行效果

我们先来看看DUBBO服务治理框架中服务提供端的运行效果:

这里写图片描述

一定要注意运行效果是加上了Log4j的效果的,如果您没有加载Log4j的依赖,那么应该用System.out进行控制台输出。另外,zookeeper服务器一定要安装好,并且可以正常使用。

以下是DUBBO服务治理框架服务消费者(客户端)的运行效果:

这里写图片描述

上图红圈处Log4j所打印出来的调用内容,说明DUBBO服务治理框架已经完成了服务实现的调用。

在这个章节中,我们使用的DUBBO的配置文件都是最简化的配置信息。实际上包括service、reference、protocol、registry、application、monitor、module、provider、consumer等在内的DUBBO服务治理框架标签提供了丰富的配置属性。您可以参考官网http://dubbo.io/Configuration+Reference-zh.htm中的详细说明,在下篇文章我们对DUBBO运行原理的讲解中,还会提及其中常用的、比较重要的标签作用。

4、后文介绍

通过这篇文章的讲解,相信读者已经掌握了DUBBO服务治理框架的基本使用方式。下一篇文章开始,我们将介绍DUBBO服务治理框架的运行原理,从它的运行原理中重点窥探我们这个系列讨论中讨论的核心话题:网络IO模型、通信协议、消息封装格式以及这些元素对服务性能的影响。



推荐阅读
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • PCIe中的弹性缓冲原理解析
    PCIe是一种高速串行总线,其传输信号为差分信号,并采用同步传输方式。然而,PCIe并没有专用的同步时钟。本文将详细介绍PCIe中的弹性缓冲(Elastic Buffer)原理,探讨其如何处理时钟差异,确保数据传输的稳定性和可靠性。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文探讨了如何利用RxJS库在AngularJS应用中实现对用户单击和拖动操作的精确区分,特别是在调整区域大小的场景下。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 2017年软件开发领域的七大变革
    随着技术的不断进步,2017年对软件开发人员而言将充满挑战与机遇。本文探讨了开发人员需要适应的七个关键变化,包括人工智能、聊天机器人、容器技术、应用程序版本控制、云测试环境、大众开发者崛起以及系统管理的云迁移。 ... [详细]
  • 本文探讨了在SQL Server 2008环境下,当尝试删除拥有数据库架构的用户时遇到的问题及解决方案,包括如何查询和更改架构所有权。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
author-avatar
都市翡翠阿萨姆红茶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有