昆明java培训
达内昆明广州春城路

18487146383

热门课程

dubbo服务的集群容错

  • 时间:2016-11-04
  • 发布:昆明Java培训
  • 来源:java教程

昆明Java培训机构的老师这一期给大家讲集群容错。

基本概念

首先,我们要明确dubbo是怎么做集群的。dubbo的集群即同一个服务部署多台机或者同一台机不同端口注册到注册中心,消费者就通过访问规则访问集群内的不同节点的服务。

集群只需多个相同服务注册相同的注册中心。在每个服务提供者配置相同集群策略和访问策略,对于消费者是透明,消费者通过框架决定访问那个服务提供者。消费者通过注册中心提供的服务端的协议信息,决定访问哪个服务。

dubbo的集群容错即当服务消费者调用服务提供者集群中的服务失败时,Dubbo提供了多种容错方案,缺省为failover重试(失败自动切换,当出现失败,重试其它服务器)。Dubbo提供的集群容错模式有:

Failover Cluster(失败自动切换,当出现失败,重试其它服务器。(缺省))

Failfast Cluster(快速失败,只发起一次调用,失败立即报错。)

Failsafe Cluster(失败安全,出现异常时,直接忽略。)

Failback Cluster(失败自动恢复,后台记录失败请求,定时重发。)

Forking Cluster(并行调用多个服务器,只要一个成功即返回。)

Broadcast Cluster(广播调用所有提供者,逐个调用,任意一台报错则报错。)

集群模式配置

我们创建了服务消费者mcweb-web与服务提供者mcweb-logic,现在我们再增加两个服务提供者,和mcweb-logic属于同一个服务,便于区分,将模块名称命名为mcweb-logic-a,mcweb-logic-b。现在mcweb-logic,mcweb-logic-a,mcweb-logic-b都属于同一个服务,均提供IUserService服务。需要将三个相同的服务以不同的端口注册到zookeeper中并指定集群容错模式,集群容错模式也可以在服务提供者配置。

<!--\mcweb\mcweb-web\src\main\resources\spring\dubbo-consumer.xml-->

<dubbo:reference

interface="com.mcweb.api.service.IUserService"

id="userService"

check="false"

protocol="dubbo"

cluster="failover"

retries="2"

/>

<!---或者->

<!--\mcweb\mcweb-logic\src\main\resources\spring\dubbo-provider.xml-->

<dubbo:protocol ame="dubbo" port="20880" />

<dubbo:service

interface="com.mcweb.api.service.IUserService"

ref="userService"

protocol="dubbo"

cluster="failover"

retries="2"

/>

运行服务集群

我们采用了tomcat容器来运行服务消费者和服务提供者,现在我们采用main方法来运行,这种方式通常在测试环境中使用。

<!--\mcweb\mcweb-logic\src\main\java\com\mcweb\logic\test\DubboServiceStart.java-->

public class DubboServiceStart {

public static void main(String[] args) throws IOException {

ApplicationContext ctx = new

ClassPathXmlApplicationContext("classpath*:spring/applicationContext.xml");

System.out.println("mcweb-logic服务已启动...");

//为保证服务一直开着,利用输入流的阻塞来模拟

System.in.read();

}

}

分别以这种方式运行另外两个服务。在dubbo管控台可以看到:

集群容错测试

服务集群对消费者来说是透明的,消费者只需注明注册中心和需要的服务即可,无需关注服务是单节点还是集群。因为在同一台机子上测试,将消费者的端口改为20883

<!--\mcweb\mcweb-web\src\main\resources\spring\dubbo-consumer.xml-->

<dubbo:protocol ame="dubbo" port="20883"/>

现在我们来运行消费者。

<!--\mcweb\mcweb-web\src\main\java\com\mcweb\web\test\DubboConsumerStart.java-->

public class DubboConsumerStart {

public static void main(String[] args) throws Exception {

ApplicationContext ctx=new

ClassPathXmlApplicationContext("classpath*:spring/applicationContext.xml");

System.out.println("mcweb-web消费者已启动...");

for(int i=0; i<1000;i++) {

IUserService userService=(IUserService) ctx.getBean("userService");

User user = userService.query("testid");

System.out.println(i + ":" + user.getUserName());

Thread.sleep(1000);

}

}

}

运行结果:

...

10:Get user from mcweb-logic-b

11:Get user from mcweb-logic

12:Get user from mcweb-logic-a

13:Get user from mcweb-logic-b

14:Get user from mcweb-logic-a

15:Get user from mcweb-logic

16:Get user from mcweb-logic

17:Get user from mcweb-logic

18:Get user from mcweb-logic-b

19:Get user from mcweb-logic

20:Get user from mcweb-logic

...

可见,默认情况下,dubbo服务集群是带有负载均衡的(默认为random算法随机调用),集群中的服务被均匀的调用,在cluster="failover"模式下,当调用失败时,会尝试调用其他服务器。昆明Java培训机构的老师发现可以在dubbo管控台中对服务进行“倍权”,“半权”,“禁用”等操作观察消费者的调用情况。

上一篇:dubbo服务的启动检查
下一篇:dubbo服务的负载均衡

dubbo服务的线程模型

dubbo服务的负载均衡

dubbo服务的集群容错

dubbo服务的启动检查

选择城市和中心
贵州省

广西省

海南省

台湾