Dubbo服务治理

作者: 老鼠AI大米_Java全栈 | 来源:发表于2018-10-23 20:49 被阅读3次

dubbo源于电商系统,是由传统应用一步步演变而来,下面我们先了解下演变过程

系统演变过程

  • 单一应用
    • 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
    • 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
  • 垂直应用架构
    • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
    • 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
  • 分布式服务架构
    • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
    • 此时,用于提高业务复用及整合的分布式服务框架(RPC) 是关键。
  • 流动计算架构
    • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
    • 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

RPC(Remote Procedure Call Protocol):远程过程调用
RPC需要解决的问题

  • 通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
  • 寻址问题 : A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
  • 序列化 与 反序列化 : 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
    同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。

Dubbo特点

  • 一款分布式服务框架
  • 高性能和透明化的RPC远程服务调用方案
  • SOA服务治理方案

Dubbo架构

dubbo.png
  • Provider: 暴露服务的服务提供方。
  • Consumer: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。
  • Monitor: 统计服务的调用次数和调用时间的监控中心。

服务启动及调用过程

  • 先启动服务提供者,再启动服务消费者
  • 服务提供者在启动时,向注册中心注册自己提供的服务。
  • 服务消费者在启动时,向注册中心订阅自己所需的服务。
  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

下面我们开始搭建一个服务提供者与服务消费者。
主要是以下几个步骤:

  1. 安装Zookeeper,启动
  2. 创建maven项目,构建Dubbo+Zookeeper+Boot工程

安装zookeeper
因dubbo是基于zk的,所以要先启动zk。
下载zookeeper,将原配置文件zoo_sample.cfg重命名配置文件为zoo.cfg,再启动zkServer.cmd(windows下直接运行即可)

创建工程
在maven工程中创建如下几个module:

  • dubbo-api 公共接口
  • dubbo-consumer 服务消费者
  • dubbo-provider 服务提供者

dubbo-api

public interface DubboService {
    //声明服务方法
    String sayHello(String name);
}

dubbo-consumer
配置文件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://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://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-4.0.xsd">
    <!--配置服务名称-->
    <dubbo:application name="dubbo-consumer" />
    <!--配置服务注册中心,dubbo不仅仅支持zookeeper-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!--声明服务引用,与服务声明接口类型一致-->
    <dubbo:reference interface="com.iti.DubboService" id="dubboService" />
</beans>

引导文件,需要加载dubbo的配置文件

package com.iti;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@ImportResource("classpath:/consumer.xml")
@RestController
public class Consumer {
    //注入声明的服务
    @Autowired
    private DubboService dubboService;

    public  static void main(String[] args){
        SpringApplication.run(Consumer.class,args);
    }

    //测试服务调用
    @ResponseBody
    @RequestMapping("/sayhello/{name}")
    public String hello(@PathVariable String name){
        for(int i=0; i<10; i++){
            System.out.println(dubboService.sayHello(name+i));
        }
        return dubboService.sayHello(name);
    }
}

dubbo-provider
添加上面接口的具体实现,注意这里的value要与上面的id相同

@Component("dubboService")
public class DubboServiceImpl implements DubboService {

    @Override
    public String sayHello(String name) {
        return "hello " + name;
    }
}

同样也要对服务提供者配置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-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
    <dubbo:application name="dubbo-provider" owner="programmer" organization="dubbox"/>
    <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
    <dubbo:service interface="com.iti.DubboService" ref="dubboService" protocol="dubbo" />
</beans>

很多情况下,服务提供者也是服务消费者,怎么办?
可以在dubbo配置文件中直接配置对应的服务引用,如添加对DubboService2的引用

<dubbo:reference interface="com.iti.DubboService2" id="dubboService2" />

当然需要再创建一个服务提供者dubbo-provider2,步骤同上。

服务自动负载均衡
只需把dubbo-provider多启动几份(注意端口),这样针对DubboService接口的服务提供者就有多个,当调用服务消费者消费服务时,可以写一个循环打印服务接口的方法,就可以看到输出的日志已经负载均衡了。

学习交流群:64691032

相关文章

  • Dubbo 服务治理

    Dubbo 服务治理 前言 大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 服务治理。在前一个章节...

  • dubbo常见的一些面试题

    什么是Dubbo? Duubbo是一个RPC远程调用框架, 分布式服务治理框架 什么是Dubbo服务治理? 服务与...

  • Dubbo优雅服务降级之mock

    [Dubbo优雅服务降级之Stub][Dubbo_Stub] dubbo作为国内互联网最常用的Java开源服务治理...

  • Dubbo及XML式开发

    Dubbo 是一个分布式服务治理框架,提供高性能的RPC远程服务调用及服务治理。 Dubbo是阿里巴巴开源的产品...

  • Dubbo服务治理

    dubbo源于电商系统,是由传统应用一步步演变而来,下面我们先了解下演变过程 系统演变过程 单一应用当网站流量很小...

  • Dubbo服务治理

    准确来说这里所说的集群主要是指Dubbo对于集群内容的支持,主要涉及:集群容错,负载均衡,路由逻辑三块。下面对于这...

  • Dubbo简介

    Dubbo是阿里巴巴开源的服务治理框架

  • 目前最新微服务架构技术栈选型

    一、微服务治理中心框架 Apache Dubbo分布式RPC框架 Apache Dubbo是一款 RPC 服务开发...

  • 《SpringCloudDubbo开发日记》(一)Nacos连官

    背景 现在的微服务框架一般分dubbo和springcloud两套服务治理体系,dubbo是基于zookeeper...

  • Dubbo知识整理

    原理 基础概念 Dubbo就是SOA服务治理方案的核心框架。用于分布式调用,其重点在于分布式的治理。 Dubbo是...

网友评论

    本文标题:Dubbo服务治理

    本文链接:https://www.haomeiwen.com/subject/jnzazftx.html