分布式框架Dubbo入门精华部分

1、架构

1)几种常见架构模式
传统系统架构模式(表现层、业务层、持久层)

  1. 列如:网贷系统(p2p)
  2. 优点:简单的业务项目比较适合,数据量不大;
  3. 缺点:所有人的代码都提交部署在一个项目应用里,数量增多后效率会变低、业务扩大后,不便于维护、三层架构互相关联,改动一处就会影响其他地方

单一应用架构

  1. 使用场景:流量较小,功能业务集中一个项目应用,成本低
  2. 使用的是orm数据访问框架,列如上面网贷系统就是经典的单一应用架构

垂直应用架构

  1. 使用场景:访问量在单一应用架构基础上增加,拆分应用提高访问速度
  2. 使用的是web(MVC)框架/三层架构

分布式架构

  1. 使用场景:随着更大的访问量垂直结构中的应用里的核心业务单独拆分出来到一个服务器,可用单独运行的,在服务中心同一管理服务;

流动计算架构

  1. 使用场景:当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用

2)微服务

  1. 1)概念:把产品或项目分解成单独的服务进行部署、互不依赖的、实质分解功能,提高效率;
  2. 2)微服务的好处:一、独立出来的服务可以采用不同的开发技术和框架;二、每个服务可看成一个项目 开发的功能分别独立在服务里;三、便于管理维护独立的服务之间可用通过Dubbo、Spring-cloud的api进行通讯;
  3. 3)微服务的坏处:单独开的服务过多,排除故障麻烦,可用通过建立统一的日志管理系统

2、Dubbo (分布式服务框架)
1)概念:分布式的服务管理框架,可用与spring完美集成,可用通过RPC远程服务调用,以消费方、提供方、注册中心模式架构;
在这里插入图片描述
2)DubboX:是由当当网进行维护升级的版本,当阿里在2000年提出的该分布式框架可以供以千万家商家使用数以10年后,在2017年之前都是没有维护更新的,后来在2017年前后spring组织推出了一款开源的分布式服务管理框架Spring-cloud,这时阿里意识到其威胁性,开始对Dubbo进行维护更新,在2017年更新到2.6.2到2018的2.6.4,从此两家巨头开始争夺市场不分上下;
3)Dubbo框架底层划分为10层:服务接口层(Service)、配置层(Config)、服务代理层(Proxy)、服务注册层(Registry)、集群层(Cluster)、监控层(Monitor)、远程调用层(Protocol)、信息交换层(Exchange)、网络传输层(Transport)和数据序列化层(Serialize)
4)Dubbo的核心内容:

  1. 服务定义有消费者、提供者,一方提供接口、一方调用接口
  2. 服务注册用于管理提供的服务接口,上传接口、调用接口的平台
  3. 服务监控对消费接口和提供接口的状态时刻监控、保证健康运行

官网最新模式图解:

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

Container: 服务运行容器
在这里插入图片描述
5)Dubbo的使用
6)Dubbo管理控制台环境配置
官方获取:http://central.maven.org/maven2/com/alibaba/dubbo
在这里插入图片描述
准备工作:准备zookeper注册中心管理框架, 官方下载地址:http://mirrors.cnnic.cn/apache/zookeeper/
下载完把conf的zoo_simple.cfg修改成zoo.cfg!
启动bin下的zookepper.bat
在这里插入图片描述
访问注册中心步骤:

  1. 1修改配置dubbo-admin.xml,改成

在这里插入图片描述

  1. 2把该文件覆盖到dubbo-admin-0.0.1-SNAPSHOT.jar的classes下

在这里插入图片描述

  1. 3在该界面cmd 执行启动命令 java -jar Dubbo-admin-0.0.1SNAPSHOT.jar

在这里插入图片描述

  1. 4 访问路径localhost:7001

在这里插入图片描述

  1. 5登陆密码提供了root/root 游客guest/guest

在这里插入图片描述
在这里插入图片描述

  1. 6 仿官方案列 快速学习官网首页

http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
步骤:
创建消费和提供两个项目,一个提供,一个消费
提供公共项目(RPC)实现项目之间互相调用、
消费和提供方配置依赖公共项目的pom.xml

<?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">
    <parent>
        <artifactId>dubbo-parent</artifactId>
        <groupId>dubbo-parent</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>dubbo-api</artifactId>
</project>

提供方提供接口实现 DemoServiceImpl
公共方提供实现接口 DemoServiceI
使用zookepper注册管理中心
一 、获取Dubbo核心包

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

二、创建父Maven(包含全部服务消费、便于给子maven项目提供依赖包)
在这里插入图片描述
二 、创建子Maven项目提供者(服务)、消费者(消费)、公共项目(RPC远程服务调用)
父pom.xml子类都拥有

<?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>dubbo-parent</groupId>
    <artifactId>dubbo-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>dubbo-provider</module>
        <module>dubbo-customer</module>
        <module>dubbo-api</module>
    </modules>
    <dependencies>
        <dependency>
            <!--dubbo核心包-->
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>

        <!-- junit测试包 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    <!--spring框架测试的 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>

        <!--zookeper注册中心-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>
</project>

使用zookepper注意 注册地址配置 加缺省配置:

<dubbo:registry ... client="zkclient" />

三、提供方启动注册到zookepper服务中心,只实现,接口抽取公共项目api
提供方一

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:dubbo-provider.xml")
public class Provider {
        @Test
        public void test()throws Exception{
            System.out.println("启动1");
            System.in.read(); // 按任意键退出
        }
}

