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