1 Dubbo出现的背景

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

  • 我们传统的网站结构为单一应用架构,也就是把所有的功能都放在一个项目工程里,部署在一台服务器上。

  • 当访问量越来越大,我们需要通过不断添加服务器的方式来应对越来越大的访问量,或是将应用拆分成几个不相干的应用部署在不同的服务器上。

  • 随着用户数的增加及业务的发展,拆分的应用越来越多,应用之间的交互及数据传输不可避免,则将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。

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

2 系统发展进化理论

系统发展经历过两个阶段:

  • 集中式系统
    就是把所有的程序、功能、模块集中到一个项目中,部署在一台服务器上,从而对外提供服务。
  • 分布式系统
    分布:在一定范围内分散开
    分布式系统就是把所有的程序、功能拆分成不同的子系统,部署在多台不同的服务器上,这些子系统相互协作共同对外提供服务,对于用户而言并不知道后台是如何交互的,使用上和集中式系统一样。

3 认识集群及分布式

  • 什么是集群?
    就是将相同的程序、功能部署在两台或是多台服务器上,这些服务器对外提供的功能是完全一样的,集群就是通过不同横向扩展增加服务器的方式,以提高服务的能力。

  • 什么是分布式?
    就是将两个或多个程序、功能分别运行在两台或多台主机服务器上,这些服务对外提供的功能并不一样,它们通过相互协作最终完成某一服务或是功能。
    简单来讲:如果两台服务器部署的程序完全一样则是集群,不一样就是分布式;分布式中的每一个节点都可以做成集群,而集群并不一定就是分布式。

4 Dubbo简介

Dubbo是一个分布式、高性能、透明化的RPC服务架构,提供服务自动注册、自动发现等高效服务治理方案。

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架

Dubbo官方网站:http://dubbo.io/

5 认识RPC

如果有两台服务器A和B,一个应用部署在A服务器上,一个应用部署在B服务器上,如果A想要调用B应用提供的方法,由于它们不在同一台机器上,也就是它们不在一个JVM内存空间,无法直接调用,需要通过网络进行调用,那么这个调用过程就叫做RPC。

 
image.png

6 Dubbo架构

 
image.png

Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。(常见Zookeeper作为注册中心)
Monitor: 统计服务的调用次数和调用时间的监控中心。

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

7 Dubbo程序开发

项目结构
主要分三大模块:
dubbo-api : 存放公共接口和model;
dubbo-consumer : 调用远程服务;
dubbo-provider : 提供远程服务。(用来具体实现dubbo-api提供的接口)

 
image.png
  • DubboDemo中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>DubboDemo</groupId>
<artifactId>DubboDemo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>dubbo-api</module>
<module>dubbo-consumer</module>
<module>dubbo-provider</module>
</modules>
<dependencies>
<dependency>
<groupId>DubboDemo</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
</dependencies> </project>
dubbo-api开发
  • API层开发Person接口
package com.hanyue.dubbo.api;

public interface Person {
public String sayHello(String name);
public String working(String work);
}
dubbo-provider开发
  1. 服务提供者需要使用到接口层代码,所以父级pom文件中已经将相关依赖jar包添加进去;
  2. 开发接口层代码所定义的接口具体实现;
  3. 配置接口为dubbo服务,将能提供的接口(服务)对外暴露出去,以便让别人能调用;
  • Person接口实现类PersonImpl开发
package com.hanyue.dubbo.provider;

import com.hanyue.dubbo.api.Person;

public class PersonImpl implements Person {
public String sayHello(String name){
return "hello,"+name;
} public String working(String work) {
return "我的工作是:"+work;
}
}
  • resources下applicationContext.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:application name="dubbo-provider"/> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<!--spring配置具体实现类-->
<bean id="personimpl" class="com.hanyue.dubbo.provider.PersonImpl"/>
<!--配置一个dubbo服务,将服务暴露出去-->
<dubbo:service interface="com.hanyue.dubbo.api.Person" ref="personimpl"/>
</beans>
  • provider 简单测试
    provider工程目录下新建Main类
