RPC实践(四)Dubbo实践

2023-11-17

Dubbo是一款重要的RPC框架,它是Alibaba开源的分布式服务框架主要特点:提供了注册中心来进行服务的管理,支持zookeeper、redis等方式来实现注册中心;Dubbo按照分层的方式来架构,使用这种方式可以使各个层之间解耦合或者最大限度地松耦合采用的是服务提供者Provider和消费者Consumer这样模型。

一、Dubbo简单介绍

Dubbo是什么?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
Dubbo有何特点?
远程通讯:基于长连接的NIO框架抽象封装
集群容错:提供多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,支持平滑减少或增加机器

二、Dubbo架构

Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Container: 服务运行容器。(e.g.)Spring
Monitor: 统计服务的调用次调和 调用时间的监控中心 

三、Dubbo实现原理

四、Dubbo实践目标

1、搭建基于zookeeper的Dubbo环境( 管理中心,客户端,服务端)

2、实践客户端和服务端的开发过程

3、客户端和服务端的调用

4、总结应用场景

五、Dubbo实践操作

1、环境搭建

1) 首先准备zookeeper(本实践采用伪分布式部署,在centos65的虚拟机192.168.136.144上,部署3个zookeeper,客户端端口分别为 2181,2182,2183),启动zookeeper后,可以看到上述端口都处于监听状态

2)下载Dubbo的管理web war包,我下载的版本是dubbo-admin-2.5.3.war,大家也可以下载源码自己打包编译。需要war包的可以从下面网址下载

        3) 准备一个tomcat环境,本次实践使用的是tomcat 6,java版本为1.7 ,注意不要用1.8,用java 1.8 会报异常,解决比较麻烦

        4) 将war包上传到tomcat的webapps目录下,先启动一下tomcat,让tomcat解压war包。   

我们需要修改一下解压后的dubbo-admin-2.5.3/WEB-INF 目录下的配置文件dubbo.properties, 修改的目的是配置正确的注册中心zookeeper的地址

修改完成并保存。有两种方式访问部署的dubbo,一种是通过url:  http://192.168.136.144:8080/dubbo-admin-2.5.3 方式来访问,一种是通过 http://192.168.136.144:8080/  方式来访问, 如果采用第一种,直接启动就可以,如果采用第二种(本次实践也是采用这种),需要进行如下操作: 在webapps目录下执行

mv  dubbo-admin-2.5.3 ROOT, rm  dubbo-admin-2.5.3.war这么做的是将 dubbo解压后的目录设定为ROOT目录,这样tomcat启动就用确省地址访问dubbo工程,删除war包,是不让tomcat后续自动解压war包,否则启动了两个dubbo会有干涉。

5)上述操作有,启动tomcat,这样就可以通过缺省url访问dubbo,打开http://192.168.136.144:8080/后,输入账号和密码: root、root,如果正常会出现如下目录




了,环境搭建告一段落,下面将进行客户端和服务端例子开发。由于服务端和客户端都用到接口api,所以整个项目工程有三个部分,分别是

      1)工程-接口jar包

      2)工程-服务端

      3)工程-客户端

下面就三个工程来描述如何创建和使用

2、工程-接口jar包的创建

接口比较简单,就是一个interface,里面有2个方法。

首先我们在myeclipse里面,new-》other-》maven

输入要创建的工程后,点击finish。工程创建后,很不幸碰到了2个问题,如果没有碰到同样的问题,可以跳过阅读

1) 创建类或者接口时,提示java not visible in src folder in Package Explorer

解决的办法是:项目上右键-》属性,然后在下面界面上选择,可以选java,或者Dynamic Web Module(web工程要选此项)

        

2)问题2: 执行maven  install时报告: 

maven build异常 -Dmaven.multiModuleProjectDirectory system property is not set

解决: windwos-》profrencens-》java

点击edit 后,在Default VM Arguments 这个项目,填入-Dmaven.multiModuleProjectDirectory=$M2_HOME

 好了,现在创建interface  后,可以执行maven build了。  在项目上,右键-》runas-》 maven clean,执行完后,再执行 run as -》maven install


可以在控制台提示的安装目录,发现安装到本地库的接口jar包。

觉得版本号太长挺烦的,因为在后面还需要引用这个接口包,可以修改一下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.0</modelVersion>
  <groupId>com.study</groupId>
  <artifactId>StudyDubboApi</artifactId>
  <version>0.1</version>
  <build/>
