Zookeeper+dubbo的搭建和使用

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管理平台:平台样子如下

平台配置步骤: 

  • 因为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方法

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值