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

Dubbo快速入门教程

Dubbo快速入门教程

Dubbo入门教程

1 、Dubbo概述

DUbbo架构 2、Dubbo快速入门

Zookeeper 安装传统的模块化开发Duboo入门小案例

修改Service模块代码修改WEB模块代码增加公共的接口模块 3、Dubbo高级特性

dubbo-admin管理平台

dubbo-adminm安装

一、dubbo-admin安装二、dubbo-admin简单使用 序列化地址缓存超时和重试多版本负载均衡(4种)

RandomRoundRobinLeastActiveConsistentHash:一致Hash,相同次数的请求总是发到同一提供者。 集群容错服务降级

本笔记参考https://www.bilibili.com/video/BV1VE411q7dX?p=7 视频整理获得

1 、Dubbo概述

Dubbo是阿里巴巴公司开源的一个高性能、轻量级的java RPC框架致力于提供高性能和透明化的RPC远程调用方案,以及SOA服务治理方案

官网地址:Apache Dubbo

DUbbo架构

节点角色说明:

Provider:暴露服务的服务提供方Container:服务运行容器Consumer:调用远程服务的服务消费方Registry:服务注册与发现的注册中心Monitor:统计服务的调用次数和调用时间的监控中心

2、Dubbo快速入门 Zookeeper 安装

Zookeeper依赖java环境请确保您的机器安装过jdk
官网下载https://zookeeper.apache.org/releases.html

下载后解压

复制一份zoo_sample.cfg 文件 修改为zoo.cfg默认启动配置文件

配置端口和日志数据保存路径

zkServer.sh start 启动命令
zkServer.sh status查看状态
zkServer.sh stop 停止命令

其他系统安装可参考菜鸟教程

传统的模块化开发

1、创建Provider模块和Consumer模块

2、web模块引入service模块

 
 
     cn.qileyun
     dubbo-service
     1.0-SNAPSHOT
 

3、编写service

@Service
public class UserServiceImpl implements UserService {

   public String sayHello() {
       return "hello dubbo!";
   }
}

4、编写web

   //注入一下service
  @Autowired
   UserService userService;

  @RequestMapping("/sayHello")
  public String sayHello(){
      return userService.sayHello();
  }

Duboo入门小案例
    创建服务提供者Provider模块创建服务消费者Consumer模块在服务提供者模块编写UserServiceImpl提供服务在服务消费者中UserController远程调用UserServiceImpl提供的服务分别启动两个服务,测试
    导入Dubbo包
    
        org.apache.dubbo
        dubbo
        ${dubbo.version}
    
    
    
        org.apache.curator
        curator-framework
        ${zookeeper.version}
    
    
    
        org.apache.curator
        curator-recipes
        ${zookeeper.version}
    
修改Service模块代码

1、修改service和web的启动端口
web


    
        
        
            org.apache.tomcat.maven
            tomcat7-maven-plugin
            2.1
            
                8000
                /
            
        
    

service

 9000

spring提供的@Service是注册到spring容器中,而Dubbo提供的是注册到注册中心去


在applicationContext.xml配置文件




    
    
    
    
    
    
    
    
    

web.xml





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

修改WEB模块代码

1、web模块无需导入service模块了,以后都是通过Dubbo通过RPC进行调用

2、springmvc.xml配置




    
    


     
    
        
        
    
    
    
    
    

3、修改controller注入方式

//@Autowired//本地注入


//注入一下service
@Reference//远程注入
UserService userService;

@RequestMapping("/sayHello")
public String sayHello() {
    return userService.sayHello();
}
增加公共的接口模块

web模块和service模块分别导入这个模块

 
 
     cn.qileyun
     dubbo-interface
     1.0-SNAPSHOT
 

运行看看

gitee项目地址:https://gitee.com/qlyml/dubbo-learning/tree/introduction/

3、Dubbo高级特性 dubbo-admin管理平台
    dubbo-admin管理平台,是图形化的服务管理界面从注册中心中获取到所有的提供者/消费者进行配置管理路由配置、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能dubbo-admin是一个前后端分离的项目。前端使用的是vue,后端使用springboot
dubbo-adminm安装 一、dubbo-admin安装

1、环境准备

dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,nodejs
安装node(如果当前机器已经安装请忽略)****

2、下载 Dubbo-Admin

下载地址:https://github.com/apache/dubbo-admin

3、把下载的zip包解压到指定文件夹(解压到那个文件夹随意)

4、修改配置文件

解压后我们进入…dubbo-admin-developdubbo-admin-serversrcmainresources目录,找到 application.properties 配置文件 进行配置修改

修改zookeeper地址

# centers in dubbo2.7 zookeeperip地址
admin.registry.address=zookeeper://ip:2181
admin.config-center=zookeeper://ip:2181
admin.metadata-report.address=://ip:2181

admin.registry.address注册中心
admin.config-center 配置中心
admin.metadata-report.address元数据中心

5、打包项目

在 dubbo-admin-develop 目录执行打包命令

mvn  clean package

6、启动后端

切换到目录

dubbo-Admin-developdubbo-admin-distributiontarget>

执行下面的命令启动 dubbo-admin,dubbo-admin后台由SpringBoot构建。
最好用jdk8进行运行不让登录报错

Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

java -jar .dubbo-admin-0.1.jar


发现启动失败了,原因是和zookeeper端口冲突
解决:
第一种方式:修改zookeeper的配置文件zoo.cfg
比如修改成8888
admin.serverPort=8888

第二种方式:修改dubbo-admin-server的端口
比如在dubbo-admin-server项目的application.properties文件中添加server.port=2399

7、前台后端

dubbo-admin-ui 目录下执行命令

