1、Dobbo概念
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。
致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA|服务治理方案。
官网: http://dubbo.apache.org
2、Zookeeper安装并连接
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
xmlns:dobbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- <context:component-scan base-package="com.shun.service"/>-->
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dobbo-service"/>
<!--2.配置注册中心的地址-->
<dobbo:registry address="zookeeper://124.222.157.9:2181"/>
<!--3.配置dubbo包扫描-->
<dubbo:annotation package="com.shun.service.impl"/>
</beans>
解压zookeeper的tar包
修改zoo_sample.cfg为zoo.cfg并更改数据存放位置
dataDir=/opt/zkdata
启动方式,在bin路径下用./zkService.sh start 启动
3、快速入门
提取公共接口进行调用
dubbo架构
3、duboo的高级特性
dubbo-admin
dubbo-admin管理平台,是图形化的服务管理页面
从注册中心中获取到所有的提供者/消费者进行配置管理
路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能
dubbo-admin是一个前后端分离的项目。前端使用vue后端使用springboot
安装dubbo-admin其实就是部署该项目
4、dubbo序列化
5、地址缓存
注册中心挂了,服务是否可以正常访问?
可以,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
当服务提供者地址发生变化时,注册中心会通知服务消费者。
6、dubbo超时与重试
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。
单用户单线程
多用户多线程
在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
dubbo利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。使用timeout属性配置超时时间,默认值1000,单位毫秒。
服务的提供方
package com.shun.service.impl;
import com.shun.pojo.User;
import com.shun.service.UserService;
import org.apache.dubbo.config.annotation.Service;
//@Service//将该类的对象创建出来,放到Spring的IOC容器中 bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(timeout = 3000,retries = 2)//当前服务3秒超时,重试2次,一共3次
public class UserServiceImpl implements UserService {
int i = 1;
public String sayHello() {
return "hello shun dubbo";
}
public User userById(int id) {
System.out.println("服务被调用了:"+i++);
//查询User对象
User user = new User(1,"zhangsan","123");
//数据库查询很慢,查了5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return user;
}
}
服务的消费方
package com.itheima.controller;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
//注入Service
//@Autowired//本地注入
/*
1. 从zookeeper注册中心获取userService的访问url
2. 进行远程调用RPC
3. 将结果封装为一个代理对象。给变量赋值
*/
@Reference(timeout = 1000)//远程注入
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
/**
* 根据id查询用户信息
* @param id
* @return
*/
int i = 1;
@RequestMapping("/find")
public User find(int id){
new Thread(new Runnable() {
public void run() {
while (true){
System.out.println(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return userService.findUserById(id);
}
}
7、dubbo多版本
@Reference(version = "v2.0")//远程注入
private UserService userService;
@Service(version = "v1.0")//当前服务3秒超时,重试2次,一共3次
public class UserServiceImpl implements UserService {}
@Service(version = "v2.0")//当前服务3秒超时,重试2次,一共3次
public class UserServiceImpl2 implements UserService {
8、负载均衡
@Reference(loadbalance = "random")//远程注入
private UserService userService;
@Service(weight = 100)
public class UserServiceImpl implements UserService {
@Service(weight = 200)
public class UserServiceImpl implements UserService {
9、集群容错
@Reference(cluster = "failover")//远程注入
private UserService userService;