• dubbo 基础入门


    一.什么是dubbo?

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

    dubbo产生的背景

    ① 单一应用架构
        当网站很小时,只需要一个项目就可以将所有功能部署到一起,减少部署成本。
        此时用于简化增删改查工作量的数据访问框架(ORM)是关键。
    ② 垂直应用架构
        当访问量增大时,单一应用增加机器所带来的加速越来越小,此时应当拆分单个项目为互不相干的多个应用,提升效率。
        此时,加速前端页面开发的web框架(MVC)是关键。
    ③ 分布式服务架构
        当垂直应用越来越多,有很多相同的业务逻辑,这样应用直接的交互不可避免,此时将核心业务抽取出来,作为独立的服务,逐 渐形成稳定的服务中心,以应对快速变化的外部市场环境。
        此时,用于提高业务复用整合的分布式服务框架(RPC)是关键。
    ④ 流动计算架构
        当服务越来越多,容量的评估,小服务资源浪费等问题逐渐暴露,此时需要一个服务治理工具来管理集群容量,提高利用率。
        此时,提高资源利用率的资源调度和服务治理中心(SOA)是关键。
     
    而Dubbo就是资源调度和服务治理中心的管理工具。
     
    dubbo其核心部分包含:
    1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
    2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
    3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

    二.为什么使用dubbo?

    1.webservice:效率不高基于soap协议,项目中不建议使用,但它的优点在于跨语言通信,适用于不同公司相互调用接口。
    2.使用restful形式服务:http+json。很多项目中的应用,如果服务太多,系统之间调用关系混乱,需要治疗服务。
    3.使用dubbo。使用rpc协议进行远程调用,之间使用socket通信,传输效率高,并且可以统计出系统之间的调用关系、调用次数。
     
    dubbo能做什么
    1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。      
    2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
    3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
     
    一般 nginx+tomcat
             | ----> Controller1--------->service1
    请求----->nginx  |
             |----->Controller2--------->service2
    请求进了Controller 就只有一条路可以走了
     
    使用dubbo后
                  | ------->service1
    请求------>Controller---->   |
                  |---------->service2
    简单的说 也就是 一个Contoller 我可以部署多个 service   。 
     
    一般的mvc项目 包含 Controller、Servicei、ServiceImpl、dao三层
    使用doubbo我们可以把项目拆分:
    Controller 作为 “消费着” 一个项目
    ServiceImpl +dao 作为 “提供者” 一个项目
    Servicei “接口” 可以作为一个项目
    我们可以部署多个“提供着”。。。。。。。。。。。。。。。。。。。
     
    dubbo缺点是什么
    由于dubbo是通过java编写的,dubbo最大的缺点就出现了,它只适用于java系统间的通信。

    三.Dubbo的架构

    角色说明
    Provider:暴露服务的服务提供方
    Container:服务运行容器
    Consumer:调用服务的消费方
    Registry:注册服务与发现服务中心
    Monitor:统计服务调用的监控中心(可有可无)
    调用关系说明
    0:服务运行容器启动,加载服务提供者
    1:在启动时告诉注册中心服务方有什么服务
    2:消费者调用服务时,先到注册中心订阅所需要服务
    3:注册中心返回结果即该服务的地址,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    4:消费者通过地址调用服务(此时注册中心没用了)基于软件负载均衡算法,选一台提供者进行调用,如果调用失败,在选另一台调用(单机除外)
    5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次到监控中心
     

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

    • Multicast注册中心
    • Zookeeper注册中心   //官方推荐
    • Redis注册中心
    • Simple注册中心

    四.如何使用Dubbo

    dubbo官方的使用及步骤(基本操作)

    Maven dependency

    You may need to use the latest release  to build your dubbo application.

    自己敲了一遍

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
    </dependency>


    package com.alibaba.dubbo.demo;
    
    public interface DemoService {
        String sayHello(String name);
    }

    package com.alibaba.dubbo.demo.provider;
    import com.alibaba.dubbo.demo.DemoService;
    
    public class DemoServiceImpl implements DemoService {
        public String sayHello(String name) {
            return "Hello " + name;
        }
    }


    Dubbo使用Spring配置方式,只需用Spring加载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"
           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">
        <!--发布dubbo服务 -->
    <!-- 提供方应用信息,用于计算依赖关系 -->
      <dubbo:application name="demo-provider"/>

      <!-- 使用multicast广播注册中心暴露服务地址 --> 
        <dubbo:registry address="multicast://224.5.6.7:1234"/>
      <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/>//官方推荐
        <!-- 用dubbo协议在20880端口暴露服务 -->  
        <dubbo:protocol name="dubbo" port="20880"/>
        <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
        <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
    </beans>

    启动服务提供者进行测试
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Provider {
        public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                    new String[] {"META-INF/spring/dubbo-demo-provider.xml"});
            context.start();
            // press any key to exit
            System.in.read();//// 为保证服务一直开着,利用输入流的阻塞来模拟 
        }
    }

    启动


    服务消费方配置
    <?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">
        <!---服务消费方名字,不要和服务提供方一样-->
    <dubbo:application name="demo-consumer"/>
      <!--multicast---注册中心--> <dubbo:registry address="multicast://224.5.6.7:1234"/>
      <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/>//官方推荐 <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService"/> </beans>
     

     启动服务消费者测试

    import com.alibaba.dubbo.demo.DemoService;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Consumer {
        public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                    new String[]{"consumer.xml"});
            context.start();
            // obtain proxy object for remote invocation
            DemoService demoService = (DemoService) context.getBean("demoService");
            // execute remote invocation
            String hello = demoService.sayHello("world");
            // show the result
            System.out.println(hello);
        }
    }

     输出结果:

    ZooKeeper的安装与部署参照:https://blog.csdn.net/lihao21/article/details/51778255

  • 相关阅读:
    使用JS获取上一页的url地址
    禁止弹窗中蒙层底部页面跟随滚动的几种方法汇总
    一个Option请求引发的深度解析
    html li标签前面添加图标三种方法
    CSS3
    计算x
    计算圆周率
    最长公共子序列
    小字辈(左子右兄加强版)
    Excel列名和列序号转换
  • 原文地址:https://www.cnblogs.com/ljy-skill/p/8688305.html
Copyright © 2020-2023  润新知