Dubbo:一款java所属的RPC框架。
RPC:remote procedure call(远程过程调用),即一个服务器的应用想调用另一个服务器的应用(由于不在同一个内存,无法直接调用)执行的方法的过程。
Duboo的三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。
Dubbo内部架构图如下:
节点说明
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();
}
}
在修改服务提供者的暴露端口(