本篇主要讲一下Dubbo服务框架和Zookeeper的使用
Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
一、SOA
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来
二、RPC协议
RPC是远程过程调用(Remote Procedure Call)的缩写形式,实现系统之间的通信,用户不需要了解底层原理
2.1 RPC与HTTP区别
网络7层协议如图所示
层级关系与对应的协议
区别 :
- RPC是传输层协议(4层).而HTTP协议是应用层协议(7层).
- RPC协议可以直接调用中立接口,HTTP协议不可以.
- RPC通信协议是长链接,HTTP协议一般采用短连接需要3次握手(可以配置长链接添加请求头Keep-Alive: timeout=20).(长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。)
- RPC协议传递数据是加密压缩传输.HTTP协议需要传递大量的请求头信息.
- RPC协议一般都有注册中心.有丰富的监控机制.
三、注册中心
1.1 传统程序调用存在的问题
虽然nginx可以实现tomcat服务器高可用,但是如果后期需要扩展/更新服务器数量时,需要手动的修改Nginx的配置文件.并且重启服务器.需要人为的干预
1.2 注册中心实现原理
具体实现步骤:
当服务生产者(提供者)启动时会将自己的服务信息(服务名称/IP/PORT),写入注册中心.
注册中心当接收到用户服务数据时会动态的维护服务列表数据.
当服务消费者启动时会连接注册中心.获取全部的服务列表数据并且保存到本地(本地内存).
当用户发起请求时,首先基于http协议访问服务的消费者.服务消费者根据用户服务请求利用负载均衡策略发起请求访问服务提供者.
如果后台服务提供者宕机,注册中心自己有心跳检测机制.发现后台服务器宕机,首先会维护自己的服务列表数据(树形结构).之后全网广播通知服务消费者更新服务列表.
四、Zookeeper
Zookeeper负责服务的协调调度.当客户端发起请求时,返回正确的服务器地址
4.1 Zookeeper-linux安装
需要JDK1.8
上传安装文件 : zookeeper-3.4.8.tar.gz
解压目录 :
tar -xvf zookeeper-3.4.8.tar.gz
修改文件夹名 :
mv zookeeper-3.4.8 zookeeper
4.2 修改配置文件
在zookeeper根目录下创建文件夹data/log :
mkdir data log
在conf目录下修改配置文件并且修改名称 :
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
,如下图
4.3 zookeeper启动等命令
进入bin目录下 :
启动 :
sh zkServer.sh start
或./zkServer.sh start
关闭 :
sh zkServer.sh stop
查看状态 :
sh zkServer.sh status
4.4 Zookeeper集群安装
在zookeeper根目录中创建新的文件夹
zkCluster
:mkdir zkCluster
创建zk1/zk2/zk3文件夹,在每个文件夹里创建data/log文件夹 :
mkdir {zk1,zk2,zk3}/{data,log}
添加myid文件 : 分别在zk1/zk2/zk3中的data文件夹中创建新的文件myid.其中的内容依次为1/2/3,与zk节点号对应
编辑配置文件 : 将
zoo_sample.cfg
复制为zoo1.cfg之后修改配置文件
配置完成后将zoo1.cfg复制2份.之后需要修改对应的文件夹目录.和不同的端口即可
zookeeper集群启动
sh zkServer.sh start zoo1.cfg
sh zkServer.sh start zoo2.cfg
sh zkServer.sh start zoo3.cfg
检查主从关系,主/从机情况说明 :
sh zkServer.sh status zoo1/2/3.cfg
4.5 关于zookeeper集群说明
Zookeeper集群中leader负责监控集群状态,follower主要负责客户端链接获取服务列表信息.同时参与投票
三、dubbo 入门案例
接口类中,应用
dubbo提供者服务用于声明对外暴露服务
的@service
注解,而不是spring的
3.1 Dubbo提供者配置-YML
server:
port: 9000
spring:
datasource:
#引入druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#dubbo配置文件
dubbo:
scan:
basePackages: com.jl #定义包扫描
application:
name: provider-user #定义服务名称 必须添加
registry:
address: zookeeper://192.168.56.129:2181?backup=192.168.56.129:2182,192.168.56.129:2183
protocol:
name: dubbo
port: 20880 #端口号唯一
mybatis-plus:
type-aliases-package: com.jt.dubbo.pojo #配置别名包路径
mapper-locations: classpath:/mybatis/mappers/*.xml #添加mapper映射文件
configuration:
map-underscore-to-camel-case: true #开启驼峰映射规则
3.2 Dubbo消费者配置-YML
server:
port: 9001
dubbo:
scan:
basePackages: com.jl
application:
name: consumer-user
registry:
address: zookeeper://192.168.56.129:2181?backup=192.168.56.129:2182,192.168.56.129:2183
3.3 pom.xml 添加dubbo依赖
<!--引入dubbo配置 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
四、Dubbo负载均衡策略
负载均衡策略 | 说明 |
---|---|
random loadbalance | 安权重设置随机概率(默认) |
roundrobin loadbalance | 轮寻,按照公约后权重设置轮训比例 |
lastactive loadbalance | 最少活跃调用数,若相同则随机 |
consistenthash loadbalance | 一致性hash,相同参数的请求总是发送到同一提供者 |
案例 : 消费者调用接口方法,使用
@Reference
注解,timeout
重新获取时间,check
是否检查服务存在,最好关闭,避免消费者不法启动,loadbalance
为负载均衡策略
@Reference(timeout=3000,check=false,loadbalance = "random"/"roundrobin"/"leastactive"/"consistenthash")
private UserService userService;
五、Zookeeper 控制台搭建
5.1 导入dubbo控制台
本质是一个tomcat服务
5.2 修改配置
修改
tomcat-dubbo\webapps\ROOT\WEB-INF
目下的dubbo.properties
配置文件dubbo控制台的管理员登录用户名和密码都为
root
dubbo.registry.address=zookeeper://192.168.56.129:2181?backup=192.168.56.129:2182,192.168.56.129:2183
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
5.3 启动dubbo控制台
在
tomcat-dubbo\conf\server.xml
查的端口号为 : 8090运行
bin\startup.bat
打开浏览器 :
localhost:8090/
六、关于dubbo端口说明
zookeeper端口号 : 2181/2182/2183
zookeeper通信端口 : 2887/2888/2889
zookeeper选举端口 : 3887/3888/3889
Dubbo框架:
- PRC协议动态获取:20880(配置文件手动编辑)
- 消费者和提供者通信靠PRC:port
随手笔记
1.nginx与dubbo负载均衡机制区别
nginx是服务端负载均衡,所有的请求都会由nginx实现负载,反向代理
ubbo采用客户端负载均衡机制,并且是正向代理
2.@Reference
使用@Reference注解, timeout重新获取时间,check是否检查服务存在,最好关闭,避免消费者不法启动,loadbalance为负载均衡策略
用于dubbo消费者服务指明引用哪个提供者接口服务
- 可以定义在类中的一个字段上,也可以定义在一个方法上,甚至可以用来修饰另一个 annotation,表示一个服务的引用。通常 @Reference 定义在一个字段上
- interfaceClass:指定服务的 interface 的类
- interfaceName:指定服务的 interface 的类名
- version:指定服务的版本号
- group:指定服务的分组
- url:通过指定服务提供方的 URL 地址直接绕过注册中心发起调用
- application:应用配置
- module:模块配置
- consumer:服务消费方配置
- protocol:协议配置
- monitor:监控中心配置
- registry:注册中心配置
3.linux 命令
在每个文件夹里创建两个文件 : mkdir {s1,s2,s3}/{a1,a2}
4.面试题 Zookeeper是如何存储数据
5.Dubbo
转载:传送门
5.1 Dubbo 和 Spring Cloud 区别
通信方式不同:Dubbo 使用的是 RPC 通信,而Spring Cloud 使用的是HTTP RESTFul 方式。
组成不一样:
(1)dubbo的服务注册中心为Zookeerper,服务监控中心为dubbo-monitor,无消息总线,服务跟踪、批量任务等组件;
(2)spring-cloud的服务注册中心为spring-cloud netflix enruka,服务监控中心为spring-boot admin,有消息总线,数据流、服务跟踪、批量任务等组件;
5.2 Dubbo里面的节点角色
- provide:暴露服务的服务提供方
- consumer:调用远程服务的服务消费方
- registry:服务注册于发现的注册中心
- monitor:统计服务调用次数和调用时间的监控中心
- container:服务运行容器
6.关于项目常见报错
6.1 Redis启动报错
报错信息:
redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
报错原因:
- IP地址不正确.
- Redis集群宕机 检测:
set aa aa
是否正确- 防火墙没关
service iptables stop
6.2 缓存服务问题
商品信息不能正确展现
检查:
- 检查业务调用是否正确.!
debug
- 可能是将空串存入缓存 :
redis.set(key,"")
解决方法:将redis集群数据全部清空.
6.3 Zookeeper问题
重要事项:
- 实现类采用Service注解注意包路径
- 消费者注入接口时保证注入Dubbo接口. @Reference
- 注意YML配置文件 IP地址.
- 先启动服务提供者/之后启动消费者
关于热部署引发问题:
由于tomcat服务器热部署的因素.导致后台提供者启动了多次.中zookeeper中形成多条一致的记录