Dubbo 服务治理:注册多个服务器,实现高可靠性! (dubbo 注册两个服务器)

Dubbo是一个高性能、轻量级的Java RPC框架,它提供了基于服务治理、远程调用和负载均衡等核心功能,帮助我们构建分布式系统。在Dubbo框架中,服务治理是主要的功能之一,比如服务注册、发现、负载均衡、路由、降级等。本文主要介绍如何通过注册多个服务器来实现Dubbo服务的高可靠性。

一、Dubbo服务注册

Dubbo服务注册是指将提供服务的服务器地址和端口信息注册到注册中心。注册中心充当服务中介的角色,负责服务发现、路由、负载均衡等功能。Dubbo框架支持多个注册中心,包括Zookeeper、Redis等。本文以Zookeeper作为注册中心为例来介绍。

在Dubbo框架中,我们需要定义一个Dubbo服务接口,该接口定义了服务的方法和参数。以一个简单的示例为例:

“`

public interface HelloService {

String sayHello(String name);

}

“`

然后,我们需要在服务提供方的配置文件中定义Dubbo服务接口的实现类,并注册到Zookeeper注册中心中:

“`

“`

Zookeeper注册中心的地址为127.0.0.1:2181,Dubbbo服务使用协议为dubbo,端口号为20230,服务接口为com.example.service.HelloService,服务接口实现为com.example.service.impl.HelloServiceImpl。

二、Dubbo服务发现与负载均衡

Dubbo服务发现是指在调用Dubbo服务之前,需要从注册中心获取可用的服务提供方地址列表。Dubbo框架提供了多种服务发现策略,如随机、轮询、一致性哈希等。本文以轮询方式为例来介绍。

我们可以在服务消费方的配置文件中定义服务发现和负载均衡策略:

“`

“`

Zookeeper注册中心的地址为127.0.0.1:2181,Dubbo服务接口为com.example.service.HelloService,负载均衡策略为轮询。我们可以在HelloServiceConsumer类中调用Dubbo服务:

“`

public class HelloServiceConsumer {

private HelloService helloService;

public void setHelloService(HelloService helloService) {

this.helloService = helloService;

}

public void sayHello(String name) {

String result = helloService.sayHello(name);

System.out.println(result);

}

}

“`

三、Dubbo服务多注册中心

在实际开发中,为了提高Dubbo服务的可靠性,我们通常需要注册多个Zookeeper注册中心。Dubbo框架支持在服务消费方和服务提供方中配置多个注册中心,这样即使一个注册中心出现故障,仍然可以通过其它注册中心获取可用的服务提供方地址列表。

我们可以在服务提供方的配置文件中添加多个注册中心:

“`

“`

我们向Dubbo框架添加了两个Zookeeper注册中心,地址分别为127.0.0.1:2181和127.0.0.1:2182。

在服务消费方的配置文件中同样添加多个注册中心:

“`

“`

这样就实现了Dubbo服务的多注册中心配置,提高了服务的可靠性和稳定性。

四、Dubbo服务降级

在Dubbo服务较为复杂的系统中,服务提供方所提供的服务可能存在故障或超时等情况,这时就需要进行服务降级。Dubbo框架的服务降级功能可以通过快速失败、Mock数据等方式来保证服务的可靠性。

我们可以使用Dubbo的ProviderConfig和ConsumerConfig的mock属性进行服务降级。这两个属性可以指定Dubbo在服务提供方或服务消费方调用失败时,自动调用指定的Mock服务。

以服务消费方为例,我们可以在配置文件中添加mock属性:

“`

“`

添加了mock=”true”属性后,Dubbo服务消费方在调用Dubbo服务时出现异常,会自动调用HelloServiceMock的方法进行服务降级。

“`

public class HelloServiceMock implements HelloService {

@Override

public String sayHello(String name) {

// 返回Mock数据

return “Error Occurred. Cannot call HelloService.sayHello().”;

}

}

“`

通过多注册中心和服务降级等策略,可以有效保证Dubbo服务的可靠性和稳定性。作为目前企业级分布式服务的主流选择,在实际生产中深入应用Dubbo服务治理策略,将有助于提升整个企业的技术实力。

相关问题拓展阅读:

dubbo服务暴露

服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。

eg、

引用服务配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。

eg、

协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。

eg、

应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。

eg、

模块配置,用于配置当前模块信息,可选。困哗岁

注册中心配置,用于配芦渗置连接注册中心相关信息。

eg、

监控中心配置,用于配置连接监控中心相关信息,可选。

提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。

消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。

方法配置,用于ServiceConfig和ReferenceConfig指定方法汪睁级的配置信息。

用于指定方法参数配置。

