Dubbo

本文详细介绍了Dubbo作为一个高性能的RPC框架,其主要功能包括远程方法调用、智能容错、负载均衡以及服务注册和发现。通过实例展示了服务提供者和消费者如何配置,强调了使用接口工程的重要性,并探讨了服务接口的粒度和版本控制。此外,还提到了使用Zookeeper作为注册中心的实践方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是分布式框架

分布式系统是若干独立系统的集合,但是用户用起来好像是在使用一个系统

必要性

规模的逐步夸大和业务的复杂,

架构演变

  • 单一架构,管理系统

  • 垂直应用架构,大业务拆分成小业务

  • 分布式架构,基于RPC:远程过程调用

Dubbo

Dubbo,是一个高性能的RPC框架,解决了分布式中的调度问题

性能高

是一个RPC框架,主要是远程过程调用,提升性能从最关键,最耗时的两个方面:序列化和网络通信

序列化:本地对象要在网络上进行传输,必须实现Serializable接口,也就是必须序列化,例如xml,json,二进制流…其中二进制流效率最高。Dubbo就是采用二进制

网络通信:不同于HTTP需要进行三次握手和四次挥手,Dubbo采用Socket通信机制,一步到位,提高了通信效率,并且可以建立长连接,不用反复链接。

dubbo概述

高性能 轻量级 开源的面向接口代理的RPC框架

三大核心功能:面向接口的远程方法调用智能容错负载均衡,以及服务的自动注册和发现

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,服务治理方案

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8ZgALJW-1622032572313)(D:\电子文件\java\ty-md\myMd\Picture\dubbo框架.png)]

服务提供者(Provider):暴漏服务的服务提供方

服务消费方(Consumer):调用远程服务的服务消费方

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,若果变更,注册中心将基于长连接推送变更数据给消费者

监控中心(Monitor):服务消费者和服务提供者,在内存中累计调用的次数和调用的时间,定时每分钟发送一次统计数据到监控中心

支持的协议

dubbo、hessian、rmi、webservice、http、thrift、memcached、redis(在4中)

dubbo官方推荐使用dubbo协议。默认端口是20880

直连方式

provider

1.创建一个maven  web工程;服务的提供者
2.创建一个实体bean查询的结果
3.提供一个服务接口:xxx
4.实现这个服务接口:xxx.impl
5.配置dubbo服务提供者的核心配置文件    
	a.声明dubbo服务提供者的核心名称:保证唯一    	
	b.声明dubbo使用的协议和端口号    
	c.暴露服务,使用直连方式
6.添加监听器
//web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dubbo-userservice-provide.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

dubbo.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://dubbo.apache.org/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">

        <!--服务提供者声明名称:必须保证服务名称的唯一性,它的名称是dubbo内部使用的唯一标识-->

    <dubbo:application name="001-link-userservice-provider"/>

    <!--访问服务协议的名称及端口号,dubbo官方推荐使用dubbo协议,端口号默认20880-->

    <dubbo:protocol  name="dubbo" port="20880"/>

    <!--
        暴漏接口
        interface:暴漏服务接口的全限定类名
        ref:接口引用的实现类在spring中的标识
        registry:如果不使用注册中心就是N/A
    -->
    <dubbo:service interface="com.zhang.dubbo.service.UserService" ref ="userService" registry="N/A"/>

    <!--将接口的实现类加载到spring容器中-->
    <bean id="userService" class="com.zhang.dubbo.service.UserServiceImpl"/>

</beans>

注意实体类的序列化

consumer

流程 双击两下ctrl

1.创建一个maven  web工程:服务的消费者
2.配置pom,添加依赖
3.设置dubbo的核心配置文件
4.编写control
5.配置中央调度器(servlet :DispatcherServlet)

直连会把一个项目打包到另外一个项目,有可能直接new实现类的情况

因此

  • dubbo官方推荐必须有一个接口工程,他就是一个maven java工程

  • 要求接口工程里存放到内容如下

    • 对外暴漏的服务接口(service接口)
    • 实体bean对象

dubbo-consumer.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://dubbo.apache.org/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">

<!--    声明服务消费者的名称:保证唯一-->
    <dubbo:application name="002-link-consumers"/>
<!--
    引用远程服务接口:
           id:远程服务对象接口的名称
    interface:调用远程接口的全限定名称
     registry:不使用注册中心为N/A

-->
    <dubbo:reference id="userService"
            interface="com.zhang.dubbo.service.UserService"
            url="dubbo://localhost:20880"
            registry="N/A"/>

</beans>

在消费者中消费提供者的服务,所以需要control,也需要视图解析器,

dubbo服务化最佳实践

分包

建议将服务接口、服务模型等均放到公共包

粒度

  • 服务接口尽可能大,每个服务应代表一个功能,而不是一个标准
  • 服务接口建议以业务场景进行划分,并对相进业务进行抽象,防止数量爆炸
  • 不建议使用过于抽象的通用接口,如:Map,没有清晰的语义,后期维护不方便

版本

每个接口都应定义版本号,区分同一接口的不同实现

接口工程

将服务接口放到一个项目中,provider实现接口提供服务,consumer根据接口订阅服务,这样不需要进行打包,只需要将接口工程依赖添加到两个项目中。3-4-5

dubbo常用标签

公共标签

<dubbo:application name=""/> //配置应用信息
<dubbo:registry address="ip:port"  protocol="协议"/> // 配置注册中心

服务提供者标签

配置暴露的服务
<dubbo:service interface="服务接口名字" ref="服务实现对象" bean/>

服务消费者

服务消费者引用远程的服务
<dubbo:reference id="服务引用的bean的id" interface="服务接口名" />

注册中心-zookeeper

注册中心类型
Multicast注册中心:组播方式
Redis注册中心:使用Redis作为注册中心
Simple注册中心:一个dubbo服务。作为注册中心,提供查找服务的功能
(推荐)Zookeeper注册中心:使用Zookeeper作为注册中心

Hadpod的一个子项目,是一个树形的目录服务,支持变更推送,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OzpaO50-1622032572315)(Picture/zookeeper.png)]

alt+1 可以打开文件 (021)

需要一个接口工程作为注册中心

zk-interface

还有消费者和提供者

<dependencies>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.16.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.16.RELEASE</version>
    </dependency>

    <!--dubbo-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.2</version>
    </dependency>

    <!--    接口工程-->
    <dependency>
      <groupId>com.zhang.dubbo</groupId>
      <artifactId>006-zk-interface</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

<!--    zookeeper-->
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>4.1.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <!--JDK1.8编译插件-->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

提供者配置

<?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://dubbo.apache.org/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">


    <dubbo:application name="007-zk-userservice-prvider"/>

    <dubbo:protocol name="dubbo" port="20880"/>

<!--    <dubbo:service interface="com.zhang.dubbo.service.UserService" ref="" registry=""/>-->
<!--   使用注册中心和端口号-->
    <dubbo:registry  address="zookeeper://localhost:2181"/>
<!--    暴漏服务接口-->
    <dubbo:service interface="com.zhang.dubbo.service.UserService"  ref="userServiceImpl"/>
<!--    加载实现类-->
    <bean id="userServiceImpl" class="com.zhang.dubbo.service.impl.UserServiceImpl"/>


</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://dubbo.apache.org/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">


    <dubbo:application name="008-zk-consumer"/>

<!--    指定注册中心-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
<!--    -->
    <dubbo:reference id="userService" interface="com.zhang.dubbo.service.UserService"/>

</beans>

注意要在web.xml配置中央处理器,DispatcherServlet

消费者还需要多配置一个mvc 视图解析器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值