zoukankan      html  css  js  c++  java
  • 阿里巴巴分布式服务框架dubbo学习笔记

    Dubbo是什么?

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架
    其核心部分包含:

    1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
    2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
    3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
    Dubbo能做什么?
    1. 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

    2. 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。

    3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

    Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

    Dubbo架构图如下

    • Provider: 暴露服务的服务提供方。

    • Consumer: 调用远程服务的服务消费方。

    • Registry: 服务注册与发现的注册中心。

    • Monitor: 统计服务的调用次调和调用时间的监控中心。

    • Container: 服务运行容器。

    调用关系说明:
    1. 服务容器负责启动,加载,运行服务提供者。

    2. 服务提供者在启动时,向注册中心注册自己提供的服务。

    3. 服务消费者在启动时,向注册中心订阅自己所需的服务。

    4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

    5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

    6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。


    首先运行zookeeper,IP地址为172.24.51.28,端口为2181.

    服务提供者Provider目录结构如下:

    public class User implements Serializable {
    	private static final long serialVersionUID = 1L;
    	private int id;
    	private String username;
    	private String password;
    	//...
    }
    
    //API接口
    public interface UserService {
    	public User getUser();
    }
    
    //API接口实现类
    public class UserServiceImpl implements UserService {
    
    	@Override
    	public User getUser() {
    		System.out.println("UserServiceImpl.getUser() invoked...");
    		User user = new User();
    		user.setId(10);
    		user.setUsername("admin");
    		user.setPassword("123456");
    		System.out.println("Return:" + user);
    		return user;
    	}
    }
    
    public class Provider {
    	private static final Log logger = LogFactory.getLog(Provider.class);
    	
    	public static void main(String[] args) {
    		try {
    			ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:provider.xml");
    			context.start();
    		} catch (Exception e) {
    			logger.error("== Provider context start error:",e);
    		}
    		synchronized (Provider.class) {
    			while (true) {
    				try {
    					Provider.class.wait();
    				} catch (InterruptedException e) {
    					logger.error("== synchronized error:",e);
    				}
    			}
    		}
    	}
    /*
    * Dubbo服务的运行方式
    1.使用Servlet容易运行(Tomcat Jetty等)  不可取
    缺点:增加复杂性(端口、管理) 浪费资源(内存)
    2.自建Main方法类来运行(Spring容器)    不建议(本地调试可用)
    缺点:Dubbo本身提供的高级特性没用上,自己编写的启动类可能有缺陷
    3.使用Dubbo框架提供的Main方法类来运行(Spring容器)  建议使用
    优点:框架本身提供(com.alibaba.dubbo.container.Main)
    可实现优雅关机(ShutdownHook)
    注意点:spring-context.xml  <import resource="classpath:spring/spring-xxx.xml"/>
    */
    }
    

    配置文件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.xsd  
                http://code.alibabatech.com/schema/dubbo  
                http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
    	<!-- 提供方应用信息,用于计算依赖关系 -->
    	<dubbo:application name="demo-provider" />
    
    	<!-- 使用zookeeper注册中心暴露服务地址 -->
    	<dubbo:registry protocol="zookeeper" address="172.24.51.28:2181" />
    
    	<!-- 用dubbo协议在20880端口暴露服务 -->
    	<dubbo:protocol name="dubbo" port="20880" />
    		
    	<!-- 用户服务接口 -->
    	<dubbo:service interface="com.demo.service.UserService" ref="userService" />
    	
    	<bean id="userService" class="com.demo.service.impl.UserServiceImpl"/>
    
    </beans> 
    

    运行Provider即可在zookeeper注册中心注册服务,在dubbo-admin中可以查看服务。

    服务者详情如下:


    服务消费者Consumer目录结构如下:

    //User UserService均从jar包中引入
    public class Consumer {
    	public static void main(String[] args) throws InterruptedException {
    		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:consumer.xml");
    		UserService userService = (UserService)applicationContext.getBean("userService");
    		User user = userService.getUser();
    		System.out.println(user);
    		Thread.sleep(100000);
    	}
    }
    

    配置文件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="demo-consumer"/>
        <!--zookeeper注册中心 -->
        <dubbo:registry  protocol="zookeeper" address="172.24.51.28:2181" />
        <!--使用multicast广播注册中心暴露的服务地址 -->
        <!--<dubbo:registryaddress="multicast://10.57.41.19:1234" /> -->
        <!-- 生成远程服务代理,可以和本地bean一样使用demoService-->
        <dubbo:reference id="userService" interface="com.demo.service.UserService" />
    </beans>
    

    Consumer中设置了100s的休眠,运行Consumer即可在zookeeper注册中心获取注册的服务,在dubbo-admin中可以查看消费者情况。

    消费者详情如下:

    当运行新的Provider实例时,会在dubbo-admin中看到新添加的服务者。运行新的Consumer实例时也可以在dubbo-admin中看到新的消费者。


    附GIT地址:
    1. Demo-provider Git地址
    2. Demo-consumer Git地址

    附dubbo-admin安装方式

    安装Dubbo管理控制台

    Dubbo管控台可以对注册到zookeeper注册中心的服务或服务消费者进行管理,但管控台是否正常对Dubbo服务没有影响,管控台也不需要高可用,因此可以单节点部署。

    IP: 172.24.51.28
    部署容器:apache-tomcat-7.0.57
    端口:8080

    1. 下载最新版的Tomcat7:
    $wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz
    
    1. 解压:
    $ tar -zxvf apache-tomcat-7.0.57.tar.gz
    $ mv apache-tomcat-7.0.57 dubbo-admin-tomcat
    
    1. 移除/home/umgsai/dubbo-admin-tomcat/webapps目录下的所有文件:
    $ rm -rf *
    
    1. 上传Dubbo管理控制台程序dubbo-admin-2.5.3.war
      到/home/wusc/dubbo-admin-tomcat/webapps

    2. 解压并把目录命名为ROOT:
      $ unzip dubbo-admin-2.5.3.war -d ROOT
      把dubbo-admin-2.5.3.war移到/home/wusc/tools目录备份
      $ mv dubbo-admin-2.5.3.war /home/umgsai/tools

    3. 配置dubbo.properties:

    $ vi ROOT/WEB-INF/dubbo.properties
    
    dubbo.registry.address=zookeeper://172.24.51.28:2181
    dubbo.admin.root.password=root
    dubbo.admin.guest.password=guest
    

    (以上密码在正式上生产前要修改)

    1. 防火墙开启8080端口,用root用户修改/etc/sysconfig/iptables,
    vi /etc/sysconfig/iptables
    

    增加:

    dubbo-admin-tomcat:8080
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
    

    重启防火墙:
    service iptables restart

    1. 启动Tomat7
    $ /home/wusc/dubbo-admin-tomcat/bin/startup.sh
    

    查看tomcat日志:

    tail –f tomcat/logs/catalina.out
    
    1. 浏览http://172.24.51.28:8080/
      默认账号密码都是root

    2. 配置部署了Dubbo管控台的Tomcat开机启动:
      在虚拟主机中编辑/etc/rc.local文件,加入:

    su - wusc -c '/home/wusc/dubbo-admin-tomcat/bin/startup.sh'
    

    参考:http://www.cnblogs.com/xujiming/p/5449065.html

    http://www.biaodianfu.com/dubbo.html

  • 相关阅读:
    线性回归的从零开始实现
    比赛总结
    计数学习笔记
    DP计数问题
    多项式学习笔记
    数据结构学习笔记
    子集运算学习笔记
    待学习
    ICPC2018焦作 题解
    ICPC2018焦作 H题 Can You Solve the Harder Problem?
  • 原文地址:https://www.cnblogs.com/umgsai/p/5836925.html
Copyright © 2011-2022 走看看