package com.hanyue.dubbo.main;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.in.read();
}
}
dubbo-consumer开发
  • 配置dubbo服务引用,引用远程服务者提供的服务
  • applicationContext.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:application name="dubbo-consumer"/> <!--配置服务引用,引用远程服务,通过接口去引用-->
<dubbo:reference id="person" interface="com.hanyue.dubbo.api.Person"/>
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
</beans>
  • consumer简单测试
    请求Zookeeper进行服务端资源访问
package com.hanyue.dubbo.main;

import com.hanyue.dubbo.api.Person;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainConsumer {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person)context.getBean("person");
String hi = person.sayHello("旺旺");
System.out.println(hi);
String work = person.working("测试");
System.out.println(work); }
}

8 Dubbo-admin管理工具

 
image.png
 
image.png

9 Dubbo集群实现负载均衡

 

Dubbo从入门到实践的更多相关文章

  1. 《Github入门与实践》读书笔记 蟲咋先生的追求之旅(上)

    <Github入门与实践>作者: [日] 大塚弘记 译者:支鹏浩/刘斌   简介 本书从Git的基本知识和操作方法入手,详细介绍了GitHub的各种功能,GitHub与其他工具或服务的协作 ...

  2. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  3. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  4. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  5. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  6. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

  7. Python编程从入门到实践笔记——字典

    Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...

  8. Python编程从入门到实践笔记——if语句

    Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...

  9. Python编程从入门到实践笔记——操作列表

    Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...

随机推荐

  1. 【Spring】Spring的数据库开发 - 2、Spring JdbcTemplate的常用方法(execute、update、query)

    Spring JdbcTemplate的常用方法 文章目录 Spring JdbcTemplate的常用方法 execute() update() query() 简单记录-Java EE企业级应用开 ...

  2. ps的参数解释

    [root@bogon ~]# ps axuUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND user启动进程的用户 pid  表示进程标志 ...

  3. pandas 读写excel 操作(按索引和关键字读取行和列,写入csv文件)

    pandas读写excel和csv操作总结 按索引读取某一列的值 按关键字读取某一列的值 按关键字查询某一行的值 保存成字典并写入新的csv import pandas as pd grades=pd ...

  4. Java入门者:如何写出美观的Java代码?

    前言 在帮助各位同学远程解决代码问题的时候,发现很多同学的代码都有一个共同问题:代码书写格式不规范.虽然代码书写规范对程序性能及运行并不影响,但影响着别人对你编程习惯或能力的第一印象,同时也会给阅读者 ...

  5. MySQL全面瓦解20:可编程性之流程控制语句

    背景 说到流程控制语句,我们在程序语法中用的比较多,比如C#的if..else...,while...,?: 等.同样的,在MySQL中,也有一些流程控制的语法,方便我们在写函数.存储过程的时候对逻辑 ...

  6. Python安装教程之anaconda篇

    [导读]我们知道,Python的功能非常强大.那么对于迫切想学习Python的新手同学来说,第一件事情可能需要了解python是什么?能用来做什么?语法结构是怎样的?这些我们几句话很难介绍清楚,后续会 ...

  7. Python 中 lru_cache 的使用和实现

    在计算机软件领域,缓存(Cache)指的是将部分数据存储在内存中,以便下次能够更快地访问这些数据,这也是一个典型的用空间换时间的例子.一般用于缓存的内存空间是固定的,当有更多的数据需要缓存的时候,需要 ...

  8. 前端知识(二)08-Vue.js的路由-谷粒学院

    目录 一.锚点的概念 二.路由的作用 三.路由实例 1.复制js资源 2.创建 路由.html 3.引入js 4.编写html 5.编写js 一.锚点的概念 案例:百度百科 特点:单页Web应用,预先 ...

  9. Python数据模型与Python对象模型

    数据模型==对象模型 Python官方文档说法是"Python数据模型",大多数Python书籍作者说法是"Python对象模型",它们是一个意思,表示&quo ...

  10. linux总线

    编写驱动程序: 1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <linux/devic ...