Dubbo和Zookeeper建立分布式入门

Dubbo:一款java所属的RPC框架。
RPC:remote procedure call(远程过程调用),即一个服务器的应用想调用另一个服务器的应用(由于不在同一个内存,无法直接调用)执行的方法的过程。
Duboo的三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。
Dubbo内部架构图如下:Dubbo和Zookeeper建立分布式入门_第1张图片
节点说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器

调用关系说明:
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

入门案例操作开始:
先要安装Zookeeper,只需解压到非中文路径即可,注意,zookeeper端口为2181,务必不要被占用。
然后要创建服务提供者和服务消费者,即:提供service具体业务的service项目、和web层直接使用该业务的项目,两者均需要定为web工程。

创建服务提供者:
编写HelloService和其实现类:

package com.fh.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.fh.service.HelloService;
//本service为dubbo内的service,interfaceClass为本service类的接口,loadbalance为其负载均衡方式,roundrobin为轮询负载,可设定权重。具体方式可采用dubbo的监视器页面,用root账户登录进行权重调整。
@Service(interfaceClass = HelloService.class,loadbalance = "roundrobin")
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

编写web.xml:




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



编写dubbo配置文件:



        
    
    
    
    
    
    
    
    

创建服务消费者:
编写HelloService接口,无需实现类,且无需注册到spring中:

package com.fh.service;

public interface HelloService {	      //服务消费者中,方法内的格式必须与服务提供者一样
    String sayHello(String name);
}

编写HelloController:

package com.fh.web.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.fh.service.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @Reference(timeout = 5000)      //该注解将同样注册在dubbo中的服务提供者的helloService指向此处,消费者和提供者传递的关键
    //此处timeout设置的为服务消费者接收到服务提供者允许的最大超时时间,超过该时间,则会报超时错误,这个值对于debug过程中的调试时间有着要求,service内业务的debug时间大于该值则不行
    private HelloService helloService;

    @RequestMapping("/hello")
    @ResponseBody
    public String hello(String name) {      //服务消费者中,方法内的格式必须与服务提供者一样
        return helloService.sayHello(name);
    }
}

编写springmvc相关的web.xml的配置文件:




  
  
      dispatcherServlet
      org.springframework.web.servlet.DispatcherServlet
      
          contextConfigLocation
          classpath:applicationContext-web.xml
      
      1
  
  
      dispatcherServlet
      *.do
  

  
  
      characterEncodingFilter
      org.springframework.web.filter.CharacterEncodingFilter
      
          encoding
          utf-8
      
  
  
      characterEncodingFilter
      /*
  


编写消费者的springmvc配置文件:



        
    
    
    
    
    
    
    
    
    
    
    
    

创建步骤完成,准备启动。

tomcat的创建:
分别对服务提供者和服务消费者创建tomcat,确保设置不同的端口。同时,可以再创建第三个tomcat,设置新端口,并引入dubbo-admin的war包,创建监控器用以查看。
在启动服务提供者、服务消费者、监控器之前,需优先启动ZooKeeper。

且一般上线阶段才会将服务提供者运行在tomcat上,开发阶段都是在服务提供者内创建测试类:

package com.fh.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class TestDemo {
    public static void main(String[] args) throws IOException {
        //读取配置文件,创建服务运行容器applicationContext-dubbo和applicationContext-tx
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:spring/applicationContext-*.xml");
        //开启applicationContext-dubbo和applicationContext-tx容器,applicationContext-dubbo的开启会启动服务提供者
        applicationContext.start();
        //设置在控制台按任意键退出,目的是为了pause卡主容器,让服务提供者一直保持开启状态
        System.in.read();
    }
}

在修改服务提供者的暴露端口()的情况下,服务提供者可以进行多次启动,达到多个服务提供者同时的共同运行。

你可能感兴趣的:(Dubbo和Zookeeper建立分布式入门)