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

  二、dubbo的基本原理(这个是用于dubbo的工作原理比较重要的一个环节)

  

  这是图中的几个节点的意义

  • Provider:暴露服务的服务提供方,或者直白点说就是服务生产者
  • Consumer:调用远程服务的服务消费方,也就是服务消费者
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心
  • Container:服务(生产者)运行容器

  具体的调用步骤

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

  三、下面我会通过一个例子来说明具体的实现过程,以及配置

  1)说明:dubbo是用来做分布式工程而提出来的一个框架。相对于原来的单体工程来说,dubbo的灵活性,以及调整的方式都更加灵活。dubbo的方式是将service一下的单独提出来做成一个项目,也就是我们提到的SOA模式,面向服务的框架。在设计中,web端只看得到对应的接口,而不需要知道实现过程。具体的实现过程在另外一个项目实现。中间的通行通过zookeeper来实现传输。

  2)我这里写了一个简单的例子来说明这个服务提供的过程,和相对应用独立使用的过程。(目录)

  

  1、do-parent用来加载公用的jar包,没有实际代码

  a、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>com.troy</groupId>
<artifactId>do-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>do-interface</module>
<module>do-service</module>
<module>do-web</module>
</modules> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies> </project>

  2、do-interface用来提供暴露的接口,提供给do-web和do-service。共同的调用方法

  a、目录结构

  

  b、User共同使用的实体类

package com.troy.domain;

import javax.persistence.*;
import java.io.Serializable; @Entity
@Table(name = "USER")
public class User implements Serializable{ @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Integer age; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

  c、IUserService只用来提供接口,不做任何实现

package com.troy.service;

import com.troy.domain.User;

import java.util.List;

public interface IUserService {

    public List<User> findAll();
}

  d、application-dao.yml的配置用来连接数据库,这个因为我用的是一套数据库,所以公用的数据库配置

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/model?useUnicode=true&amp;characterEncoding=UTF-8
password: root
username: root

  3、do-service用来提供具体的接口实现

  a、目录结构

  

  b、repository用来,设置基本的数据库访问层

package com.troy.repository;

import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository; import java.io.Serializable; @NoRepositoryBean
public interface BaseRepository<T,I extends Serializable> extends PagingAndSortingRepository<T,I>,JpaSpecificationExecutor<T> { }
package com.troy.repository;

import com.troy.domain.User;

public interface UserRepository extends BaseRepository<User,Long> {

}

  c、service用来写具体的实现过程

package com.troy.service;

import com.troy.domain.User;
import com.troy.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; @Service(value = "userService")
@Transactional
public class UserServiceImpl implements IUserService { @Autowired
private UserRepository userRepository; public List<User> findAll() { List<User> users = new ArrayList<User>();
Iterator<User> iterator = this.userRepository.findAll().iterator();
while (iterator.hasNext()) {
users.add(iterator.next());
}
return users;
}
}

  d、config下面是进行相关的配置,对于服务提供者

package com.troy.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource; @Configuration
@ImportResource("classpath:dubbo/*.xml")
public class DubboProvider { }

  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:application name="dubbo-provider" /> <!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.5.10:2181" /> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 用户服务接口 -->
<dubbo:service interface="com.troy.service.IUserService" ref="userService" /> </beans>

  e、具体的启动过程

package com.troy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.HashMap;
import java.util.Map; @SpringBootApplication
public class ApplicationService { public static void main(String[] args) {
SpringApplication application = new SpringApplication(ApplicationService.class);
Map<String,Object> map = new HashMap<String, Object>();
//这里的目的是加入相关配置
map.put("spring.profiles.default","service,dao");
application.setDefaultProperties(map);
application.run(args);
}
}

  4、do-web的目的是用来获取数据,提供数据,当然也可以用来具体页面的呈现

  a、目录接口

  

  b、web,具体的数据提供者

package com.troy.web;

import com.troy.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/api/user")
@Scope("prototype")
public class UserResource { @Autowired
private IUserService userService; @RequestMapping(value = "/findAll")
public Object findAll() {
return this.userService.findAll();
}
}

  c、config消费者配置

package com.troy.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource; @Configuration
@ImportResource("classpath:dubbo/*.xml")
public class DubboConsumer { }

  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:application name="dubbo-consumer" /> <!-- 使用zookeeper注册中心暴露服务地址 -->
<!-- 注册中心地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.5.10:2181" /> <!-- 用户服务接口 -->
<dubbo:reference interface="com.troy.service.IUserService" id="userService" check="false" /> </beans>

