一、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. UOJ #62. 【UR #5】怎样跑得更快

    题目分析 显然不可能高斯消元. 考虑反演. \(b_i=\sum\limits_{j=1}^n\gcd(i,j)^C\cdot \text{lcm}(i,j)^D\cdot x_j\) \(b_i=\ ...

  2. 【[USACO13NOV]没有找零No Change】

    其实我是点单调队列的标签进来的,之后看着题就懵逼了 于是就去题解里一翻,发现楼上楼下的题解说的都好有道理, f[j]表示一个再使用一个硬币就能到达i的某个之前状态,b[now]表示使用那个能使状态j变 ...

  3. Centos6 Ngnix和fastcgi搭建

    一.下载Nginx 依赖pcre,zlib,openssl 下载解压包,解压后进入 ./configue make make install 默认安装到/usr/local/ngnix 可执行文件在/ ...

  4. Junit单元测试多线程的问题

    今天下午很快完成了一个接口的监控功能,然后屁颠屁颠地用Junit开始单元测试.然后我就开始陷入崩溃的边缘... 监控结束后需要将监控结果以邮件的形式发送给运营的小伙伴维护,前面测试还是很顺利,到了开多 ...

  5. jpa的修改更新操作

    ***指定id的保存就等于修改!!! save 指定id直接调用save()

  6. iframe父页调子页和子页调父页方法

    子页调用父页 window.parent.myChart.resize(); 父页调用子页 $("iframe")[0].contentWindow.myChart.resize( ...

  7. 【SPJ6285 NGM2 - Another Game With Numbers】 题解

    题目链接:https://www.luogu.org/problemnew/show/SP6285 唉好久之前校内模拟赛的题目 嘴上说着明白但是实现起来我的位运算太丑陋了啊! #include < ...

  8. @class CLASS ;必须加分号,且卸载@interface之前

    1. @class CLASS ;必须加分号,且卸载@interface之前 示例代码如下: #import <UIKit/UIKit.h> @class WZProduct;  //注意 ...

  9. Knowledge Point 20180305 详解精度问题

    1.1 精度与基本数据类型运算的深度解析 我们在探讨Java基本数据类型时多次提到过精度的问题,那么计算机中的精度究竟是什么样的,为什么我们有时候的计算和我们预期的不同呢?下面我们通过精度来了解: 1 ...

  10. Web—03-神器Photoshop

    常用图片格式 1.psd photoshop的专用格式. 优点:完整保存图像的信息,包括未压缩的图像数据.图层.透明等信息,方便图像的编辑. 缺点:应用范围窄,图片容量相对比较大. 2.jpg 网页制 ...