</project>
重新update 工程,并执行maven install 后,可以在本地库看到生成打包后的api  jar包



3、工程-服务端开发

建立一个maven工程取名为 StudyDubboServer,在这个工程里面,需要引入刚才生成的接口jar包,引入dubbo。

服务端开发的步骤:

1) 创建maven工程,修改pom.xml,引入相关的接口和依赖包

2)生成一个接口实现类,一个服务端应用程序类

3)编写applicationProvider.xml ,配置各种服务和暴露的接口

下面就这些步骤做具体的说明

3.1  创建maven工程,修改pom.xml

创建maven工程比较简单,主要是几个id的输入,创建好的工程如下所示:

pom.xml的内容如下所示,添加了dubbo,接口api,zookeeper,sping的依赖

<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.study</groupId>
  <artifactId>StudyDubboServer</artifactId>
  <version>0.1</version>
  <build/>
  <dependencies> 
  
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.5.3</version>
    </dependency>
    <dependency>
       <groupId>com.study</groupId>
       <artifactId>StudyDubboApi</artifactId>
       <version>0.1</version>
    </dependency>  
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring</artifactId>
       <version>2.5.6.SEC03</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.6</version>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.4</version>
    </dependency>
           
  </dependencies>
  
</project>

其中StudyDubboApi是服务端和客户端都需要用到的接口api jar包。 pom文件编写完成后,在项目工程上右键-》Maven4MyEclipse-》update projects  这样可以通过maven自动的下载依赖包到工程的maven lib。

3.2  下面要编写2个类,一个是接口的实现类,一个是服务端主程序

接口的实现类代码如下:HelloServiceApiImpl.java

package com.study.dubbo.demo;

import   com.study.dubbo.demo.HelloServiceApi;

public class HelloServiceApiImpl implements  HelloServiceApi {
	
	String myName="";
	
	public  String  sayHello(String name){
		
		myName = name;
		
		String ret="Hello, "+name+"!";
		
		System.out.println(  ret );
		
		return  ret;
		
		
	}
	
	public  String  getName ( ){

		
		System.out.println( "Now name is:"+ myName+";" );
		
		return  myName;
		
	}

}


要让服务程序跑起来,还需要一个服务端的应用程序主类:ProviderMain.java

package com.study.app;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ProviderMain {

	public static void main(String[] args) throws Exception {

		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationProvider.xml" });
		context.start();
		System.out.println("按任意键退出");
		System.in.read();
	}

}

3)编写applicationProvider.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="Provider_DubboHelloService" />
      
   <!-- 使用zookeeper注册中心暴露服务地址 -->  
   <dubbo:registry address="zookeeper://192.168.136.144:2181" ></dubbo:registry>

   <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol> 
       
   <!-- 要暴露的服务API接口 -->  
   <dubbo:service interface="com.study.dubbo.demo.HelloServiceApi" ref="HelloService" />  
   
   <!-- 接口的实现,注意beanid 需要和服务接口的ref 一致 --> 
   <bean id="HelloService" class="com.study.dubbo.demo.HelloServiceApiImpl" />

</beans>

   好了,服务端这样就可以跑起来了,右键,run as-》java application运行


4  工程-客户端开发

客户端的开发步骤更加简单一些,步骤如下:

1) 创建一个maven工程,在pom文件中引入接口api和其他相关的包

2)编写客户端程序

3)编写客户端spring文件


4.1 创建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.0</modelVersion>
  <groupId>com.study</groupId>
  <artifactId>StudyDubboCli</artifactId>
  <version>0.1</version>
  <build/>  
  <dependencies>   
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.5.3</version>
    </dependency>
    <dependency>
       <groupId>com.study</groupId>
       <artifactId>StudyDubboApi</artifactId>
       <version>0.1</version>
    </dependency>  
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring</artifactId>
       <version>2.5.6.SEC03</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.6</version>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.4</version>
    </dependency>  
  </dependencies>
</project>

4.2 客户端程序

客户端程序也分2个部分,一个是对于接口的调用类,一个是客户端程序的main入口

客户端的调用类如下:HelloServiceComsumer.java

package com.study.dubbo.demo;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.study.dubbo.demo.HelloServiceApi;

