网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边
来自官方文档的介绍
虚线和实线 虚线表示异步,实线表示同步。异步不阻塞线程,性能高。同步阻塞线程必须等待响应结果才能继续执行,性能相对较低Provider 提供者。编写持久层和事务代码Container 容器(Spring容器),Dubbo完全基于Spring实现的Registry 注册中心。放置所有Provider对外提供的信息。包含Provider的IP,访问端口,访问遵守的协议,对外提供的接口,接口中有哪些方法等相关信息。Consumer 消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以报页面等)。调用XXXXServiceImpl中的方法。Monitor 监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发送给Monitor,有Monitor进行统计
Dubbo协议(官方推荐协议) 优点:
采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) 缺点:
大文件上传时,可能出现问题(不使用Dubbo文件上传)RMI(Remote Method Invocation)协议 优点:
JDK自带的能力 缺点:
偶尔连接失败Hessian协议 优点:
可与Hessian互操作,基于HTTP协议 缺点:
需hessian.jar支持,http短连接开销大
Zookeeper(官方推荐) 优点:
支持分布式,有很多周边产品 缺点:
受限于Zookeeper软件的稳定性,Zookeeper专门分布式辅助软件,稳定较优Multicast 优点:
去中心化,不需要单独安装软件 缺点:
2.2.1Provider和Consumer和Registry不能跨机房(路由)Redis 优点:
支持集群,性能高 缺点:
要求服务器时间同步,否则可能出现集群失败问题Simple 优点:
标准RPC服务,没有兼容问题 缺点:
不支持集群
一、快速入门
1、Provider提供者
创建Maven项目,作为父工程,引入依赖(这张图片两个spring boot的依赖没加版本号,会影响后面子模块的继承,代码中补上了)
< parent>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- parent< / artifactId>
< version> 2.5 .3 < / version>
< / parent>
< ! -- 放到dependencyManagement,是因为这些依赖是给子项目用的,父项目不用-- >
< dependencyManagement>
< dependencies>
< ! -- Spring boot不带web依赖,不会提供端口,因为一些-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter< / artifactId>
< version> 2.5 .3 < / version>
< / dependency>
< ! -- Spirng boot带web,会自动提供端口-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- web< / artifactId>
< version> 2.5 .3 < / version>
< / dependency>
< ! -- Dubbo 整合-- >
< dependency>
< groupId> org. apache. dubbo< / groupId>
< artifactId> dubbo- spring- boot- starter< / artifactId>
< version> 2.7 .3 < / version>
< / dependency>
< ! -- Zookeeper 整合-- >
< dependency>
< groupId> org. apache. curator< / groupId>
< artifactId> curator- recipes< / artifactId>
< version> 4.2 .0 < / version>
< / dependency>
< dependency>
< groupId> org. apache. curator< / groupId>
< artifactId> curator- framework< / artifactId>
< version> 4.2 .0 < / version>
< / dependency>
< / dependencies>
< / dependencyManagement>
创建子项目api,用于编写所以对外提供的接口,方便远程调用 注意看这里的包名,用dubbo区分一下,因为日后很多类,最好把和dubbo相关的都放到dubbo包中 > 3. 新建子模块provider提供者>
编写pom文件 编写接口实现类
import com. yzpnb. dubbo. service. DemoDubboService ;
import org. apache. dubbo. config. annotation. Service ;
@Service
public class DemoDubboServiceImpl implements DemoDubboService {
@Override
public String demo ( String param) {
System . out. println ( "执行了demo" ) ;
return param + " i'm demo" ;
}
}
编写启动类
import org. apache. dubbo. config. spring. context. annotation. EnableDubbo ;
import org. springframework. boot. SpringApplication ;
import org. springframework. boot. autoconfigure. SpringBootApplication ;
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main ( String [ ] args) {
SpringApplication . run ( ProviderApplication . class , args) ;
}
}
编写yaml配置文件
dubbo :
application :
name : dubbo- provider
registry :
address : zookeeper: //192.168.10.105: 2181
protocol :
port : 20884
2、Consumer消费者,这就是个spring boot模块,用于消费前面我们写的Dubbo代码的东西
创建子模块,引入依赖 编写接口和实现类
import com. yzpnb. dubbo. service. DemoDubboService ;
import com. yzpnb. service. DemoService ;
import org. apache. dubbo. config. annotation. Reference ;
import org. springframework. stereotype. Service ;
@Service
public class DemoServiceImpl implements DemoService {
@Reference
private DemoDubboService demoDubboService;
@Override
public String demoConsumer ( ) {
return demoDubboService. demo ( "Hello,I'm Consumer!!!" ) ;
}
}
编写启动类 编写Controller 配置文件
3. 运行测试
启动provider然后启动consumer 浏览器访问 分析 容易出错的地方
引错包,和dubbo有关的都是apace的包,不要引错,尤其是不要引成alibaba的包 @Service注解,在provider中是dubbo的包中的,不是spring中的 Zookeeper地址输入一定要正确,ip地址一定要能访问到,无论是你的云服务器还是虚拟机ip地址
5. 设置负载均衡策略以及权重
设置负载均衡策略为轮询,就是集群中每个机器都平均的处理请求
@Reference ( loadbalance = "roundrobin" )
设置权重(数值越大,处理的请求越多)
@Service ( weight = 4 )
二、案例实践(上面的快速入门Demo直接拿来用)
1、环境搭建
创建数据库,数据表
create table dept(
id int ( 11 ) primary key auto_increment ,
name varchar ( 20 )
) ;
insert into dept values ( default , '开发部' ) ;
insert into dept values ( default , '产品部' ) ;
create table emp(
id int ( 11 ) primary key auto_increment ,
name varchar ( 20 ) ,
photo varchar ( 200 ) ,
did int ( 11 ) ,
Constraint fk_emp_dept Foreign key ( did) References dept( id)
) ;
父工程依赖(先注释掉所有引用自己模块的依赖,等所有maven依赖引入完成,再解除注释)
< parent>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- parent< / artifactId>
< version> 2.5 .3 < / version>
< / parent>
< ! -- 放到dependencyManagement,是因为这些依赖是给子项目用的,父项目不用-- >
< dependencyManagement>
< dependencies>
< ! -- Spring boot不带web依赖,不会提供端口,因为一些-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter< / artifactId>
< version> 2.5 .3 < / version>
< / dependency>
< ! -- Spirng boot带web,会自动提供端口-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- web< / artifactId>
< version> 2.5 .3 < / version>
< / dependency>
< ! -- thymeleaf 模板依赖-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- thymeleaf< / artifactId>
< version> 2.5 .3 < / version>
< / dependency>
< ! -- myBatis -- >
< dependency>
< groupId> org. mybatis. spring. boot< / groupId>
< artifactId> mybatis- spring- boot- starter< / artifactId>
< version> 1.3 .2 < / version>
< / dependency>
< ! -- mysql-- >
< dependency>
< groupId> mysql< / groupId>
< artifactId> mysql- connector- java< / artifactId>
< version> 8.0 .19 < / version>
< / dependency>
< ! -- apace commons工具-- >
< dependency>
< groupId> commons- io< / groupId>
< artifactId> commons- io< / artifactId>
< version> 2.11 .0 < / version>
< / dependency>
< ! -- Dubbo 整合-- >
< dependency>
< groupId> org. apache. dubbo< / groupId>
< artifactId> dubbo- spring- boot- starter< / artifactId>
< version> 2.7 .3 < / version>
< / dependency>
< ! -- Zookeeper 整合-- >
< dependency>
< groupId> org. apache. curator< / groupId>
< artifactId> curator- recipes< / artifactId>
< version> 4.2 .0 < / version>
< / dependency>
< dependency>
< groupId> org. apache. curator< / groupId>
< artifactId> curator- framework< / artifactId>
< version> 4.2 .0 < / version>
< / dependency>
< / dependencies>
< / dependencyManagement>
创建子模块pojo,用来存放所有实体类,对应数据库的实体类 创建mapper子模块操作数据库,引入依赖
创建service接口 mapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
< mapper namespace = " com.yzpnb.mapper.DeptMapper" >
</ mapper>
配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dubbo_demo?serverTimezone=CST&useUnicode=true&characterEncoding=utf-8&useSSL=false #?后面参数表示时区,非常重要
username: root
password: 123456
# MyBatis
mybatis:
# 搜索指定包别名
type-handlers-package: com.yzpnb.pojo
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mybatis/*Mapper.xml
api子项目 依赖
provider子项目
依赖
< dependencies>
< dependency>
< groupId> com. yzpnb< / groupId>
< artifactId> api< / artifactId>
< version> 1.0 - SNAPSHOT< / version>
< / dependency>
< ! -- Spring boot不带web依赖,不会提供端口,因为一些-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter< / artifactId>
< / dependency>
< ! -- Dubbo 整合-- >
< dependency>
< groupId> org. apache. dubbo< / groupId>
< artifactId> dubbo- spring- boot- starter< / artifactId>
< / dependency>
< ! -- Zookeeper 整合-- >
< dependency>
< groupId> org. apache. curator< / groupId>
< artifactId> curator- recipes< / artifactId>
< / dependency>
< dependency>
< groupId> org. apache. curator< / groupId>
< artifactId> curator- framework< / artifactId>
< / dependency>
< / dependencies>
启动类 配置文件
spring :
profiles :
active : mybatis
dept子模块,专门提供对部门的操作,这个就是前面讲的Consumer消费者
配置文件 启动类(和快速入门consumer一样,就是注解中加一个取消扫描数据源的参数)
@SpringBootApplication ( exclude= { DataSourceAutoConfiguration . class } )
emp模块 和 dept模块相同,就不演示了,注意配置文件里,在dubbo注册的名字要改一下
2. 部门dept模块业务代码(代码简单,就不贴出代码块了)
mapper api中提供远程调用接口 provider中实现api远程调用接口 编写dept代码,消费provider提供的接口
至于后面的功能大家自己实现吧,本文主要讲解Dubbo的代码,按照上面流程写就行了,日后开发,也是这样的流程