Spring、Spring Boot集成分布式服务框架Dubbo

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Spring、Spring Boot集成分布式服务框架Dubbo,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、Dobbo概述

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC(远程服务调用框架) 实现服务的输出和输入功能,可以和Spring框架无缝集成。 Dubbox是当当网的扩展版本,Dubbox 和Dubbo本质上没有区别,名字的含义扩展了Dubbo。 后来捐献给Apache基金会孵化,现已正式成为Apache顶级项目。

Apache Dubbo提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
在这里插入图片描述

核心部分

1.远程通讯,提供对多种基于长连接的NiO框架抽象封装,包括多种线程模型,序列化,以及“请求一响应”模式的信息交换方式。

2.集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持。以及负载均衡,失败容错,地址路由,动态配置等集群支持。 

3.自动发现:基于注册中心目录服务,使用服务消费能动态查找服务提供方,使地址透明,使用服务提供方可以平滑增加或减少服务器

Dubbo架构

在这里插入图片描述

节点角色说明:

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

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

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

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

Container: 服务运行容器。

Subscribe:订阅

Notify:通知

Invoke:调用

调用关系说明:

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

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

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

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

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

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

二、注册中心之Zookeeper

zookeeper概述

官方推荐使用zookeeper注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。

zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境。

zooKeeper用来做dubbo的注册中心,即哪一个服务由哪一台机器来提供必需让调用者知道,简单来说就是 ip 地址和服务名称的对应关系。

zookeeper安装

1.Docker安装zookeeper

Docker安装zookeeper

2.源码安装zookeeper

1.下载zookeeper

zookeeper官网:https://zookeeper.apache.org/

ZooKeeper服务器是用Java创建的,运行在JVM之上,所以需要安装JDK 。

2.上传 apache-zookeeper-3.6.3-bin.tar.gz

3.解压

tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz

4.配置

进入到conf目录拷贝一个zoo_sample.cfg并完成配置

#进入到conf目录
cd /zooKeeper/apache-zookeeper-3.6.3-bin/conf/
#拷贝
cp  zoo_sample.cfg  zoo.cfg
# 修改zoo.cfg
vim /zooKeeper/apache-zookeeper-3.6.3-bin/conf/zoo.cfg

修改存储目录:dataDir=/zookeeper/zkdata

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/zookeeper/zkdata
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true

5.启动

cd /zooKeeper/apache-zookeeper-3.6.3-bin/bin/
#启动
 ./zkServer.sh  start

6.查看状态

./zkServer.sh status

ZooKeeper客户端工具

1.Zoolnspector

在这里插入图片描述

在这里插入图片描述
2.PrettyZoo

PrettyZoo: https://github.com/vran-dev/PrettyZoo

在这里插入图片描述

三、Spring集成Dubbo

1.创建公共接口模块

创建dubbo-interface公共接口模块,并添加一个接口。

public interface IDemoTestService {

    public String demoTest();
}

2.服务提供者

创建dubbo-service工程模块,打包方式是war包。

pom.xml中引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.ybzy</groupId>
    <artifactId>dubbo-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <spring.version>5.2.8.RELEASE</spring.version>
    </properties>

    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>   
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- dubbo相关,版本2.7之后统一为org.apache.dubb-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.9</version>
        </dependency>
        <!--ZooKeeper相关 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.2</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.11</version>
        </dependency>
         <!--dubbo使用相关 -->
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.9.0.GA</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
         <!--公共接口模块-->
        <dependency>
            <groupId>cn.ybzy</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定端口 -->
                    <port>8081</port>
                    <!-- 请求路径 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

配置web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!-- 加载spring容器 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

</web-app>

创建接口实现类

对公共接口模块中的接口进行实现

注意:Service注解是com.alibaba包下的

import cn.ybzy.demo.service.IDemoTestService;
import com.alibaba.dubbo.config.annotation.Service;

/**
 * @Service作用:
 * 
 * 1.这该类提供的方法(服务)对外发布
 * 
 * 2.将访问的地址 ip,端口,路径注册到注册中心中
 */
@Service
public class DemoTestServiceImpl implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

配置applicationContext.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应用的名称,唯一-->
	<dubbo:application name="dubbo-service"/>
	 <!--配置注册中心的地址-->
	<dubbo:registry address="zookeeper://ip:2181"/>
	<!--配置dubbo包扫描,dubbo:annotation用于扫描@Service注解-->
	<dubbo:annotation package="cn.ybzy.demo.service" />
</beans>

3.服务消费者

创建Maven工程,dubbo-web,打包方式为War包。

同dubbo-service工程,引入依赖,修改tomcat插件访问端口。

配置web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

<!--配置前端控制器-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>


  <!-- 解决中文乱码 -->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

创建控制器

注意:Reference注解是com.alibaba包下的
@RestController
@RequestMapping("/demo")
public class DemoTestController {

