dubbo+zookeeper的使用配置详解

1 篇文章 1 订阅
1 篇文章 0 订阅

dubbo+zookeeper的使用配置详解

在现在众多电商、app横行的时代,基本都用到了分布式。而在众多rpc框架中dubbo是最好的选择。dubbo推荐的注册中心是zookeeper,这两个东西一般配合使用。下面开始讲解他们的使用和配置。

一、ssm项目使用dubbo

大家都知道ssm项目使用的是xml文件进行配置。所以可以在resources下新建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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
           http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!-- 指定当前服务的名字(同样的服务名字相同,不要和别的服务同名) -->
<dubbo:application name="user-service-provider"></dubbo:application>

    <!-- 指定注册中心的位置 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>

    <!-- 指定通信规则(通信协议和通信端口) -->
    <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>

    <!-- 暴露服务 -->
    <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl" version="1.0.0"></dubbo:service>
    <!-- 将服务的实现交给spring容器管理 -->
    <bean id="userServiceImpl" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>

    <!-- 暴露服务 -->
    <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl2" version="2.0.0"></dubbo:service>
    <!-- 将服务的实现交给spring容器管理 -->
    <bean id="userServiceImpl2" class="com.atguigu.gmall.service.impl.UserServiceImpl2"></bean>

    <!-- 指定监控中心,registry意为通过注册中心自动寻找监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>

下面贴出相应的消费者配置文件代码:

<?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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
           http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 扫描impl包中的注解 -->
    <context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan>

    <!-- 配置消费者服务名称 -->
    <dubbo:application name="order-service-consumer"></dubbo:application>

    <!-- 配置注册中心地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>

    <!-- 对于接口配置,两个要点
        1)、精确优先(方法级优先,接口级次之,全局配置再次之)
        2)、消费者设置优先(如果级别一样,则消费者优先,提供方次之)
    -->
    <!-- timeout:超时设置,默认时间为1s -->
    <!-- retries:重试次数,不包含第一次调用
        超时设置遵循幂等设计:幂等(重复调用多次跟调用一次一样,设置重试次数。如查询、删除、修改)
                            非幂等(重复调用会造成不一样的结果,不设置重试次数。如新增)
    -->
    <!-- 声明需要调用的远程服务的接口,生成远程服务代理 -->
    <dubbo:reference interface="com.atguigu.gmall.service.UserService" id="userService" timeout="1000" retries="3" version="*">
        <dubbo:method name="getUserAddressList" timeout="5000"></dubbo:method>
    </dubbo:reference>

    <!-- dubbo:consumer为dubbo:interface的通用配置 -->
    <dubbo:consumer check="false" timeout="2000"></dubbo:consumer>

    <!-- 指定监控中心,registry意为通过注册中心自动寻找监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>

二、springboot使用dubbo

springboot使用dubbo有三种方式,下面一一给大家解释。

1.使用xml文件配置
这种方式跟ssm整合dubbo一样,配置文件内容不变,将文件放到resources下。
在这里插入图片描述
但是要注意在启动类上使用@ImportResourcr注解加载该配置文件,如下图所示:
在这里插入图片描述

2.在application.properties配置dubbo信息
在这里插入图片描述
然后在提供者用dubbo的@Service注解暴露服务,在消费者用dubbo的@Reference从注册中心获取对象。具体如下图所示:

提供者
在这里插入图片描述
消费者
在这里插入图片描述
3.使用配置类方式
大家知道springboot的配置一般有两种方式,一种是在application.properties配置文件里配置,还有就是使用配置类的方式,其实两种方式是一样的,只不过写的地方不同,原理都是在容器中注入bean。你可以在你项目中合适的位置新建一个类名,下面贴出代码:

提供者

package com.atguigu.gmall.config;

import com.alibaba.dubbo.config.*;
import com.atguigu.gmall.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class MyDubboConfig {

    @Bean
    public ApplicationConfig applicationConfig(){
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("user-service-provider");
        return applicationConfig;
    }

    //    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
    @Bean
    public RegistryConfig registryConfig(){
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        return registryConfig;
    }

    @Bean
    public ProtocolConfig protocolConfig(){
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20880);
        return protocolConfig;
    }

