栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Dubbo学习笔记

Dubbo学习笔记

Dubbo学习笔记

文章目录

Dubbo学习笔记

一、Dubbo出现背景二、分布式系统通信方式

1、RMI2、RPC 三、Dubbo

1、Dubbo架构图2、注册中心-Zookeeper3、Zookeeper基本命令4、Dubbo快速入门

4.1服务提供方开发

1)创建maven工程2)配置web.xml文件3)创建服务接口4)创建服务实现类5)创建applicationContext-service.xml6)启动服务 4.2服务消费方开发

1)创建maven工程2)配置web.xml文件3)编写HelloService接口4)编写Controller5)创建applicationContext-web.xml6)启动服务 5、Dubbo管理控制台

5.1安装5.2使用 6、Dubbo配置相关说明

6.1包扫描6.2协议6.3负载均衡

一、Dubbo出现背景

手册:背景 | Apache Dubbo

单体应用:

​ 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

垂直应用:

​ 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

分布式应用:

​ 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

​ ”合久必分“,虽然提供的是独立的服务,但是可以被其他应用或服务所调用。

​ SOA:Service-Oriented-Archicture 面向服务架构

​ 通过定义接口,来提供调用方式,实际执行逻辑是被调用服务(项目B)中编写的代码

​ 项目A AService —> 项目B BService sayHello(String msg)

流动计算架构:

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

早期SOA实现方式:

1)WebService(注册、发现、调用)

此时通信的数据格式为XML,通信协议也多是http或https

2)ESB:Enterprise Service Bus 企业服务总线

通过管道,将各服务进行整合,以更好的通信

二、分布式系统通信方式 1、RMI

RMI:Remote Method Invocation 远程方法调用

客户端将要调用的方法及参数,打包为辅助对象,通过网络Socket,发送给服务端辅助对象;

服务端接收后,会进行解包,找出真正被调用的对象,然后将执行结果,依次再返回回去;

服务端辅助对象进行打包,然后客户端辅助对象进行解包,结果返回给真正的调用者;

2、RPC

IPC:Inter Process Communication 进程间通信

通信是解决不同进程间相互访问资源的需求

LPC:Local Procedure Call 本地过程调用

RPC:Remote Procedure Call 远程过程调用

RPC真正的目的,是像调用本地方法一样去调用远程方法,而且不需要关心方法部署在哪里,这样才能解耦服务

简单来说,RPC就是从一台机器通过参数传递的方式,调用另一台机器上的方法,并得到返回结果

【常用RPC框架】

1)Dubbo 阿里开发,基于Spring,是当前使用最广泛的RPC框架

2)brpc 百度开发,"baidu-rpc"支持多种协议,性能优良

3)grpc Google开发,基于Netty,在人工智能领域有广泛应用,服务于tensorflow的底层通信

4)Thrift 脸书开发,已开源给apache

三、Dubbo 1、Dubbo架构图

调用关系说明:

​ 0.服务容器负责启动,加载,运行服务提供者。

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

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

2、注册中心-Zookeeper

最早由雅虎开发,用来解决分布式系统中的一致性问题。

包括配置管理、集群的扩容和缩容、分布式锁等等。

zooKeeper下载地址:Apache ZooKeeper

本次教程使用zookeeper的版本为3.4.6,下载完成后可以获得名称为zookeeper-3.4.6.tar.gz的压缩文件。

安装步骤:

1)安装 jdk(略)

2)把 zookeeper 的压缩包(zookeeper-3.4.6.tar.gz)上传到 linux 系统

3)解压缩压缩包;命令: tar -zxvf zookeeper-3.4.6.tar.gz -C /usr

4)进入zookeeper-3.4.6目录,创建data目录; 命令: mkdir data

5)进入conf目录 ,把zoo_sample.cfg 改名为zoo.cfg;命令1: cd conf ;命令2:mv zoo_sample.cfg zoo.cfg

6)打开zoo.cfg文件, 修改data属性:dataDir=/usr/zookeeper-3.4.6/data

3、Zookeeper基本命令

