Dubbo分布式服务治理框架(一)服务注册与发现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xuruanshun/article/details/102712645

1.什么是dubbo?

1.1.简介

DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容。

 

1.2.RPC

 

1.3.官网

http://dubbo.io/

注意:我们此处演示使用的dubbo版本是2.5.3版本,2.6.x以上的版本主要是提供给springboot整合dubbo使用的。

关于dubbo源码的下载,以及dubbo-admin(管理控制台),dubbo-monitor-simple(简易监控中心),dubbo-registry-simple(简易注册中心)等war包的下载,可参考文档:https://blog.csdn.net/xuruanshun/article/details/102738098

 

 

3.Dubbo框架说明

3.1.背景

 

3.2.服务治理

 

3.3.架构

调用关系:

1. 服务容器负责启动,加载,运行服务提供者。

2. 服务提供者在启动时,向注册中心注册自己提供的服务。

3. 服务消费者在启动时,向注册中心订阅自己所需的服务。

4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

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

 

3.4.Dubbo的优缺点

 

 

3.5.Dubbo注册中心

对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;

对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。

而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。

通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。

 

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

Zookeeper注册中心(推荐)

Redis注册中心(推荐)

Multicast注册中心

Simple注册中心

 

 

 

4.Dubbo快速入门

 

4.1.环境步骤:

  1. 安装Zookeepr启动
  2. 创建Maven项目搭建生产者和消费者
  3. 安装DubboAdmin平台,实现监控

4.2.Zookeeper介绍与安装

Dubbo注册中心采用的是Zookeeper。为什么采用Zookeeper呢?

Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心。

Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求

注:zookeeper的安装和启动,可以参考文档:https://blog.csdn.net/ring300/article/details/80446918

 

4.3.创建Maven工程

项目结构,分为三个项目:

itmayiedu-dubbo-provider-api    服务提供者对外接口

itmayiedu-dubbo-provider         服务提供者接口实现

itmayiedu-dubbo-consumer      服务消费者

 

1.创建maven项目 itmayiedu-dubbo-provider-api

2.MembeService接口

package com.itmayiedu.member.service;

public interface MemberService {

    String getUser(String id);
}

3.创建maven项目 itmayiedu-dubbo-provider

4.pom文件添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itmayiedu</groupId>
    <artifactId>itmayiedu-dubbo-provider</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- 依赖服务提供者对外接口-->
        <dependency>
            <groupId>com.itmayiedu</groupId>
            <artifactId>itmayiedu-dubbo-provider-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--zookeeper客户端工具,用于连接zookeeper-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!--dubbo底层依赖netty框架实现-->
        <dependency>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
            <version>3.2.5.Final</version>
        </dependency>

        <!--spring框架依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>

        <!-- dubbo依赖,排除spring,netty依赖,使用我们自己添加的依赖,dubbo提供的版本太低-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

注:如果无法引入itmayiedu-dubbo-provider-api依赖,则先将itmayiedu-dubbo-provider-api项目install到本地仓库。

5.MemberServiceImpl实现类

package com.itmayiedu.member.service.impl;

import com.itmayiedu.member.service.MemberService;

public class MemberServiceImpl implements MemberService {

    public String getUser(String userId) {
        System.out.println("订单服务调用会员服务userId = " + userId);
        return "订单服务调用会员服务成功!";
    }
}

6.配置文件 dubbo-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://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--定义了提供方应用信息,服务名称,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识 -->
    <dubbo:application name="member-provider" />

    <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper -->
    <dubbo:registry address="zookeeper://localhost:2181" />

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 使用 dubbo 协议实现定义好的 api.PermissionService 接口 -->
    <!-- 定义服务接口 -->
    <dubbo:service interface="com.itmayiedu.member.service.MemberService"
                   ref="memberService" protocol="dubbo" />

    <!-- 定义服务接口实现类 -->
    <bean id="memberService" class="com.itmayiedu.member.service.impl.MemberServiceImpl" />
</beans>

7.启动类MemberApp

package com.itmayiedu.member.service;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MemberApp {

    public static void main(String[] args) throws Exception{
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
        context.start();
        System.out.println("会员服务已经启动!!!");
        System.in.read();//保持服务一直运行
    }
}

8.先启动zookeeper,再启动MemberSApp启动类,查看控制台。

9.创建maven项目 itmayiedu-dubbo-consumer

10.pom文件添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itmayiedu</groupId>
    <artifactId>itmayiedu-dubbo-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- 依赖服务提供者对外接口-->
        <dependency>
            <groupId>com.itmayiedu</groupId>
            <artifactId>itmayiedu-dubbo-provider-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--zookeeper客户端工具,用于连接zookeeper-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!--dubbo底层依赖netty框架实现-->
        <dependency>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
            <version>3.2.5.Final</version>
        </dependency>

        <!--spring框架依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>

        <!-- dubbo依赖,排除spring,netty依赖,使用我们自己添加的依赖,dubbo提供的版本太低-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

11.配置文件 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://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="order-consumer" />

    <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper -->
    <dubbo:registry address="zookeeper://localhost:2181" />

    <!-- 使用 dubbo 协议实现定义好的 api.PermissionService 接口 -->
    <!-- 定义服务提供者接口,需要调用的接口api -->
    <dubbo:reference id="memberService" interface="com.itmayiedu.member.service.MemberService"/>

</beans>

12.OrderService类,调用服务提供者对外接口。

package com.itmayiedu.order.service;

import com.itmayiedu.member.service.MemberService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class OrderService {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
        context.start();
        MemberService memberService = context.getBean(MemberService.class);
        String result = memberService.getUser("1");
        System.out.println("result:" + result);
    }
}

13.启动OrderService类,查看控制台:

itmayiedu-dubbo-provider项目控制台:

远程调用成功!!!

5.监控

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

5.1.搭建监控服务

监控服务的安装包就是前面说的三个模块包中的其中一个。

5.2.修改配置文件

 

修改注册中心的地址:意思是将监控中心注册到注册中心

5.3.在dubbo-b中配置监控

注意:监控服务本身也被注册到了注册中心,和提供者一样都是监控中心的一个服务。所以可以在注册中心自动查找监控服务,并发送统计数据。

当消费者调用提供者服务时,提供者和消费者都会向监控中心自动发送统计数据

 

5.4.启动

启动成功:

5.5.查看界面

输入地址:http://127.0.0.1:8088/

说明:端口在这里指定:

5.6.功能

查看服务:

统计:

图表:

 

6.管理

dubbo提供了一套在线管理整个服务的功能,管理控制台为阿里内部裁剪版本,开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。

dubbo-admin底层实现连接zookeeper信息,进行解析转换程页面进行展示。

 

6.1.安装

将dubbo-admin-2.5.3.war部署到tomcat的webapps目录下:

6.2.修改配置文件

6.3.启动zookeeper,再启动tomcat

6.4.查看管理界面

使用用户登录:

http://127.0.0.1:8080/

效果:

功能:

 

 

Dubbo服务信息以持久+临时混合进行存储。

服务基本信息以持久进行存储,服务接口信息一般不会发生改变,采用持久节点进行存储。

服务接口地址以临时节点进行存储,因为地址是动态,所以采用临时存放。

 

 

猜你喜欢

转载自blog.csdn.net/xuruanshun/article/details/102712645