当前位置: 首页 > news >正文

基于Dubbo+ZooKeeper的分布式服务的实现

Dubbo是什么

  1. 一款分布式服务框架
  2. 高性能和透明化的RPC远程服务调用方案。这里简单介绍一下RPC,所谓RPC就是远程过程调用,全称为Romate Procedure Protocol Call,顾名思义其实就是一种协议。

RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

  1. SOA服务治理方案
    SOA是一种面向服务的框架或者说是架构

Dubbo架构:

图片描述
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次数和调用时间的监控中心。

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

Dubbo注册中心

通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。这就是分布式服务注册中心的由来。

Dubbo提供的注册中心有如下几种类型可供选择

  • Multicast注册中心
  • Zookeeper注册中心
  • Redis注册中心
  • Simple注册中心

接下来我们就是基于Dubbo+Zookeeper+Spring的方式来做一个关于分布式部署的练习,相信通过这个例子大家就可以大致理解Dubbo+Zookeeper的执行流程。

安装Zookeeper

具体安装过程可以进入以下网址,一步一步跟着提示操作就可以完成Zookeeper的安装:
http://blog.csdn.net/tlk20071...
安装完成后,进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个java进程:成功以后会启动一个DOS界面,如下图所示:
图片描述

程序实现阶段

  1. 创建父工程
    创建一个名为DubboDemo的maven工程
  2. 创建服务接口以及服务提供者和服务消费者模块
    在父工程下分别创建三个名为dubbo-api,dubbo-provider,dubbo-consumer的maven module
  3. 编写代码实现功能
    【1】在模块dubbo-api中创建一个名为com.alibaba.dubbo.demo的包,在包下创建一个名为DemoService的接口,该接口下的代码如下:

    package com.alibaba.dubbo.demo;
    import java.util.List;

    public interface DemoService {

       List<String> getPermissions(Long id);

    }

    【2】在模块dubbo-provider中创建一个名为com.alibaba.dubbo.demo.impl的包,在该包下新建一个名为DemoServiceImpl并实现DemoService接口,该类代码如下:
    package com.alibaba.dubbo.demo.impl;
    import com.alibaba.dubbo.demo.DemoService;
    import java.util.ArrayList;
    import java.util.List;
    public class DemoServiceImpl implements DemoService {

       public List<String> getPermissions(Long id) {
           List<String> demo = new ArrayList<String>();
           demo.add(String.format("Permission_%d", id - 1));
           demo.add(String.format("Permission_%d", id));
           demo.add(String.format("Permission_%d", id + 1));
           return demo;
       }

    }

    【3】添加spring配置文件名为provider.xml(位于src目录下),配置文件具体内容如下:

       <?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" owner="programmer" organization="dubbox"/>
       <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
       <dubbo:registry address="zookeeper://localhost:2181"/>
       <!-- 用dubbo协议在20880端口暴露服务 -->
       <dubbo:protocol name="dubbo" port="20880" />
       <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
       <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" />
       <!--具体实现该接口的 bean-->
       <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/>

    </beans>

    【4】编写服务提供方启动类,具体代码如下:

    package com.alibaba.dubbo.demo.impl;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import java.io.IOException;
    public class Provider {

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

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");

               System.out.println(context.getDisplayName() + ": here");
               context.start();
               System.out.println("服务已经启动...");
               System.in.read();
           }
       }
          
    

【5】完成服务消费者所需功能

在demo-consumer模块中创建名为com.alibaba.dubbo.consumer的包并在该包下创建一个名为Consumer,器具体代码如下:
package com.alibaba.dubbo.consumer;
import com.alibaba.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
    public static void main(String[] args) {
        //测试常规服务

ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("consumer.xml");

        context.start();
        System.out.println("consumer start");
        DemoService demoService = context.getBean(DemoService.class);
        System.out.println("consumer");
        System.out.println(demoService.getPermissions(1L));
    }
} 

【6】配置服务消费者的配置文件

  在demo-consumer模块中创建一个名为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" owner="programmer" organization="dubbox"/>
    <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
    <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/>
</beans>



如何启动

【1】首先启动Zookeeper安装目录中bin文件夹下的名为zkServer的Windows脚本文件
【2】启动服务端,即启动服务端启动类的main方法
【3】启动客户端,即启动服务消费者端的main方法

注意事项:

  • 注意各个模块之间的依赖
    dubbo-provider和dubbo-consumer模块都需要依赖dubbo-api模块,还有就是这三个maven module最好都加入对于spring依赖。具体依赖可参考我发布的源码及资料。

项目资料下载链接(注:附Zookeeper的安装文件):
链接:https://pan.baidu.com/s/120eC... 密码:wllg

相关文章:

  • Math 模块部分功能解释
  • postman环境变量的设置
  • 堆栈的简单实现,以及简单操作
  • ASP.NET MVC 过滤器(五)
  • 设置隐式动画播放时间
  • Linux的企业-Hadoop的多节点配置
  • IP地址的正则表达式
  • [CTO札记]盛大文学公司名称对联
  • Linux 各文件夹作用
  • Groundwork:响应式 HTML5,CSS JavaScript 工具包
  • 主机安全检测nessus的安装以及配置
  • Android应用程序组件Content Provider的启动过程源代码分析(7)
  • ipv6
  • Docker--------registry私有仓库搭建 [ Http ]
  • 实战:Windows Server 2008 活动目录 传送和争夺操作主控角色
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript 一些 DOM 的知识点
  • Java面向对象及其三大特征
  • Nodejs和JavaWeb协助开发
  • Promise面试题2实现异步串行执行
  • spring boot下thymeleaf全局静态变量配置
  • SpringCloud集成分布式事务LCN (一)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 电商搜索引擎的架构设计和性能优化
  • 关于Flux,Vuex,Redux的思考
  • 汉诺塔算法
  • 模型微调
  • 那些被忽略的 JavaScript 数组方法细节
  • 盘点那些不知名却常用的 Git 操作
  • 漂亮刷新控件-iOS
  • 使用parted解决大于2T的磁盘分区
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 树莓派 - 使用须知
  • 用Canvas画一棵二叉树
  • 智能网联汽车信息安全
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 国内开源镜像站点
  • 通过调用文摘列表API获取文摘
  • # C++之functional库用法整理
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • $NOIp2018$劝退记
  • (1)STL算法之遍历容器
  • (14)Hive调优——合并小文件
  • (3)STL算法之搜索
  • (6)添加vue-cookie
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)appium-desktop定位元素原理
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net环境下的缓存技术介绍