进入Zookeeper的bin目录,启动服务命令: ./zkServer.sh start

停止服务命令: ./zkServer.sh stop

查看服务状态: ./zkServer.sh status

客户端连接:./zkCli.sh

查看目录结构命令:ls /

获取对应目录的值:get /目录名

退出命令:quit

4、Dubbo快速入门

Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。

4.1服务提供方开发

开发步骤:

1)创建maven工程

(打包方式为war)dubbodemo_provider,在pom.xml文件中导入如下坐标



    4.0.0

    com.dapan
    dubbodemo-provider
    1.0-SNAPSHOT
    war

    
        UTF-8
        1.8
        1.8
        5.0.5.RELEASE
    

    
        
            org.springframework
            spring-context
            ${spring.version}
        
        
            org.springframework
            spring-beans
            ${spring.version}
        
        
            org.springframework
            spring-webmvc
            ${spring.version}
        
        
            org.springframework
            spring-jdbc
            ${spring.version}
        
        
            org.springframework
            spring-aspects
            ${spring.version}
        
        
            org.springframework
            spring-jms
            ${spring.version}
        
        
            org.springframework
            spring-context-support
            ${spring.version}
        
        
        
            com.alibaba
            dubbo
            2.6.0
        
        
            org.apache.zookeeper
            zookeeper
            3.4.7
        
        
            com.github.sgroschupf
            zkclient
            0.1
        
        
            javassist
            javassist
            3.12.1.GA
        
        
            com.alibaba
            fastjson
            1.2.47
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.7.0
                
                    1.8
                    1.8
                
            
            
                org.apache.tomcat.maven
                tomcat7-maven-plugin
                
                    
                    8081 
                    /
                
            
        
    

2)配置web.xml文件




    
        contextConfigLocation
        classpath:applicationContext*.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    

3)创建服务接口
package com.dapan.service;

public interface HelloService {
    public String sayHello(String name);
}
4)创建服务实现类
package com.dapan.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.dapan.service.HelloService;

//使用dubbo的注解
@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "hello : " + name;
    }
}

**注意:**服务实现类上使用的Service注解是Dubbo提供的,用于对外发布服务

5)创建applicationContext-service.xml

在src/main/resources下创建applicationContext-service.xml



    
    
    
    
    
    
    
    

6)启动服务

Maven–>dubbodemo-provider–>Plugins–>tomcat7—>tomcat7:run

4.2服务消费方开发

开发步骤:

1)创建maven工程

(打包方式为war)dubbodemo_consumer,pom.xml配置和上面服务提供者相同,只需要将Tomcat插件的端口号改为8082即可

2)配置web.xml文件




    
        contextConfigLocation
        classpath:applicationContext*.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    
    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:applicationContext-web.xml
        
    
    
        springmvc
        /
    

3)编写HelloService接口

将服务提供者工程中的HelloService接口复制到当前工程

4)编写Controller
package com.dapan.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dapan.service.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo")
public class HelloController {

    @Reference
    private HelloService helloService;

    @RequestMapping("/hello")
    public String sayHello(String name) {
        //远程调用
        String result = helloService.sayHello(name);
        System.out.println(result);
        return result;
    }
}

**注意:**Controller中注入HelloService使用的是Dubbo提供的@Reference注解

5)创建applicationContext-web.xml

在src/main/resources下创建applicationContext-web.xml



    
    
    
    

    
    

6)启动服务

Maven–>dubbodemo-consumer–>Plugins–>tomcat7—>tomcat7:run

在浏览器输入http://localhost:8082/demo/hello?name=Jack,查看浏览器输出结果

5、Dubbo管理控制台

我们在开发时,需要知道Zookeeper注册中心都注册了哪些服务,有哪些消费者来消费这些服务。我们可以通过部署一个管理中心来实现。其实管理中心就是一个web应用,部署到tomcat即可。

5.1安装

方式一:有dubbo-admin-2.6.0.war文件

下载地址:dubbo-admin-2.6.0.war.

1)将dubbo-admin-2.6.0.war文件复制到tomcat的webapps目录下

