Zookeeper是什么?
一个分布式服务框架。用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。简言之,zookeeper=文件系统+监听通知机制
1.zookeeper的安装
cd /data/software
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
tar -zxvf zookeeper-3.4.12.tar.gz
cp -r zookeeper-3.4.12 /opt/zookeeper
mkdir -p /web/zookeeper/snapshot/ #放置zookeeper快照
mkdir -p /web/zookeeper/logs/ #放置zookeeper日志
echo '1' > /web/zookeeper/snapshot/myid
2.配置zookeeper
(1)修改zoo.cfg文件
# 心跳间隔时间,单位是毫秒
tickTime=2000
# 表示集群中连接到 Leader 的 Follower 服务器初始化连接时最长能忍受多少个心跳时间间隔数,当已
# 经超过 5个心跳的时间(也就是 tickTime)长度后leader还没有收到follow的返回信息,那么表明这
# 个连接失败。总的时间长度就是 5*2000=10 秒
initLimit=5
# Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,# 总的时间长度就是 2*2000=4秒
syncLimit=2
# Zookeeper 保存数据的目录,若不配置dataLogDir,Zookeeper将写数据的日志文件也保存在这个目录里
dataDir=/web/zookeeper/snapshot
# Zookeeper 将写数据的日志文件指定了路径
dataLogDir=/web/zookeeper/logs/
# 客户端连接zookeeper服务器的端口号
clientPort=2181
maxClientCnxns=1000
autopurge.purgeInterval=48
autopurge.snapRetainCount=10
server.1=node36104:2888:3888 #2888表示Flower跟Leader的通信端口,简称服务端内部通信的端口(默认#2888)3888是选举端口(默认是3888)
server.2=node37203:2888:3888
server.4=node39177:2888:3888
配置节点数据:
先进入zookeeper客户端:cd /opt/zookeeper/bin/ ./zkCli.sh 进入
ls / 查看节点集
create /production/rmw "" 创建子节点 ,必须带值,若没有值,就传空字符串
2888是zookeeper的监控端口,可以看是否有链接
./zkServer.sh start 启动服务
./zkServer.sh stop 停止服务
./zkServer.sh restart 重启服务
./zkServer.sh status 查看状态
若系统reboot后需要关防火墙
节点号一般放在zoo.cfg中配置的dataDir路径下的myid中
启动zookeeper,zookeeper安装完成
2.dubbo在项目中的配置及相关管理平台的安装
(1)首先配置一个dubbo-admin管理平台:平台样子如下
平台配置步骤:
- https://github.com/apache/dubbo ——> 找到dubbo-admin发布页面 https://github.com/apache/dubbo-admin/tree/master
- 将其download并解压:介绍一下解压出来的这几个包:dubbo-admin 是dubbo可视化管理平台、dubbo-monitor-simple是dubbo一个简易的监控平台、dubbo-registry是dubbo自带的注册中心(我们使用zookeeper来代替)
- 因为dubbo-admin是一个maven结构的spring-boot工程,因此使用打包命令将其打成jar包直接运行即可
- 进入dubbo-admin目录下,然后打开cmd窗口,执行命令:mvn clean package,去dubbo-admin/target下查看会发现打包好的admin项目。
- 在cmd中jar包同级目录下继续执行命令:java -jar jar包名。这样就相当于启动了项目中内嵌的tomcat容器
- 这里注意一下:配置文件路径:$DUBBO-ADMIN/src/main/resources/application.properties可以自行更改其中的配置参数
配置参数如下:
server.port=7001 # 这是管理台的访问端口
spring.velocity.cache=false
spring.velocity.charset=UTF-8
spring.velocity.layout-url=/templates/default.vm
spring.messages.fallback-to-system-locale=false
spring.messages.basename=i18n/message
spring.root.password=root #这是登录管理台的密码,用户名为root
spring.guest.password=guest
dubbo.registry.address=zookeeper://127.0.0.1:2181 #这是dubbo默认的注册中心地址,因为zookeeper配置到了同一台服务器中,因此这里设置成127.0.0.1 ,端口默认2181
- 访问平台:http://ip:7001 查看是否安装成功
(2)将dubbo配置到项目中。
首先在作为服务提供者的项目中配置dubbo 服务提供者配置文件,例如dubbo-provider.xml:如果项目是spring-boot项目,可以将配置内容放置到application.properties里。
下面是dubbo配置文件的优先级策略:dubbo.xml及application.properties是同优先级。dubbo.properties是dubbo里默认的配置文件,但优先级最低。
-D是JVM启动时的VM arguments,启动时指定参数的意思,如下所示:
<!--dubbo-provider.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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--1.指定当前服务/应用的名字(不要与其他服务同名)-->
<dubbo:application name="user-service-provider"></dubbo:application>
<!--2.指定注册中心的位置-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
<!--3.指定通信规则(通信协议?通信端口)-->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
<!--4.暴露服务-->
<dubbo:service interface="com.duoduo.gmall.service.UserService" ref="userServiceImpl"></dubbo:service>
<!--5.服务的实现-->
<bean id="userServiceImpl" class="com.duoduo.gmall.service.impl.UserServiceImpl"></bean>
<!--6.监控中心-->
<dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>
#application.properties文件
dubbo.application.name=user-service-provider
dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.monitor.protocol=registry
dubbo 消费者配置文件:
<?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://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"
>
<!--spring bean的自动装配 指定要扫描的路径-->
<context:component-scan base-package="com.duoduo.gmall.service.impl"></context:component-scan>
<!--1.指定当前消费者的名字(不要与其他消费者同名)-->
<dubbo:application name="order-service-consumer"></dubbo:application>
<!--2.指定注册中心的位置-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
<!--3.指定通信规则(通信协议?通信端口)在消费者端不需要配置-->
<!--<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>-->
<!--4.声明需要调用的远程服务接口;生成远程服务代理 在消费者端需要配置 check=false启动时不检查远程服务是否存在或有效-->
<dubbo:reference interface="com.duoduo.gmall.service.UserService" id="userService" check="false" timeout="3000"></dubbo:reference>
<!--4.暴露服务 在消费者端不需要配置-->
<!--<dubbo:service interface="com.duoduo.gmall.service.UserService" ref="userServiceImpl"></dubbo:service>-->
<!--5.服务的实现 在消费者端不需要配置-->
<!--<bean id="userServiceImpl" class="com.duoduo.gmall.service.impl.UserServiceImpl"></bean>-->
<!--6.连监控中心 两种写法-->
<!--<dubbo:monitor protocol="registry"></dubbo:monitor> 表示从注册中心发现监控中心地址,否则直连监控中心。-->
<dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor><!--直连监控地址-->
</beans>
(1)关于timeout:消费者配置端的reference配置里可以配置timeout,表示如果调用服务在规定时间内没有响应则报timeout异常。如果不配,则遵照dubbo:consumer中的timeout参数值,如果consumer没有配置,则默认值是1000,单位缺省为ms
消费者方法级timeout > 服务方方法级timeout > 消费者接口级timeout > 服务方接口级timeout > 全局消费者timeout > 全局服务方timeout
(2)关于retries参数
重试次数,不包括第一次请求。
(3)关于灰度发布
3.dubbo与spring-boot整合:
1、导入依赖;
1)、导入dubbo-starter
2)、导入dubbo的其他依赖
2、SpringBoot与dubbo整合的三种方式:
* 1)、导入dubbo-starter,在application.properties配置属性,使用@Service【暴露服务】使用@Reference【引用服务】
* 2)、保留dubbo xml配置文件;
* 导入dubbo-starter,使用@ImportResource导入dubbo的配置文件即可
* 3)、使用注解API的方式:
* 将每一个组件手动创建到容器中,让dubbo来扫描其他的组件
4.关于dubbo的容错机制
.
dubbo负载策略:random(随机),roundrobin(随机),leastactive(最少活跃度),consistanthash(一致性hash算法),此外还可以配置每个服务的权重。
(1)服务降级
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
(2)集群容错
两种方式:
第一种方式:是用dubbo自带的集群容错方案:
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
-
failover cluster 模式
失败自动切换,自动重试其他机器,默认就是这个,常见于读操作。(失败重试其它机器)
-
failfast cluster模式
一次调用失败就立即失败,常见于写操作。(调用失败就立即失败)
-
failsafe cluster 模式
出现异常时忽略掉,常用于不重要的接口调用,比如记录日志。
-
failback cluster 模式
失败了后台自动记录请求,然后定时重发,比较适合于写消息队列这种。
-
forking cluster 模式
并行调用多个 provider,只要一个成功就立即返回。
-
broadcacst cluster
逐个调用所有的 provider。
配置方法:
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />
第二种方式:与spring-cloud的hystrix(断路器组件)整合
首先在spring-boot工程的pom中加入hystrix依赖:在provider和consumer中都要加入该依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
对于provider:
其次要开启容错组件,在程序入口处标注
然后在具体提供的服务方法标注容错标识,这里可以看到模拟了一个出错率50%的调用场景,目的在于消费者在调用失败时可以自定义异常处理方法。
对于consumer:
对于具体调用需要容错的服务的方法前标注容错标识,并说明如果失败具体要调用的方法名
并在此类中定义该hello方法