在这里插入图片描述
提供方一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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="dubbo-provider"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://localhost:2181"  client="zkclient"/>
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20885" />
    <!--dubbo 扫描service层-->
    <dubbo:annotation package="com.yyg" />
</beans>

提供方一和提供方二的pom.xml依赖

<dependency>
    <groupId>dubbo-parent</groupId>
    <artifactId>dubbo-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

提供方二同上dubbo-provider.xml里 端口必须不同 pom.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-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="dubbo-provider"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <!--zookeper注册中心-->
    <dubbo:registry address="zookeeper://localhost:2181"  client="zkclient"/>
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20889" />
    <!--dubbo 扫描service层-->
    <dubbo:annotation package="com.yyg" />
</beans>

四、访问启动后的界面
在这里插入图片描述
五、公共项目创建提供方实现的接口DemoServiceI,用于RPC远程服务调用

package com.yyg.dao;
public interface DemoService {
    String sayHello(String name);
}

在这里插入图片描述在这里插入图片描述
六、消费方需要在注册中心消费

@Test
public void testZooKeper() {
    System.out.println(demoService);
    String da = demoService.sayHello("大王啊");
    System.out.println(da);
}

消费方的pom.xml(共享提供方接口)

<?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">
    <parent>
        <artifactId>dubbo-parent</artifactId>
        <groupId>dubbo-parent</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-customer</artifactId>
    <dependencies>
        <dependency>
            <groupId>dubbo-parent</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

消费方的配置customer.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-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="dubbo-customer"  />
   
    <!--zookeper注册中心 2.3.0以后要加 client="zkclient"-->
    <dubbo:registry address="zookeeper://localhost:2181"  client="zkclient"/>
    <!-- 消费接口-->
    <dubbo:annotation package="com.yyg" />
</beans>

七、补充:默认的广播注册,不使用zoolepper,测试一般不注册到服务中心设置禁用注册配置,消费的时候就调用不到被禁用的接口了,注册中心也会消失没有;
在这里插入图片描述
<dubbo:registry address=“10.20.153.10:9090” register=“false” />

在这里插入图片描述
八、直连提供者配置
<dubbo:reference id=“xxxService” interface=“com.alibaba.xxx.XxxService” url=“dubbo://localhost:20890” />
在这里插入图片描述

九、负载均衡策略 需要多方提供者 分别启动注册接口到服务中心,消费者随机消费

  1. 随机,按权重设置随机概率。
  2. 轮询,按公约后的权重设置轮询比率

十、 Maven编译打包

打包,每个项目都是单独的服务,可用单独运行,哪个项目需要打包就在pom.xml添加配置

Pom.xml

=============================
cn.itsource.service
service-user
${service-user.version}
jar

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>

<!-- 打包jar详细配置 -->
    <build>
        <!-- jar包名字 -->
        <finalName>provder</finalName>
        <!-- 打包资源配置,如配置文件 -->
        <resources>
            <resource>
                <targetPath>${project.build.directory}/classes</targetPath>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
            <!-- 结合com.alibaba.dubbo.container.Main 
            官方文档:dubbo会自动在classes/META-INF/spring下去加载spring的配置文件
            因此打包时需要将spring配置文件复制到该目录 -->
  <resource>
            <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>applicationContext.xml</include>
            </includes>
        </resource>
    </resources>
        
        <pluginManagement>
        <plugins>
            <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-dependency-plugin</artifactId>
                                    <versionRange>[2.0,)</versionRange>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <classesDirectory>target/classes/</classesDirectory>
                <archive>
                    <manifest>
                        <mainClass>com.alibaba.dubbo.container.Main</mainClass>
                    <!-- 重要:打包时 MANIFEST.MF文件不记录的时间戳版本 -->
                        <useUniqueVersions>false</useUniqueVersions>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>.</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <type>jar</type>
                        <includeTypes>jar</includeTypes>
                        <useUniqueVersions>false</useUniqueVersions>
                        <outputDirectory>
                            ${project.build.directory}/lib
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<dependencies>

3、Dubbo监控中心
1)概念:监控中心负责为服务的监控运维采集各维度的数据,统计各服务的调用次数、时间等,统计先在服务端和消费端内存中汇总,每隔一分钟发送到监控中心服务器,并以报表的形式展现
2)监控中心特点:监控中心是独立于服务和管理控制台的,监控中心如果出现异常(宕机),并不会影响Provider和Consumer之间的服务调用,但会丢失故障期间的监控数据,对生产环境无影响;
3)简单的使用监控中心服务:

  1. 1下载解压dubbo-monitor-simple-2.0.0
  2. 2 conf目录下的配置文件dubbo.properties

在这里插入图片描述

  1. 3 启动监控中心

在这里插入图片描述

  1. 4 访问监控中心

监控中心访问地址:http://localhost:7002
在这里插入图片描述在这里插入图片描述
有疑问的欢迎联系2822256710,加v :yygtq0818126,欢迎点评
所需资源百度云链接:
dubbo的核心包和依赖包:https://pan.baidu.com/s/1uF8mFji9byu6nkjuOPhlfQ
使用Maven自动下载Dubbo的相关包
服务管理中心界面:https://pan.baidu.com/s/14vgMP1aezYPDhCzVpQqH0w
服务注册管理中心:https://pan.baidu.com/s/1yfcOUaFeWYHSO8j-7UHEyQ

猜你喜欢

转载自blog.csdn.net/Yangyg_0818/article/details/83861313