2)在tomcat/bin目录下双击startup.bat启动tomcat,此war文件会自动解压;或者用压缩文件手动解压

3)修改WEB-INF下的dubbo.properties文件,注意dubbo.registry.address对应的值需要对应当前使用的Zookeeper的ip地址和端口号

dubbo.registry.address=zookeeper://192.168.9.128:2181

dubbo.admin.root.password=root

dubbo.admin.guest.password=guest

4)重启tomcat

方式二:从github下载dubbo-admin项目

1)下载代码: git clone https://github.com/apache/dubbo-admin.git

2)在 dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址

3)构建 mvn clean package -Dmaven.test.skip=true

4)启动mvn --projects dubbo-admin-server spring-boot:run

5)访问http://localhost:8080

5.2使用

我使用的是dubbo-admin-2.6.0.war的方式的管理控制台

1)访问http://localhost:8080/dubbo-admin-2.6.0/ ;账户:root 密码:root

2)服务治理—>服务;启动服务提供者工程和服务消费者工程,可以在查看到对应的信息

3)点击服务名进入可以看见服务提供者和消费者的信息

6、Dubbo配置相关说明 6.1包扫描

服务提供者和服务消费者都需要配置,表示包扫描,作用是扫描指定包(包括子包)下的类。

在applicationContext-Service.xml中添加

    
    

就可以使用@Service注解

如果不添加包扫描,也可以通过如下配置的方式来发布服务:



上面这种方式发布和引用服务,一个配置项(dubbo:service、dubbo:reference)只能发布或者引用一个服务,如果有多个服务,这种方式就比较繁琐了。推荐使用包扫描方式。

6.2协议

一般在服务提供者一方配置,可以指定使用的协议名称和端口号。

其中Dubbo支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。

推荐使用的是dubbo协议。

dubbo 协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

也可以在同一个工程中配置多个协议,不同服务可以使用不同的协议,例如:





 

6.3负载均衡

负载均衡(Load Balance):其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。

在集群负载均衡时,Dubbo 提供了多种均衡策略(包括随机、轮询、最少活跃调用数、一致性Hash),缺省为random随机调用。

配置负载均衡策略,既可以在服务提供者一方配置,也可以在服务消费者一方配置,如下:

@Controller 
@RequestMapping("/demo") 
public class HelloController { 
    //在服务消费者一方配置负载均衡策略 
    @Reference(check = false,loadbalance = "random") 
    private HelloService helloService;
    
    @RequestMapping("/hello") 
    @ResponseBody 
    public String getName(String name){ 
        //远程调用 
        String result = helloService.sayHello(name); 
        System.out.println(result); 
        return result; 
    } 
}
//在服务提供者一方配置负载均衡 
@Service(loadbalance = "random") 
public class HelloServiceImpl implements HelloService { 
    public String sayHello(String name) { 
        return "hello " + name; 
    } 
}

可以通过启动多个服务提供者来观察Dubbo负载均衡效果。

**注意:**因为我们是在一台机器上启动多个服务提供者,所以需要修改tomcat的端口号和Dubbo服务的端口号来防止端口冲突。

在实际生产环境中,多个服务提供者是分别部署在不同的机器上,所以不存在端口冲突问题。

    @RequestMapping("/hello") 
    @ResponseBody 
    public String getName(String name){ 
        //远程调用 
        String result = helloService.sayHello(name); 
        System.out.println(result); 
        return result; 
    } 
}
//在服务提供者一方配置负载均衡 
@Service(loadbalance = "random") 
public class HelloServiceImpl implements HelloService { 
    public String sayHello(String name) { 
        return "hello " + name; 
    } 
}

可以通过启动多个服务提供者来观察Dubbo负载均衡效果。

**注意:**因为我们是在一台机器上启动多个服务提供者,所以需要修改tomcat的端口号和Dubbo服务的端口号来防止端口冲突。

在实际生产环境中,多个服务提供者是分别部署在不同的机器上,所以不存在端口冲突问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736020.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号