public class HelloServiceComsumer {
	
	HelloServiceApi demoService;
	
	/*
	 * 获取服务的Provider对象
	 */
	public void getServiceObj(){
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationConsumer.xml" });
		context.start();

		demoService = (HelloServiceApi) context
				.getBean("HelloService");
		
	}

	/*
	 * 调用对象的sayHello 方法
	 */
	public void sayHello( String name) {

		System.out.println(demoService.sayHello( name ));

	}
	
	/*
	 * 调用对象的getName 方法
	 */
	public String getName(){
		
		String ret=demoService.getName( );
		System.out.println("Now Provider Name is:"+ ret);		
		return ret;
		
	}
	
}

客户端的主程序入口:ConsumerMain.java

package com.study.app;

import com.study.dubbo.demo.HelloServiceComsumer;

public class ConsumerMain {

	public static void main(String[] args) throws Exception{
		
		HelloServiceComsumer consumerService = new HelloServiceComsumer();
		
		consumerService.getServiceObj();
		
		String myFamily[]={ "Mom","Daddy","Honey","Pretty Girl"};
		
		for(int i=0;i<myFamily.length;i++){
			consumerService.sayHello(myFamily[i]  );
			consumerService.getName();
			
		}
		
		System.out.println("按任意键退出");
		System.in.read();

	}

}

4.3  spring 配置如下:applicationConsumer.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 ">
    
    <!-- consumer application name -->
    <dubbo:application name="Consumer_DubboHelloService" />
    
    <!-- registry address, used for consumer to discover services -->
    <dubbo:registry address="zookeeper://192.168.136.144:2181" ></dubbo:registry>
    <dubbo:consumer timeout="5000" />
    
    <!-- 引用服务接口 -->  
    <dubbo:reference id="HelloService" interface="com.study.dubbo.demo.HelloServiceApi"/>


</beans>

注意一下上面dubbo的配置,以及引用的服务配置,与provider的配置进行对照。

5、dubbo服务调用效果

dubbo应用,首先开启zookeeper服务,接着开启dubbo admin 应用,可以在web上看到 dubbo服务的相关情况。然后开启dubbo 服务端程序(Provider),最后运行dubbo 客户端(Consumer),客户端运行结果如下:


因为dubbo admin 有前台界面可以对服务和消费者进行监控,我们可以看一下 web界面的呈现内容:







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RPC实践(四)Dubbo实践 的相关文章