//    <dubbo:reference interface="com.atguigu.gmall.service.UserService" id="userService" timeout="1000" retries="3" version="*">
//        <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
//    </dubbo:reference>
    @Bean
    public ServiceConfig<UserService> serviceConfig(UserService userService){
        ServiceConfig<UserService> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(UserService.class);
        serviceConfig.setRef(userService);
//        serviceConfig.setVersion("1.0.0");

        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getUserAddressList");
        methodConfig.setTimeout(2000);

        List<MethodConfig> methodList = new ArrayList<MethodConfig>();
        methodList.add(methodConfig);
        serviceConfig.setMethods(methodList);
        return serviceConfig;
    }

    @Bean
    public MonitorConfig monitorConfig(){
        MonitorConfig monitorConfig = new MonitorConfig();
        monitorConfig.setProtocol("registry");
        return monitorConfig;
    }
}

消费者

package com.atguigu.gmall.config;

import com.alibaba.dubbo.config.*;
import com.atguigu.gmall.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class MyDubboConfig {

    @Bean
    public ApplicationConfig applicationConfig(){
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("order-service-consumer");
        return applicationConfig;
    }

//    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
    @Bean
    public RegistryConfig registryConfig(){
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");
        return registryConfig;
    }

//    <dubbo:reference interface="com.atguigu.gmall.service.UserService" id="userService" timeout="1000" retries="3" version="*">
//        <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
//    </dubbo:reference>
    @Bean
    public ReferenceConfig<UserService> referenceConfig(UserService userService){
        ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<UserService>();
        referenceConfig.setInterface(UserService.class);
        referenceConfig.setId("userService");
        referenceConfig.setVersion("1.0.0");

        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getUserAddressList");
        methodConfig.setTimeout(1000);

        List<MethodConfig> methodList = new ArrayList<MethodConfig>();
        methodList.add(methodConfig);
        referenceConfig.setMethods(methodList);
        return referenceConfig;
    }

    @Bean
    public MonitorConfig monitorConfig(){
        MonitorConfig monitorConfig = new MonitorConfig();
        monitorConfig.setProtocol("registry");
        return monitorConfig;
    }
}

总结:大家可以看到springboot的三种方式中在application.properties配置是无法进行方法级别的配置。另外两种是一样的,除了写法没啥区别。个人比较推荐使用xml进行配置。至于原因嘛。我好像发现配置类的方式使用版本号配置并不生效,也有可能是我配置错误,当然使用哪种方式因人而异。在博文中如果有什么错误欢迎大家指正,评论。也欢迎大家评论交流。谢谢大家!!

另外在附上我在本文提到的四个项目的百度云地址。
链接:https://pan.baidu.com/s/1BsCEjtJIzoXxmwPH2y30Gg
提取码:u549

以及dubbo+zookeeper项目学习视频地址:https://www.bilibili.com/video/av30612478

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dubbo是一个高性能、轻量级的Java RPC框架,提供了完善的服务治理方案。而Zookeeper是一个分布式协调服务框架,主要用于解决分布式系统中的命名服务、配置管理、分布式锁和领导者选举等问题。DubboZookeeper在分布式系统中担任不同的角色,但也有协同作用,下面分别详细介绍。 Dubbo作为一款RPC框架,它能够将服务的提供者和消费者连接起来,通过网络实现方法的调用和数据的传输。Dubbo提供了众多的服务治理功能,包括负载均衡、容错机制、路由策略、服务降级、服务发布等等。通过Dubbo的服务治理功能,我们能够有效地管理服务的注册和发现,可以快速地调整服务的负载均衡策略和容错机制,以及实现服务的动态上下线等等。Dubbo通过Zookeeper实现服务的注册和发现,把服务的元数据发布到Zookeeper的节点上,供消费者进行订阅和发现。 Zookeeper作为分布式协调服务框架,主要用于解决分布式系统中的服务发现、配置管理、领导者选举、分布式锁等问题。Zookeeper通过维护一份树形结构的节点信息,实现了分布式环境下的数据一致性。在服务发现方面,Zookeeper通过维护服务的注册中心,记录所有可用的服务提供者和信息,为消费者提供服务的订阅和发现服务。在配置管理方面,我们可以将系统中的配置信息保存在Zookeeper上,让所有的服务消费者读取配置,以保持一致性。在领导者选举方面,Zookeeper可以通过节点的序列化和监听机制,保证多个节点进行Leader选举的唯一性。在分布式锁方面,Zookeeper可以通过节点的临时性和有序性实现分布式锁的功能。 综上,DubboZookeeper在分布式系统中具有不同的角色,但也有协同作用。Dubbo把服务的元数据发布到Zookeeper的节点上,供消费者进行订阅和发现,通过Dubbo的服务治理功能,可以有效地管理服务的注册和发现,快速调整服务的负载均衡和容错策略等等。而Zookeeper则负责维护分布式系统中的数据一致性,提供分布式环境下的服务发现、配置管理、领导者选举、分布式锁等基础设施服务,为Dubbo的服务治理提供数据支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值