zoukankan      html  css  js  c++  java
  • Dubbo——基于Zookeeper服务框架搭建及案例演示

    一、了解SOA微服务架构

    在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。

    (1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

    此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。

    并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。

    (2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

    这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。

    (3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

    为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。

    其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

    以上是Dubbo最基本的几个需求,更多服务治理问题参见:

    http://code.alibabatech.com/blog/experience_1402/service-governance-process.html

    二、搭建Dubbo服务环境

    1)安装配置启动Zookeeper:

    dubbo框架需要在注册中心上面注册服务之后才可以进行调用,所以必须要先安装注册中心,一般选用zookeeper来做注册中心,首先下载zookeeper的安装包(http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.3.6/),Windows下直接解压,进入conf文件夹,复制zoo_sample.cfg文件为zoo.cfg文件,修改配置如下:

     1 # The number of milliseconds of each tick
     2 tickTime=2000
     3 # The number of ticks that the initial 
     4 # synchronization phase can take
     5 initLimit=10
     6 # The number of ticks that can pass between 
     7 # sending a request and getting an acknowledgement
     8 syncLimit=5
     9 # the directory where the snapshot is stored.
    10 # example sakes.
    11 # zk数据存储位置
    12 dataDir=E:\zookeeper-3.3.6\data
    13 # zk日志存储位置
    14 dataLogDir=E:\zookeeper-3.3.6\log
    15 # the port at which the clients will connect
    16 clientPort=2181
    zoo.xfg

    进入bin目录,运行zkServer.cmd启动Zookeeper服务。

    2)配置启动dubbo-admin:

    配置一个独立的tomcat准备作为dubbo-admin启动的容器,下载dubbo-admin的war包(http://download.csdn.net/detail/liweifengwf/7784901),发布到tomcat中,打开解压包中/WEB-INF/dubbo.properties文件,配置如下:

    1 dubbo.registry.address=zookeeper://127.0.0.1:2181
    2 dubbo.admin.root.password=root
    3 dubbo.admin.guest.password=root
    dubbo.properties

    将解压包下所有文件移入ROOT目录下,启动tomcat可直接访问,无需带上下文uri,至此,dubbo服务所需环境以及dubbo服务治理控制台已搭建完毕

    三、Dubbo服务的开发、发布与调用

    服务提供者

    1)定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)

    新建一个maven工程,并创建一个服务接口(结构及代码如下),mvn clean install运行打包到本地仓库

    1 package com.alibaba.dubbo.demo;
    2  
    3 public interface DemoService {
    4  
    5     String sayHello(String name);
    6  
    7 }
    DemoService.java

    2)在服务提供方实现接口:(对服务消费方隐藏实现)

    接下来创建 dubbo-provider 工程,在pom.xml里面引用刚才的服务接口的jar包,编写服务实现类

     1 package com.alibaba.dubbo.demo.provider;
     2  
     3 import com.alibaba.dubbo.demo.DemoService;
     4  
     5 public class DemoServiceImpl implements DemoService {
     6  
     7     public String sayHello(String name) {
     8         return "Hello " + name;
     9     }
    10  
    11 }
    DemoServiceImpl.java

    用Spring配置声明暴露服务:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
     5     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">
     6  
     7     <!-- 提供方应用信息,用于计算依赖关系 -->
     8     <dubbo:application name="hello-world-app"  />
     9  
    10     <!-- 使用multicast广播注册中心暴露服务地址 -->
    11     <dubbo:registry address="multicast://224.5.6.7:1234" />
    12  
    13     <!-- 用dubbo协议在20880端口暴露服务 -->
    14     <dubbo:protocol name="dubbo" port="20880" />
    15  
    16     <!-- 声明需要暴露的服务接口 -->
    17     <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
    18  
    19     <!-- 和本地bean一样实现服务 -->
    20     <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
    21  
    22 </beans>
    provider.xml

    加载Spring配置,启动提供者服务:

     1 import org.springframework.context.support.ClassPathXmlApplicationContext;
     2  
     3 public class Provider {
     4  
     5     public static void main(String[] args) throws Exception {
     6         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
     7         context.start();
     8  
     9         System.in.read(); // 按任意键退出
    10     }
    11  
    12 }
    Provider.java

    启动完成,可以在dubbo控制台看到已经暴露的提供者服务

    服务消费者

     1)创建一个新maven工程dobbo-consumer,在pom.xml里面引用刚才的服务接口的jar包

     2)通过Spring配置引用远程服务:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
     5     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">
     6  
     7     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
     8     <dubbo:application name="consumer-of-helloworld-app"  />
     9  
    10     <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    11     <dubbo:registry address="multicast://224.5.6.7:1234" />
    12  
    13     <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    14     <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
    15  
    16 </beans>
    consumer.xml

    3)加载Spring配置,并调用远程服务:(也可以使用IoC注入)

    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import com.alibaba.dubbo.demo.DemoService;
     
    public class Consumer {
     
        public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"});
            context.start();
     
            DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
            String hello = demoService.sayHello("world"); // 执行远程方法
     
            System.out.println( hello ); // 显示调用结果
        }
     
    }
    Consumer.java

    至此,服务提供者发布成功,服务消费者调用成功,可以在dubbo-admin控制台看到相关信息

     
     
  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/xmc0551/p/5825261.html
Copyright © 2011-2022 走看看