npm run dev

由于我选择了第二种还需要修改前端访问后端地址

8、访问

浏览器输入。用户名密码都是root
http://localhost:8082/

二、dubbo-admin简单使用

注意:Dubbo Admin【服务Mock】【服务统计】将在后续版本发布…

在上面的步骤中,我们已经进入了Dubbo-Admin的主界面,在【快速入门】章节中,我们定义了服务生产者、和服务消费者,下面我们从Dubbo-Admin管理界面找到这个两个服务

1、点击服务查询

2、查询结果

A:输入的查询条件cn.qileyun

B:搜索类型,主要分为【按服务名】【按IP地址】【按应用】三种类型查询

C:搜索结果

3.1.4 dubo-admin查看详情

我们查看cn.qileyun.service.UserService (服务提供者)的具体详细信息,包含【元数据信息】

1)点击详情

从【详情】界面查看,主要分为3个区域

A区域:主要包含服务端 基础信息比如服务名称、应用名称等

B区域:主要包含了生产者、消费者一些基本信息

C区域:是元数据信息,注意看上面的图,元数据信息是空的

我们需要打开我们的生产者配置文件加入下面配置


重新启动生产者,再次打开Dubbo-Admin

这样我们的元数据信息就出来了

序列化

dubbo内部已经将序列化和反序列化的过程内部封装了我们只需要在定义pojo类时实现Serializable接口即可一般会定义一个公共的pojo模块,让生产者和消费者都依赖该模块。

1、创建一个公共的pojo模块

2、同样需要引入这个pojo对象的模块都导入到pom中
3、编写pojo对象

package cn.qileyun.pojo;
//一定要序列化哦
import java.io.Serializable;

public class User implements Serializable {
    private int id;
    private String username;
    private String password;

    public User() {
    }

  。。。
}

4、编写service

public User findUserByid(int id) {
    //查询User对象
    User user = new User(1,"zhangsan","123");
    return user;
}

5、编写web

 
  @RequestMapping("/find")
  @ResponseBody
  public User find(int id) {
      return userService.findUserByid(id);
  }

测试看看

地址缓存

思考一个问题:如果注册中心挂啦,服务示范可以正常访问?

可以英文dubbo服务消费者在地由此调用时会缓存到本地,以后在调用则不会访问注册中心。当服务提供者地址发生变化时,注册中心会通知服务消费者。

停止zookeeper依然可以访问
超时和重试

超时

服务消费者在调用服务提供者的时候发生赌赛、等待的情形,这个时候,服务消费者会一直等待下去。在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。dubbo利用 超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。使用timeout属性配置超时时间,默认值1000,单位毫秒。

service模块中设置超时时间

web模块中设置超时时间

建议在Service模块中设置超时时间,调用方设置可以覆盖服务端端配置

重试

设置来超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。如果出现网络抖动,则这一次请求就会失败。

@Service(timeout = 3000,retries = 2) //当前服务3秒超时.重式2次,一共三次

多版本

灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。dubbo中使用version属性来设置和调用同一个借口的不同版本。
通过version声明版本

@Service(version = "v1.0") //当前服务3秒超时.重式2次,一共三次
public class UserServiceImpl implements UserService {

    public String sayHello() {
        return "hello dubbo!";
    }

    public User findUserByid(int id) {
        System.out.println("old....");
        //查询User对象
        User user = new User(1, "zhangsan", "123");
        return user;
    }
}

@Service(version = "v2.0") //当前服务3秒超时.重式2次,一共三次
public class UserServiceImpl2 implements UserService {

    public String sayHello() {
        return "hello dubbo!";
    }

    public User findUserByid(int id) {
        System.out.println("new....");
        //查询User对象
        User user = new User(2, "zhangsan2", "123");
        return user;
    }
}

调用方声明调用那个版本

@Reference(version = "v2.0")//远程注入
 UserService userService;

@RequestMapping("/find")
@ResponseBody
public User find(int id) {
    return userService.findUserByid(id);
}

负载均衡(4种) Random

随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

1、多个服务声明权重

@Service(weight = 100)//声明权重

2、调用服务

@Reference(loadbalance = "random")//远程注入
UserService userService;
RoundRobin

轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。(针对此种情况,需要降低该服务的权值,以减少对其调用) LeastActive

最少活跃调用数,相同活跃数的随机。最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 ConsistentHash:一致Hash,相同次数的请求总是发到同一提供者。

一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 集群容错

    Failover Cluster

失败自动切换,当出现失败,重试其它服务器。(缺省)通常用于读操作,但重试会带来更长延迟。可通过retries="2"来设置重试次数(不含第一次)。

    Failfast Cluster

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

    Failsafe Cluster

失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

    Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

    Forking Cluster

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
可通过forks="2"来设置最大并行数。

    Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)通常用于通知所有提供者更新缓存或日志等本地资源信息。

你可以在消费者设置

@Reference(cluster = "failsafe")//设置容错模式
UserService userService;

也可以在服务端设置

//将这个类提供方法(服务)对外发布,将访问地址ip、端口、路径注册中心去
@Service(cluster = "failsafe" ) //当前服务3秒超时.重式2次,一共三次
public class UserServiceImpl implements UserService {


}
服务降级

屏蔽:force.mock (即:屏蔽请求,直接返回某个值,如上面的字符串,mock=“return 123456…”);

容错:fail.mock (即:允许请求,在请求失败的时候,再返回某个值,如:mock=“fail:return 123456…”);
如一下操作:

@Reference(mock = "force:return null")//不在去调用userService 并且啥都不返回
UserService userService;


以上很多配置都可以在服务者和消费者都可以去定义,并且可以在xml中定义

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

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

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