zoukankan      html  css  js  c++  java
  • Dubbo

    1、概念

    Dubbo是一个基于javaRPC(Remote Procedure Call)框架。

    1.1RPC

    远程过程调用,即在A系统中,远程调用B系统的某个方法或者函数。

    1.1.1PRC需要解决的问题

    1)、通讯问题
    2)、寻址问题
    3)、序列化与反序列化
          调用过程中,数据的传输需要先序列化,得到数据进行反序列化。

    1.2、作用

    在分布式环境下,透明化调用远程方法,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

    2、入门示例

    2.1、准备工作

    安装dubbo注册中心。推荐使用zookeeper
    作用:
    1)存储提供方提供的服务的调用地址。
    2)向调用方提供服务的地址。

    2.1.1Zookeeper

    2.1.1.1、概念

    ZooKeeper是一个开源的、分布式协调服务。

    2.1.1.2、作用

    解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务

    2.1.1.3、特点

    ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。

    2.1.2、单节点安装

    1)安装jdk
    2)上传安装包到Linux服务器,解压 tar zxvf zookeeper-3.4.10.tar.gz
    3)创建配置文件zoo.cfg 
    zookeeper提供了zoo_sample.cfg这个基础配置文件,直接修改其名称为zoo.cfg
    cd /usr/local/zookeeper/zookeeper-3.4.10/conf
    cp zoo_sample.cfg zoo.cfg
    4)、启动  ./zkServer.sh start

    2.1.3、集群版安装

    2.1.3.1、需求

    安装3zookeeper节点。

    2.1.3.2、创建集群目录

    mkdir -p /usr/local/zkCluster
    2.1.3.3、配置一个完整节点
    1)拷贝单节点zookeeper,到集群目录,重命名为zk1
    cp /usr/local/zookeeper/zookeeper-3.4.10 /usr/local/zkCluster/zk1 -rf
    2)创建数据文件目录
    mkdir -p /usr/local/zkCluster/zk1/data
     
    3)在数据文件目录下创建myid文件,并写入值”1”,表示标识该节点。
    4)修改zk1zoo.cfg文件,指定数据文件目录和端口,及集群的配置信息。
    5)、复制zk1,一共三份,分别为zk1zk2zk3
    cd /usr/local/zkCluster
    cp -rf zk1 zk2
    cp -rf zk1 zk3
     
    6)、修改zk2zk3myid文件、zoo.cfg文件。
    7)、启动集群
    依次启动zk1zk2zk3
    8)、自定义shell脚本zkCluster.sh,管理集群启动、关闭、重启操作。
    #!/bin/bash
    case "$1" in
        start)
            echo 'Starting zkCluster...'
            /usr/local/zkcluster/zk1/bin/zkServer.sh start
            /usr/local/zkcluster/zk2/bin/zkServer.sh start
            /usr/local/zkcluster/zk3/bin/zkServer.sh start
            ;;
        stop)
            echo 'Stopping zkCluster...'
            /usr/local/zkcluster/zk1/bin/zkServer.sh stop
            /usr/local/zkcluster/zk2/bin/zkServer.sh stop
            /usr/local/zkcluster/zk3/bin/zkServer.sh stop
            ;;
        status)
            /usr/local/zkcluster/zk1/bin/zkServer.sh status
            /usr/local/zkcluster/zk2/bin/zkServer.sh status
            /usr/local/zkcluster/zk3/bin/zkServer.sh status
            ;;
        restart|force-reload)
            echo 'Restarting zkCluster...'
            ${0} stop
            ${0} start
            ;;
      *)
    esac
     
    9)、重启集群
    ./zkCluster.sh restart
     
    2.1、需求
    通过dubbo调用服务,查询用户列表。

    2.2、项目结构

    dubbo-server:用于添加java接口-interface,定义服务。
    dubbo-provider:用于添加java接口实现类,并且发布服务。
    dubo-consumer:用于消费服务,即服务的调用。

    2.3、创建dubbo-server

    2.3.1、项目结构

    2.3.2、代码实现

    1)、User.java   实现序列化接口
    package cn.gzsxt.dubbo.pojo;
    import java.io.Serializable;
    public class User implements Serializable{
        /**
         *
         */
        private static final long serialVersionUID = 4498814071761004317L;
        private Integer id;
        
        private String name;
        
        private String pwd;
        public User() {
             super();
             // TODO Auto-generated constructor stub
        }
        public User(int id, String name, String pwd) {
             this.id = id;
             this.name = name;
             this.pwd = pwd;
        }
        public Integer getId() {
             return id;
        }
        public void setId(Integer id) {
             this.id = id;
        }
        public String getName() {
             return name;
        }
        public void setName(String name) {
             this.name = name;
        }
        public String getPwd() {
             return pwd;
        }
        public void setPwd(String pwd) {
             this.pwd = pwd;
        }
    }
     
    2UserService.java   定义接口服务
    package cn.gzsxt.dubbo.pojo;
    import java.io.Serializable;
    public class User implements Serializable{
        /**
         *
         */
        private static final long serialVersionUID = 4498814071761004317L;
        private Integer id;
        
        private String name;
        
        private String pwd;
        public User() {
             super();
             // TODO Auto-generated constructor stub
        }
        public User(int id, String name, String pwd) {
             this.id = id;
             this.name = name;
             this.pwd = pwd;
        }
        public Integer getId() {
             return id;
        }
        public void setId(Integer id) {
             this.id = id;
        }
        public String getName() {
             return name;
        }
        public void setName(String name) {
             this.name = name;
        }
        public String getPwd() {
             return pwd;
        }
        public void setPwd(String pwd) {
             this.pwd = pwd;
        }
    }
     

    2.4、创建dubbo-provider

    2.4.1、项目结构

    2.4.2、添加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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>cn.gzsxt.dubbo</groupId>
      <artifactId>dubbo-provider</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
      <dependencies>
             <!-- 导入dubbo-server服务接口 -->
             <dependency>
                 <groupId>cn.gzsxt.dubbo</groupId>
                 <artifactId>dubbo-server</artifactId>
                 <version>0.0.1-SNAPSHOT</version>
             </dependency>
             <!-- dubbo采用spring配置方式,所以需要导入spring容器依赖 -->
             <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-webmvc</artifactId>
                 <version>4.1.3.RELEASE</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>
                 <artifactId>slf4j-log4j12</artifactId>
                 <version>1.6.4</version>
             </dependency>
             
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>dubbo</artifactId>
                 <version>2.5.3</version>
                 <exclusions>
                      <exclusion>
                          <!-- 排除传递spring依赖 -->
                          <artifactId>spring</artifactId>
                          <groupId>org.springframework</groupId>
                      </exclusion>
                 </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.apache.zookeeper</groupId>
                 <artifactId>zookeeper</artifactId>
                 <version>3.3.3</version>
             </dependency>
             <dependency>
                 <groupId>com.github.sgroschupf</groupId>
                 <artifactId>zkclient</artifactId>
                 <version>0.1</version>
             </dependency>
             
        </dependencies>
             <build>
             <plugins>
                 <plugin>
                      <groupId>org.apache.tomcat.maven</groupId>
                      <artifactId>tomcat7-maven-plugin</artifactId>
                      <version>2.2</version>
                      <configuration>
                          <port>8081</port>
                          <path>/</path>
                      </configuration>
                 </plugin>
             </plugins>
        </build>
    </project>

    2.4.3、创建服务实现类

    UserServiceImpl.java
    package cn.gzsxt.dubbo.service.impl;
    import java.util.ArrayList;
    import java.util.List;
    import cn.gzsxt.dubbo.pojo.User;
    import cn.gzsxt.dubbo.service.UserService;
    /**
     * UserService服务的实现类
     * @author lyq
     *
     */
    public class UserServiceImpl implements UserService{
        @Override
        public List<User> getAllUsers() {
             
             List<User> uList = new ArrayList<>();
             
             User user = null;
             //模拟查询数据库
             for(int i =0;i<5;i++){
                 user = new User(i,"zs"+i,"gzsxt"+i);
                 uList.add(user);
             }
             
             return uList;
        }
    }
     

    2.4.4、创建dubbo配置文件dubbo-provider.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="dubbo-provider" />
        <!-- 这里使用的注册中心是zookeeper -->
        <dubbo:registry protocol="zookeeper" address="192.168.56.3:2181,192.168.56.3:2182,192.168.56.3:2183" />
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
        <!-- 将具体的实现类加入到Spring容器中 -->
        <bean id="userServiceImpl" class="cn.gzsxt.dubbo.service.impl.UserServiceImpl" />
        <!-- 将服务接口暴露到dubbo中 -->
        <dubbo:service interface="cn.gzsxt.dubbo.service.UserService" ref="userServiceImpl" />
    </beans>

    2.4.5、配置Web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
        
        <display-name>dubbo-provider</display-name>
        
        <context-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath:dubbo/dubbo-*.xml</param-value>
        </context-param>
        
        <!--Spring的ApplicationContext 载入 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
        <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
     

    2.4.6、启动dubbo-provider

    2.5、创建dubbo-consumer

    2.5.1、项目结构

    2.5.2、添加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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>cn.gzsxt.dubbo</groupId>
      <artifactId>dubbo-consumer</artifactId>
      <version>0.0.1-SNAPSHOT</version>
     
      <dependencies>
             <!-- 导入dubbo-server服务接口 -->
             <dependency>
                 <groupId>cn.gzsxt.dubbo</groupId>
                 <artifactId>dubbo-server</artifactId>
                 <version>0.0.1-SNAPSHOT</version>
             </dependency>
             <!-- dubbo采用spring配置方式,所以需要导入spring容器依赖 -->
             <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-webmvc</artifactId>
                 <version>4.1.3.RELEASE</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>
                 <artifactId>slf4j-log4j12</artifactId>
                 <version>1.6.4</version>
             </dependency>
             
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>dubbo</artifactId>
                 <version>2.5.3</version>
                 <exclusions>
                      <exclusion>
                          <!-- 排除传递spring依赖 -->
                          <artifactId>spring</artifactId>
                          <groupId>org.springframework</groupId>
                      </exclusion>
                 </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.apache.zookeeper</groupId>
                 <artifactId>zookeeper</artifactId>
                 <version>3.3.3</version>
             </dependency>
             <dependency>
                 <groupId>com.github.sgroschupf</groupId>
                 <artifactId>zkclient</artifactId>
                 <version>0.1</version>
             </dependency>
             
        </dependencies>
     
    </project>
     

    2.5.3、创建dubbo配置文件dubbo-consumer.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="dubbo-consumer" />
        <!-- 这里使用的注册中心是zookeeper -->
        <dubbo:registry protocol="zookeeper" address="192.168.56.3:2181,192.168.56.3:2182,192.168.56.3:2183" />
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
        <!-- 引用dubbo中的服务 -->
        <dubbo:reference interface="cn.gzsxt.dubbo.service.UserService" id="userService" />
        
    </beans>
     
     

    2.5.4、本地测试

    package cn.gzsxt.dubbo.test;
    import java.util.List;
    import org.junit.Test;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import cn.gzsxt.dubbo.pojo.User;
    import cn.gzsxt.dubbo.service.UserService;
    public class TestConsumer {
        
        @Test
        public void testConsumer(){
             //1.读取配置文件,加载容器
             ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:dubbo/dubbo-consumer.xml");
             //2.获取bean对象
             UserService userService = context.getBean("userService", UserService.class);
             //3.调用方法
             List<User> users = userService.getAllUsers();
             System.out.println(users);
        }
    }
     

    3dubbo原理

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

    4、安装监控中心

    4.1、创建安装目录

    mkdir -p /usr/local/dubbo

    4.2、上传、解压

    tar zxvf dubbo-monitor-simple-2.5.3-assembly.tar.gz -C /usr/local/dubbo

    4.3、修改配置文件

    cd /usr/local/dubbo/dubbo-monitor-simple-2.5.3/conf

    4.4、启动

    cd /usr/local/dubbo/dubbo-monitor-simple-2.5.3/bin/

    4.5、访问监控中心

    5、安装管理控制台

    5.1、解压tomcat、清空tomcat/webapps/ROOT

    tar zxvf apache-tomcat-7.0.68.tar.gz -C /usr/local/dubbo
    rm /usr/local/dubbo/apache-tomcat-7.0.68/webapps/ROOT/* -rf

    5.2、解压dubbo-admin.wartomcat/webapps/ROOT目录

    unzip dubbo-admin-2.5.4.war -d /usr/local/dubbo/ tomcat-7.0.68/webaaps/Root

    5.3、修改dubbo.properties

    cd /usr/local/dubbo/apache-tomcat-7.0.68/webapps/ROOT/WEB-INF

    5.4、启动tomcat

    cd /usr/local/dubbo/apache-tomcat-7.0.68/bin  && ./startup.sh

    5.5、访问控制台

    http:192.168.56.3:8080/governance/services

    6dubbo注解

    6.1dubbo-provider注解实现

    6.1.1、添加注解对象

    6.1.2、修改dubbo-provider.xml配置,开启注解

    6.2dubbo-consumer注解实现

    6.2.1、新增spring-test依赖

    <!-- 导入spring-test的依赖 -->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-test</artifactId>
               <version>4.1.3.RELEASE</version>
           </dependency>
           
           <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>4.12</version>
           </dependency>

    6.2.2、修改测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:dubbo/dubbo-consumer.xml")
    public class TestConsumer {
        @Reference
        private UserService userService;
        
        @Test
        public void testConsumer(){
        
           List<User> users = userService.getAllUsers();
           System.out.println(users);
        }
    }

    6.2.3、修改dubbo-consumer.xml,开启注解

  • 相关阅读:
    CentOS-7 本地yum源挂载
    VMware 安装 Centos7
    linux永久关闭SELinux*
    linux添加用户
    git分支常用命令
    git 常用命令
    springboot 自定义interceptor 对请求进行拦截
    ORACLE 远程导出DMP文件
    解决idea2018无法安装lombok的问题
    centos下快速安装mysql
  • 原文地址:https://www.cnblogs.com/aknife/p/11372368.html
Copyright © 2011-2022 走看看