Invoker URL ServiceBean

URL 之于 Dubbo,犹如水之于鱼,非常重要。

在 Dubbo 中,Invoker 是一个非常重要的模型。在服务提供端,以及服务引用端均会出现 Invoker。Dubbo 官方文档中对 Invoker 进行了说明,这里引用一下。

Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

1.概览

→ ServiceConfig→Invoker→ Exporter->启动server打开端口->注册

导出时机:

afterPropertiesSet

onApplicationEvent

为什么要延迟暴露

导出了什么东西

怎么导出的

导出的入口

org.apache.dubbo.config.ServiceConfig#export

检查配置举个例子 protocol

如果为空就set,然后增加属性

org.apache.dubbo.config.AbstractInterfaceConfig#loadRegistries的registries什么时候注入的?提出问题

org.springframework.beans.factory.BeanFactoryUtils#beansOfTypeIncludingAncestors(org.springframework.beans.factory.ListableBeanFactory, java.lang.Class, boolean, boolean)

这里获取默认的配置 扩展IOC

双注册中心

haunt 资料

org.apache.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol

1.将一些信息,比如版本、时间戳、方法名以及各种配置对象的字段信息放入到 map 中,map 中的内容将作为 URL 的查询字符串。构建好 map 后,紧接着是获取上下文路径、主机名以及端口号等信息。最后将 map 和主机名等数据传给 URL 构造方法创建 URL 对象。

3.暴露本地服务org.apache.dubbo.config.ServiceConfig#exportLocal

先看一下成员变量。使用spi

创建invoker的过程

生成的protocol code

String extName = (url.getProtocol() == null ? “dubbo”: url.getProtocol());

org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);

最后得到

org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol

回忆getExtension的时候,对Protocol包装又包装。

build一个过滤链,启动一个服务质量监控服务器,增加一个监听者。

为什么要有本地暴露

本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。

org.apache.dubbo.registry.integration.RegistryProtocol#doLocalExport

org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol#openServer

org.apache.dubbo.rpc.Protocol#export 远程暴露

org.apache.dubbo.registry.integration.RegistryProtocol#export

远程暴露之一步 交给具体的协议去暴露本地端口

org.apache.dubbo.registry.integration.RegistryProtocol#doLocalExport

→org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol#export(缓存exporter)

→org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol#openServer(缓存server)

第二步-注册

获取注册中心

org.apache.dubbo.registry.support.AbstractRegistryFactory#getRegistry

→org.apache.dubbo.registry.etcd.EtcdRegistryFactory#createRegistry

→org.apache.dubbo.remoting.etcd.jetcd.JEtcdTransporter#connect

org.apache.dubbo.remoting.etcd.support.AbstractEtcdClient#create

org.apache.dubbo.remoting.etcd.jetcd.JEtcdClientWrapper#createPersistent

模板方法

重点是把dubbo的url转换成etcd的节点

为啥注册中心挂了,服务还能继续通信?

com.alibaba.dubbo.registry.RegistryService#subscribe

最后。官网的说明

URL举例

上图是服务提供者暴露服务的主过程:

首先 ServiceConfig 类拿到对外提供服务的实际类 ref(如:HelloWorldImpl),然后通过 ProxyFactory 类的 getInvoker 方法使用 ref 生成一个 AbstractProxyInvoker 实例,到这一步就完成具体服务到 Invoker 的转化。接下来就是 Invoker 转换到 Exporter 的过程。

Dubbo 处理服务暴露的关键就在 Invoker 转换到 Exporter 的过程,上图中的红色部分。下面我们以 Dubbo 和 RMI 这两种典型协议的实现来进行说明:

Dubbo服务注册到Zookeeper上的IP与本机IP不一致

1、问题描述

如图,本地在

内网

的ip为172.27.43.8,但是服务注册汪渣宴到了zk上后,ip变成了本地的ip:192.168.68.2

2、原梁氏因解析

发布服务到远程zk,dubbo是调用ServiceConfig.doExportUrlsFor1Protocol方法,

在doExportUrlsFor1Protocol方法中,通过以下两步获取到host和port两个值。

服务注册困银到zk上所用的ip,正是这个host,这个findConfigedHosts方法,入参就包括protocolConfig。

因此我们猜想,修改protocolConfig中的host配置,是不是就可以改变服务注册到zk上所显示的ip?

3、解决方法

在dubbo的xml

配置文件

中,配置protocol属性如下:

将host改为本地的ip后,重新尝试将服务注册到zk,发现zk上的ip已经变为我们所配置的host,问题解决~

关于dubbo 注册两个服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Dubbo 服务治理:注册多个服务器,实现高可靠性! (dubbo 注册两个服务器)