  d、启动配置

package com.troy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.HashMap;
import java.util.Map; @SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
Map<String,Object> map = new HashMap<String, Object>();
map.put("spring.profiles.default","web,dao");
application.setDefaultProperties(map);
application.run(args);
}
}

  四、中间需要用到zookeeper,来做注册中心。

  zookeeper的安装部署:http://www.cnblogs.com/ll409546297/p/7526953.html

  zookeeper的展示界面:http://www.cnblogs.com/ll409546297/p/7814564.html

  五、dubbo的方式,目前各大网站上面应用的非常普遍。当然我这边只是做的一个例子用来,了解dubbo的分布式实现过程,和具体的应用方式。

  代码层面存在不理想的地方,请见谅!!!

  源码下载:https://pan.baidu.com/s/1c1SUnFa

dubbo之基础应用的更多相关文章

  1. 深入浅出微服务框架dubbo(一):基础篇

    一.基础篇 1.1 开篇说明 dubbo是一个分布式服务框架,致力于提供高性能透明化RPC远程调用方案,提供SOA服务治理解决方案.本文旨在将对dubbo的使用和学习总结起来,深入源码探究原理,以备今 ...

  2. 基于SOA分布式架构的dubbo框架基础学习篇

    以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...

  3. Dubbo入门基础与实例讲解(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,0 ...

  4. Dubbo(一) —— 基础知识和项目搭建

      一.分布式基础理论 1.什么是分布式系统? <分布式系统原理与范型>定义: “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distribut ...

  5. maven+dubbo+zookeeper 基础实例

    1.maven  引入依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  6. Dubbo学习总结(1)——Dubbo入门基础与实例讲解

    Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点.Dubbo是一个分布式服务框架,致力于 ...

  7. 【Dubbo】Dubbo+ZK基础入门以及简单demo

    参考文档: 官方文档:http://dubbo.io/ duboo中文:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/backgr ...

  8. Dubbo+zookeeper 基础讲解

    一.dubbo是什么? 1)本质:一个Jar包,一个分布式框架,,一个远程服务调用的分布式框架. 既然是新手教学,肯定很多同学不明白什么是分布式和远程服务调用,为什么要分布式,为什么要远程调用.我简单 ...

  9. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微服务架构.近期也看到各大技术社区开始组织一些沙龙和论坛来分享Spring Cloud的相关实施经验,这对于最近正在整理Spr ...

随机推荐

  1. UVa 10820 - Send a Table(欧拉函数)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. C# Hadoop学习笔记(七)—C#的云计算框架借鉴(下)

    转自:http://blog.csdn.net/black0707/article/details/12853049 在上篇里,我们主要讨论了,这个系统怎样处理大数据的“读”操作,当然还有一些细节没有 ...

  3. tensorflow的一些函数

    1.tf.constant(value,dtype=None,shape=None,name='Const') 注意这个函数创造的是一个常数tensor,而不是一个具体的常数 value:即可以是li ...

  4. 转-四种方案解决ScrollView嵌套ListView问题

    本人网上用的ID是泡面或安卓泡面,学习一年半之前开始从事Android应用开发,这是我写的第一篇Android技术文章,转载请注明出处和作者,有写的不好的地方还请帮忙指出,谢谢. 在工作中,曾多次碰到 ...

  5. HDU 1735 字数统计(模拟+一点点贪心的思想)

    题目戳我 字数统计 Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. 让NSArray数组中每个对象都调用的方法

    1. [array valueForKey:@"title"]; //Returns an array containing the results of invoking val ...

  7. h5中video的一些坑

    最近我们的项目做了有关短视频的功能,当然视频的合成还是在客户端来完成,涉及到前端页面的部分就是要有一个H5的落地页,这个页面上要有对视频进行播放.起初我觉得这事儿还是挺简单的,不就是在页面上放一个&l ...

  8. python对文件进行读写操作

    转:http://sucre.iteye.com/blog/704077 ython进行文件读写的函数是open或file file_handler = open(filename,,mode) Ta ...

  9. 设计一个方法injectBeforeAsyncSend,能够实现如下功能:在发起异步请求之前打印出请求的类型、URL、method、body、timestamp 等信息。

    异步请求逻辑注入 工作中我们需要对异步请求的请求信息打印日志,但是又不能耦合在业务代码中打印.请设计一个方法injectBeforeAsyncSend,能够实现如下功能:在发起异步请求之前打印出请求的 ...

  10. Jquery 操作 select 的操作指南

    这里我们以一个简单的select作为原型来进行说明: <select> <option value="a1">香蕉1</option> < ...