	/**
     * 1. 从zookeeper注册中心获取demoTestService的访问url
     * 2. 进行远程调用RPC
     * 3. 将结果封装为一个代理对象。给变量赋值
     */
    @Reference
    private IDemoTestService demoTestService;


    @RequestMapping("/test")
    public String demoTest(){
        return demoTestService.demoTest();
    }
}

配置spring-mvc.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" xmlns:mvc="http://www.springframework.org/schema/mvc"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="cn.ybzy.demo.controller"></context:component-scan>


	<mvc:annotation-driven></mvc:annotation-driven>

	<dubbo:application name="dubbo-web"/>
	<dubbo:registry address="zookeeper://ip:2181"/>
	<dubbo:annotation package="cn.ybzy.dmeo.controller" />

</beans>

4.执行测试

tomcat7:run 分别运行两个项目,浏览器访问http://localhost:8082/demo/test

在这里插入图片描述

5.查看zookeeper

在这里插入图片描述

四、部署管理中心

dubbo-admin是一个Dubbo的管理平台,是图形化的服务管理页面,它从注册中心中获取到所有的提供者 / 消费者进行配置管理,如:路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能

Docker安装dubbo-admin

Docker安装dubbo-admin

在这里插入图片描述

源码安装dubbo-admin

1.下载Dubbo-Admin

https://github.com/apache/dubbo-admin.git

2.解压及修改配置文件

进入dubbo-admin-server\src\main\resources目录,修改 **application.properties** 配置文件

修改zookeeper地址

# centers in dubbo2.7, if you want to add parameters, please add them to the url
admin.registry.address=zookeeper://127.0.0.1:2181
admin.config-center=zookeeper://127.0.0.1:2181
admin.metadata-report.address=zookeeper://127.0.0.1:2181
admin.registry.address 注册中心
admin.config-center  配置中心
admin.metadata-report.address 元数据中心

3.打包项目

在dubbo-admin-develop目录执行打包命令 :mvn  clean package

4.启动后端项目

进入dubbo-Admin-develop\dubbo-admin-distribution\target>目录

启动 dubbo-admi	:	java -jar .\dubbo-admin-0.1.jar

5.安装node.js

下载 :https://nodejs.org/en/

6.启动前端项目
dubbo-admin-ui 目录下执行命令:

npm run dev

7.浏览器访问

默认用户名密码都是root

admin.root.user.name=root
admin.root.user.password=root

五、Spring Boot集成Dubbo

构建父模块

<?xml version="1.0" encoding="UTF-8"?>
<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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.ybzy</groupId>
    <artifactId>dubbo</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <name>dubbo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.8.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.10</version>
            <type>pom</type>
        </dependency>

        <!-- zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.3</version>
        </dependency>
    </dependencies>
    
</project>

Common-api

统一定义接口,供其其他模块引用

public interface HelloService {
    
    String sayHello(String message);
}

服务提供者

服务提供者,实现common-api模块中的接口,然后暴露到Zookeeper中,供服务消费者使用

在Spring Boot启动类中加入@EnableDubbo注解,表示要开启dubbo功能

@EnableDubbo能够找到Dubbo注解所注解的任何内容。
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class ProviderApplicaiton {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplicaiton.class, args);
    }
}

提供者配置

server:
  port: 8080

dubbo:
  application:
    # 服务名称,保持唯一
    name: server-provider
    # zookeeper地址,用于向其注册服务
  registry:
    address: zookeeper://127.0.0.1:2181
  #暴露服务方式
  protocol:
    # dubbo协议,固定写法
    name: dubbo
    # 暴露服务端口 (默认是20880,不同的服务提供者端口不能重复)
    port: 20880

接口实现类必须注解@DubboService

import cn.ybzy.common.api.HelloService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;

@DubboService
@Component
public class HelloServiceImpl implements HelloService {
    
    @Override
    public String sayHello(String message) {
        return "hello," + message;
    }
}

服务消费者

服务消费者,通过Dubbo从Zookeeper中获取服务并消费

在Spring Boot启动类中加入@EnableDubbo注解,表示要开启dubbo功能

@EnableDubbo能够找到Dubbo注解所注解的任何内容
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class ConsumerApplicaiton {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplicaiton.class, args);
    }
}

消费者配置

server:
  port: 8081

dubbo:
  application:
    # 服务名称,保持唯一
    name: server-consumer
    # zookeeper地址,用于从中获取注册的服务
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    # dubbo协议,固定写法
    name: dubbo

使用@DubboReference注解将提供者自动装配到消费者中

@RestController
public class HelloController {

    @DubboReference
    private HelloService helloService;

    @GetMapping("/hello/{message}")
    public String sayHello(@PathVariable String message) {
        return this.helloService.sayHello(message);
    }
}

执行测试

