Dubbo

前言

一 什么是分布式框架

​ 分布式系统是若干独立系统的集合,但是用户使用起来项式在使用一套系统。但对于开发人员来说,方便日后的功能扩展与管理。

二 为什么需要分布式系统

​ 规模逐渐扩大和业务的复杂,单台计算机扛不住双十一那样的流量。

三 应用架构的发展演变

​ 1) 单一架构

​ 将所有应用(业务)放到一台服务器上,打包运行公司管理系统/超市收银系统

​ 优点:开发简单,部署简单

​ 缺点:扩展不容易,维护不容易,性能提升难

​ 2)垂直应用架构

​ 将大应用拆分为小应用(一般按照业务拆分),根据不同的访问频率决定各自业务部署的服务器数量

​ 优点:扩展容易

​ 缺点:页面一改,可能造成整个项目重新部署,业务和界面没有分离开,随着业务种类增加,怎么解决业务之间的相互调用问题,订单服务器和用户服务器交互效率的问题。

​ 3) 分布式架构(基于RPC:remote processing call 远程过程调用)

​ 将业务拆分后,用某种方式实现各个业务模块的远程调用和复用,这时一个好的RPC框架就决定了你的分布式架构的性能,怎么调用,何时调用,服务器挂了怎么办,

Dubbo

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

优点:解决了分布式系统中互相调用的问题。

缺点:假设有100台服务器,50台用户业务服务器,50台订单服务器,但在上线后发现,用户服务器使用率很小,但是订单服务器压力很大,最佳配比应该是1:4,这时候就要求我们还有一个统一管理的调度中心

RPC框架提升性能主要从两个方面入手:序列化网络通信

序列化:本地的对象要在网络上传输,必须要实现Serializable接口,也就是必须序列化。序列化方案有很多,xml,json,二进制流,其中效率最高的就是二进制流,Dubbo采用的就是这个。

网络通信:不同于HTTP需要进行7步走(三次握手和四次挥手),Dubbo采用Socket通信机制,一步到位,提升了通信效率,并且可以建立长连接,不用反复连接,直接传输数据。

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zgypIblM-1666595751942)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220416103542092.png)]

服务提供者(provider):提供服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Customer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

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

dubbo支持的协议

dubbo支持多种协议:dubbo,hessian,rmi,http,webservice,thrift,memcached,redis

dubbo官方推荐使用dubbo,默认端口20880

使用dubbo协议,spring配置文件加入
<dubbo:protocol name="dubbo" port="20880"/>

Dubbo直连方式

直连方式是指没有注册中心,服务提供者直接告诉消费者自己有什么服务。

dubbo的配置文件是spring类型的xml文件

服务提供者

服务提供者只有一个spring.xml类型的服务提供者的配置文件和web.xml中的监听器用于初始化该配置文件。

 <!--服务提供者声明名称:必须保证服务名称的唯一性,它的名称时dubbo内部使用的唯一标识-->
    <dubbo:application name="001-link-userserivce-provider"/>
    
    <!--访问服务协议的名称及端口号,dubbo官方推荐使用的时dubbo协议,端口号默认为20880
        name:协议名称
        port:端口号
    -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--暴露服务/提供服务
        interface:提供的服务接口
        ref:接口的实现类的bean id号
        registry:声明注册中心,N/A表示直连,没有用到注册中心
    -->
    <dubbo:service interface="com.bjpowernode.dubbo.service.UserService" ref="userService" registry="N/A"/>
    <!--将接口的实现类加载到spring容器中-->
    <bean id="userService" class="com.bjpowernode.dubbo.service.impl.UserServiceImpl"/>

服务提供者需要将自己打包成jar包,以便消费者可以依赖,从而得知提供者都提供哪些服务

在服务提供者的pom.xml文件中,将<packaging>war</packaging>注释掉,然后执行mvninstall命令打成jar包,发布到本地仓库。
mvn 要打包的项目名 install	<!--因为packaging默认就是打成jar包-->

消费者

消费者中有Controller,spring.xml,dubbo 的配置文件

dubbo的配置文件 
	<dubbo:application name="001-link-userservice-consumer"/>
    <!--
        引用远程服务接口:
        id:远程服务接口对象的名称
        interface:调用远程接口的全限定类名
        url:访问服务接口的地址
        registry:不使用注册中心
    -->
    <dubbo:reference id="userService"
                     interface="com.bjpowernode.dubbo.service.UserService"
                     url="dubbo://localhost:20880"
                     registry="N/A"/>
 	<!--spring的applicationContext.xml-->
 	<!--组件扫描器-->
    <context:component-scan base-package="com.bjpowernode.dubbo.web"/>
    <!--配置注解驱动-->
    <mvc:annotation-driven/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
web.xml的配置文件
	<servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath:dubbo-userservice-consumer.xml,
                classpath:applicationContext.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

注意:1.要使用provider提供的服务时,需要先部署provider,否则consumer找不到资源。

​ 2.@Autowired自动注入别忘了,在controller里

dubbo tips

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

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

  1. 对外暴露的服务接口(service接口)
  2. 实体bean对象

粒度

  • 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤
  • 服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸
  • 不建议使用过于抽象的通用接口,比如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便

版本

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

    如:<dubbo service interface="com.xxxx.XxxService" version="1.0">
    

dubbo注册中心

Dubbo提供的注册中心有以下几种类型可供选择:

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

zookeeper的作用相当于一个记录本,提供者将服务地址告诉注册中心,注册中心将这些地址记录下来,提供给消费者

提供者
<dubbo:application="whatever"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:registry address="zookeeper://localhost:2181"/>
<dubbo:service interface="服务接口地址" ref="服务接口实现bean的id"/>
<bean id="服务接口实现bean的id" class="服务接口实现的地址"/>
消费者
<dubbo:application=""/>
<dubbo:registry address="zookeeper://localhost:2181"/>
<dubbo:reference id="必须与提供者的bean id相同" 
                 interface="服务接口地址" 
                 url="dubbo://localhost:20880"/>

dubbo配置中常见属性

dubbo缺省

dubbo缺省会在启动时检查以来的服务是否可用,不可用时会抛出异常,阻止spring初始化完成。默认check=true,在消费者的配置文件中使用

<dubbo:reference id="" interface="" ref="" version="" check="true"/>一般开发中设为false,上线时设为true

重试次数

消费者访问提供者,若访问失败,则切换重试访问其他服务器,可通过retries=2来设置重试次数

<dubbo:service retries=2/>
<dubbo:reference retries=2/>

超时时间

timeout:调用远程服务超时时间

服务提供者调用接口时
<dubbo:service interface="" ref="" version="" timeout="15000"/>

dubbo监控中心

图形化界面操作
提供者,若访问失败,则切换重试访问其他服务器,可通过retries=2来设置重试次数

<dubbo:service retries=2/>
<dubbo:reference retries=2/>

超时时间

timeout:调用远程服务超时时间

服务提供者调用接口时
<dubbo:service interface="" ref="" version="" timeout="15000"/>

dubbo监控中心

图形化界面操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值