随机推荐

  • android Jar文件的数字签名

    转自 http hubingforever blog 163 com blog static 17104057920118104058241 JAR文件可以用 jarsigner工具或者直接通过 java securityAPI 签名 签名
  • 利用ChatGPT提高代码质量的5种方法

    本文首发于公众号 更AI power ai 欢迎关注 编程 AI干货及时送 5个可以提升你日常工作效率的ChatGPT特性 如何利用它提高代码质量 ChatGPT已经彻底改变了开发代码的方式 然而 大多数软件开发人员和数据专业人员仍然没有使
  • 坐标移动Python

    A 向左移动 D 向右移动 W 向上移动 S 向下移动 从 0 0 点开始移动 输入 合法坐标为A 或者D或者W或者S 数字 两位以内 非法坐标点需要进行丢弃 如AA10 A1A YAD 等 flag input split for ite
  • python如何快速采集美~女视频?无反爬

    人生苦短 我用python 这次康康能给大家整点好看的不 环境使用 Python 3 8 Pycharm mou歌浏览器 mou歌驱动 gt 驱动版本要和浏览器版本最相近 lt 大版本一样 小版本最相近 gt 模块使用 requests g
  • ARM Mbed网络监控温度

    硬件 软件 介绍 温度测量是最基本 最常执行的测量之一 它可以是房间的温度 人的温度或设备的温度 能够通过Internet远程监视温度具有许多潜在的重要应用 例如 许多老人独自生活 如果他们生病了 可能要过一段时间才能发现他们处于危机中 如
  • 蜡笔小新学java

    javase基础 javase基础持续更新中 标识符 基本数据类型 随机数 算数运算符 Scanner扫描枪 赋值运算符 扩展赋值运算符 关系运算符 逻辑运算符 三元运算符 流程控制语句 if语法 switch语句 流程控制语句之循环结构
  • 基于 PyTorch实现YOLOv5

    目录 The First Article 前言 实现环境 基本流程 数据准备 建立模型 训练模型 模型评估 图片预测 视频预测 The First Article 前言 本文记录基于PyTorch实现Github作者ultralytics的
  • Audience Insights被下架后,Facebook广告定位的最佳替代方案

    从 2021 年 7 月 1 日起 Audience Insights 将不再可用 相反 我们建议人们使用 Facebook Business Suite Insights 该工具可让你访问 Facebook 和 Instagram 上的受
  • zookeeper看这一篇就够了

    第一章 zookeeper简介 第1节 zookeeper的由来 1 2 3 4 1 zookeeper最早起源于雅虎研究院的一个研究小组 2 在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调 并且这个系统还有单点问题 3
  • opencv中match与KnnMatch返回值解释

    match与KnnMatch返回值解释 之前一直不明白match与knnmatch的返回值到底是什么 查阅了一些资料才理解 其实二者都是返回的DMatch类型的数据结构 先说一下 match bf cv BFMatcher create m
  • OpenCv.js(图像处理)学习历程

    opencv js官网 4 5 0文档 以下内容整理于opencv js官网 简介 OpenCV由Gary Bradski于1999年在英特尔创建 第一次发行是在2000年 OpenCV支持c Python Java等多种编程语言 支持Wi
  • linux虚拟机18.04无法使用电脑自带摄像头

    TOC教你怎么正确开启摄像头 首先查看你的window下摄像头是否正常使用 简单操作 可以点击 开始 搜索相机运行 如果运行成功就说明在window下可以正常使用 虚拟机如何调用摄像头 我是linux18 04 可以简单测试一下电脑自带摄像
  • CUDA编程基础

    文章目录 Cuda编程结构 编程语句 获取GPU数量 获取设备属性 设置设备参数 Parameters Parameters 释放与GPU相关的所有资源 主机与设备都可用的内存函数 时间函数 CUDA核函数 函数类型限定符 CUDA核函数的
  • 二、获取数据库连接

    一 Driver 接口 java sql Driver 接口是所有 JDBC 驱动程序需要实现的接口 这个接口是提 供给数据库厂商使用的 不同数据库厂商提供不同的实现 在程序中不需要直接去访问实现了 Driver 接口的类 而是由驱动程序管
  • Prime Cuts【预处理】【素数筛法】

    有些东西只有你WA的多了 才有发言权 题记 题面 A prime number is a counting number 1 2 3 that is evenly divisible only by 1 and itself In this
  • SpringBoot中如何在一个模块中引入另一个模块

    SpringBoot中如何在一个模块中引入另一个模块 实例 1 springBoot中有cms dev项目 下面有ai模块和dms模块 而且ai模块中没有启动类 需要将ai引入到dms模块中 解决方案 1 在需要调用的模块的pom文件中添加
  • 关于ElasticSearch的_type类型

    type是es早期版本的设计缺陷 在5 x以前的版本里边 一个index下面是支持多个type的 在6 x的版本里改为一个index只支持一个type type可以自定义 7 x的版本所有的type默认为 doc 自定义type也能用 但是
  • 华兴数控g71外圆循环编程_数控车床G71,G70编程实例(一)

    正明天车也要编 先编好 大多数产品都可以用G71开粗 G70精车 新程序开头一般要取消很多暗中存在的指令 我们家机床就是 据说有一次某新同事没在程序前加G97 导致开机转速过高 产品就飞了出来 把门都砸坏了 人没事 大吉大利 别说后面一句
  • 景联文科技牵头制定的《信息技术 可扩展的生物特征识别数据交换格式 第4部分:指纹图像数据》国家标准启动会暨研讨会在杭州顺利召开

    2023年9月19日 由杭州景联文科技有限公司牵头制定的 信息技术 可扩展的生物特征识别数据交换格式 第4部分 指纹图像数据 国家标准启动会暨起草组工作会议在杭州顺利召开 来自中国电子技术标准化研究院 熵基科技 名光微电子科技 广州麦仑信息
  • RPC实践(四)Dubbo实践

    Dubbo是一款重要的RPC框架 它是Alibaba开源的分布式服务框架 它主要特点 提供了注册中心来进行服务的管理 支持zookeeper redis等方式来实现注册中心 Dubbo按照分层的方式来架构 使用这种方式可以使各个层之间解耦合