启动服务,访问http://localhost:8081/hello/dubbo
在这里插入图片描述
通过客户端连接zookeeper
在这里插入图片描述

六、Dubbo的特性

地址缓存

当zookeeper注册中心挂了,服务任然可以正常访问,原因如下:

1.dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后调用不会访问注册中心。

2.当服务提供者地址发生变化时,注册中心会通知服务消费者。

超时机制

服务消费者在调用服务提供者的时候如果发生了阻塞、等待的情况,会造成服务消费者一直等待下去。如果在某个峰值时刻,大量请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。

dubbo利用超时机制来解决该问题:设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。

使用timeout属性配置超时时间,默认值1000,单位毫秒。
@Service(timeout = 3000)
public class DemoTestServiceImpl implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

重试机制

Dubbo服务在尝试调用一次之后,如出现非业务异常(服务突然不可用、超时等),Dubbo 默认会进行额外的最多2次重试

通过 retries 属性设置重试次数。默认为 2 次。
@Service(retries = 3)
public class DemoTestServiceImpl implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

集群容错

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
在这里插入图片描述
各节点关系:

这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息

Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更

Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个

Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等

LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选

集群容错模式:
在这里插入图片描述

Failover Cluster:

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

Failfast Cluster :

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

Failsafe Cluster :

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

Failback Cluster :

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

Forking Cluster :

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

Broadcast Cluster :

广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
@RestController
@RequestMapping("/demo")
public class DemoTestController {

    @Reference(cluster = "failover")
    private IDemoTestService demoTestService;
    @RequestMapping("/test")
    public String demoTest(){
        return demoTestService.demoTest();
    }
}

负载均衡

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

Dubbo提供了4种负载均衡策略:Random 、RoundRobin 、LeastActive、ConsistentHash

在这里插入图片描述

Random :

随机,按权重设置随机概率。

在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
@Service(weight = 100)
public class DemoTestServiceImpl2 implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

RoundRobin :

轮询,按公约后的权重设置轮询比率。

存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
@Service(weight = 100,loadbalance="roundrobin")
public class DemoTestServiceImpl2 implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

LeastActive:

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
@Service(weight = 100,loadbalance="leastactive")
public class DemoTestServiceImpl2 implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

ConsistentHash:

一致性 Hash,相同参数的请求总是发到同一提供者。

当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

算法参见:http://en.wikipedia.org/wiki/Consistent_hashing

缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />

缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />
@Service(weight = 100,loadbalance="consistenthash")
public class DemoTestServiceImpl2 implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

多版本

在 Dubbo 中为同一个服务配置多个版本。当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。

版本迁移步骤:

1.在低压力时间段,先升级一半提供者为新版本

2.再将所有消费者升级为新版本

3.然后将剩下的一半提供者升级为新版本

dubbo中使用version属性来设置和调用同一个接口的不同版本。

创建如下2个服务提供者:

@Service(version = "v0.0.1")
public class DemoTestServiceImpl implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}
@Service(version = "v0.0.2")
public class DemoTestServiceImpl2 implements IDemoTestService {

    @Override
    public String demoTest() {
        return "Hello Dubbo!";
    }
}

服务消费者

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

    @Reference(version = "v0.0.2")
    private IDemoTestService demoTestService;
    @RequestMapping("/test")
    public String demoTest(){
        return demoTestService.demoTest();
    }
}

服务降级

可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。

mock=force:return null

表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。

mock=fail:return null

表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
@RestController
@RequestMapping("/demo")
public class DemoTestController {

    @Reference(mock = "mock=force:return null")
    private IDemoTestService demoTestService;
    @RequestMapping("/test")
    public String demoTest(){
        return demoTestService.demoTest();
    }
}

七、Dubbo总结概述

什么是Dubbo?

Duubbo是一个RPC远程调用框架, 分布式服务治理框架

什么是Dubbo服务治理?

服务与服务之间会有很多个Url、依赖关系、负载均衡、容错、自动注册服务,Dubbo服务治理便是治理这些关系。

Dubbo有哪些协议?

默认使用的是dubbo协议,还有Http、RMI、Hessian协议

Dubbo的整个架构流程?

四大模块:

生产者:提供服务
消费者: 调用服务
注册中心:注册信息(redis、zk)
监控中心:调用次数、关系依赖等。

过程:

首先生产者将服务注册到注册中心(zk),使用zk持久节点进行存储

消费者订阅zk节点,一旦有节点变更,zk通过事件通知传递给消费者

消费者可以调用生产者服务,服务与服务之间进行调用,都会在监控中心中,存储一个记录

SpringCloud与Dubbo区别?

都可以实现RPC远程调用
都可以使用分布式、微服务场景下

dubbo使用zk或redis作为作为注册中心,而springcloud使用eureka作为注册中心
dubbo支持多种协议,默认使用dubbo协议而Springcloud只能支持http协议。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137061.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!