文章目录

  • 一、分布式基本知识
    • 1.1) 架构演变
    • 1.2)、分布式基本概念
  • 二、RPC简介
    • 2.1) RPC概念
    • 2.2) RPC核心模块
  • 三、Dubbo原理简介
    • 3.1) Dubbo简介
    • 3.2) 核心功能
    • 3.3) 原理简介
  • 四、Dubbo安装部署
    • 4.1) Zookeeper安装
    • 4.2) Dubbo监控平台部署
  • 五、Dubbo例子
  • 参考资料

一、分布式基本知识

1.1) 架构演变

先给出dubbo官方的图,图片表示了架构的演变。然后我说一下自己的理解。

应用最开始是单体应用,即一个应用包括了所有应用模块。

随后就是垂直应用架构,也就是将系统拆分为多个应用模块。

随后就是RPC架构,之前的垂直应用架构其实可以说是在一个进程内的通讯,而RPC就是一种进步,RPC是进程之间的通讯,远程过程调用就是这么来的。

有了RPC之后,虽然可以实现进程之间的通讯,但是服务器集群后的服务器资源利用有些时候容易造成浪费,比如有个系统,一般情况都是不能很好地预估需要分配多少机器的,很容易造成一种情况就是业务访问很频繁的模块分配了不足的机器,而访问不是很频繁的模块分配了太多的机器,这种情况就不能实现资源的很好利用,所以针对这种情况就有了SOA(Service Oriented Architecture)的出现,SOA其实就是一个服务注册中心,可以实现资源调度,合理地分配资源,提高资源调度,是一个治理中心。

1.2)、分布式基本概念

所以我们了解了架构演变之后,就可以更好的理解分布式,分布式其实就是一种可以实现不同进程之间通讯的架构,然后进程之间怎么通讯的?一般都是通过RPC框架实现。比如Java方面的,Dubbo框架或者Spring Cloud。

二、RPC简介

2.1) RPC概念

RPC:全称远程过程调用,是一种进程间的通信的方式,它所做的事情就是实现进程内的通信,允许调用另外一个地址空间,可以是共享网络里的另外一台机器。

2.2) RPC核心模块

RPC有两个核心模块:通信和序列化

三、Dubbo原理简介

3.1) Dubbo简介

Dubbo是阿里巴巴开源的一款Java RPC框架,现在已经捐赠给Apache
官网:http://dubbo.apache.org/

3.2) 核心功能

a、智能容错和负载均衡

b、服务注册和发现

c、面向接口的远程方法调用

3.3) 原理简介

上图是Dubbo官方的图

角色

Provider:暴露服务的服务提供者

Container:服务运行的容器

Consumer:调用远程服务的消费者

Registry:服务注册和发现的注册中心

Minitor:统计服务调用次数和时间的监控中心

调用

下面根据我的理解说明一下

0:服务器容器负责启动、加载、运行服务提供者

1:服务提供者在启动后就可以向注册中心暴露服务

2:服务消费者在启动后就可以向注册中心订阅想要的服务

3:注册中心向服务消费者返回服务调用列表

4:服务消费者基于软负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了

5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心

四、Dubbo安装部署

4.1) Zookeeper安装

因为没有实践过linux系统的安装,所以本博客只介绍window系统的安装,当然linux安装dubbo环境也不会难。Dubbo的注册中心实现有很多种,比如Redis、Multicast等等,不过官方推荐的还是Zookeeper,所以本博客选Zookeeper注册中心搭建进行介绍。

下载Zookeeper
https://archive.apache.org/dist/zookeeper/
ps:先下载Zookeeper,因为3.5.X的都是公测版或者内测版,所以有可能不太稳定,不建议下载。

修改配置文件
解压下载好的Zookeeper压缩文件,zookeeper-3.4.13的配置文件在conf文件夹下面,可以看到里面有个zoo_sample.cfg的文件,我们需要修改文件名称,不然会出现文件找不到,将文件名称改为zoo.cfg

这里主要改一下Zookeeper临时文件夹,默认是linux系统的tmp/zookeeper,我修改后的配置如下:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# Linux系统下的临时目录
# dataDir=/tmp/zookeeper
dataDir=../tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

启动Zookeeper
在bin目录下面,有个zkServer.cmd文件,这是Zookeeper服务端启动的文件,点击启动

zkCli.cmd是客户端启动文件,我们点击启动,Zookeeper是一个树形目录结构的

### get根目录
[zk: localhost:2181(CONNECTED) 1] get /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
### 看一下根目录下面有什么,默认有Zookeeper这个目录
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper]
### 在根目录下面创建一个taoshop的目录,并写值"mytest"
[zk: localhost:2181(CONNECTED) 3] create -e /taoshop mytest
Created /taoshop
### 查看一下,创建成功
[zk: localhost:2181(CONNECTED) 4] ls /
[taoshop, zookeeper]
### 查看一下taoshop目录下面有什么,可以看到"mytest"这个保存的值
[zk: localhost:2181(CONNECTED) 5] get /taoshop
mytest
cZxid = 0x6
ctime = Sun Nov 04 20:54:19 CST 2018
mZxid = 0x6
mtime = Sun Nov 04 20:54:19 CST 2018
pZxid = 0x6
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000250f2010000
dataLength = 6
numChildren = 0

4.2) Dubbo监控平台部署

下载一下Dubbo提供的监控平台,可以先去下载master分支,有看到一个develop分支,不过感觉develop分支的还没稳定下来,根据自己需要下载,我就是下载master版本的
https://github.com/apache/incubator-dubbo-ops/tree/master

可以git clone一下https://github.com/apache/incubator-dubbo-ops.git

git clone https://github.com/apache/incubator-dubbo-ops.git

然后到dubbo-admin下面打包一下
incubator-dubbo-ops-master/dubbo-admin

mvn clean package

完成后,到该目录target下面发现一个jar,cmd运行

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

当然也可以写个简单的bat脚本来执行,不用每次都敲命令,创建一个startDubboAdmin.bat文件
敲上以下脚本,然后保存,下次就不用再敲命令了,不过jar文件要和bat文件放在同级目录

@echo off
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

访问Dubbo管理平台

http://localhost:7001/

输入账号密码root/root

Dubbo监控平台配置
在官方下载的incubator-dubbo-ops-master/dubbo-monitor-simple下面
使用maven命令打包一下

mvn clean package

然后在target文件夹下面会生成
dubbo-monitor-simple-2.0.0-assembly.tar.gz压缩文件夹,我们解压一下,然后
在dubbo-monitor-simple-2.0.0-assembly/dubbo-moitor-simple-2.0.0/assembly.bin文件夹下面可以看到start.bat文件,start.sh是linux系统的。win系统可以点击start.bat运行,运行之后访问127.0.0.1:8080,可以看到Dubbo官方提供的一个监控平台页面

五、Dubbo例子

下面简单写个例子实践一下Dubbo
Dubbo是处理分布式架构的一种很不错的RPC框架,官方文档比较齐全。
下面是Dubbo官方给的架构分包建议。ps:Dubbo现在暂不能支持分布式事务,所以服务定义的时候要设计好,尽量避免分布式事务的处理

建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。

服务提供者实现
maven加上jar,Zookeeper注意加上去除log4j依赖,假如你项目引入其它版本的log4j的话,容易造成jar冲突

  <exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions>

dubbo配置,我放在一个common工程,taoshop-common-rpc

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><dubbo.springboot.version>1.0.0</dubbo.springboot.version><zookeeper.version>3.4.6</zookeeper.version></properties><dependencies><dependency><groupId>io.dubbo.springboot</groupId><artifactId>spring-boot-starter-dubbo</artifactId><version>${dubbo.springboot.version}</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>${zookeeper.version}</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency></dependencies>

provider工程一般是Service工程,我新建一个taoshop-provider-item订单工程

<!--API接口工程 -->
<dependency><groupId>com.muses.taoshop.provider-api</groupId><artifactId>taoshop-provider-api-item</artifactId><version>1.0-SNAPSHOT</version></dependency>
<!-- 有dubbo相关jar的工程--><dependency><groupId>com.muses.taoshop.common</groupId><artifactId>taoshop-common-rpc</artifactId><version>1.0-SNAPSHOT</version></dependency>

dubbo配置:

spring.dubbo.application.name=taoshop-provider-item
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.muses.taoshop

业务接口实现:
注意点:这里要加上dubbo提供的@Service注解,而不是spring框架提供的@Service注解

com.alibaba.dubbo.config.annotation.Service

package com.muses.taoshop.item.service;import com.alibaba.dubbo.config.annotation.Service;
import com.muses.taoshop.item.entity.ItemDetail;
import com.muses.taoshop.item.entity.ItemPortal;
import com.muses.taoshop.item.entity.ItemSpec;
import com.muses.taoshop.item.mapper.ItemMapper;
import org.springframework.beans.factory.annotation.Autowired;import java.util.List;/*** <pre>*  商品信息服务实现类* </pre>** @author nicky* @version 1.00.00* <pre>* 修改记录*    修改后版本:     修改人:  修改日期: 2018.06.24 22:37    修改内容:* </pre>*/
@Service(version = "1.0.0")
public class ItemServiceImpl implements IItemService {@AutowiredItemMapper itemMapper;/*** 在门户网站列出商品粗略信息** @return*/@Overridepublic List<ItemPortal> listItemPortal() {return itemMapper.listItemPortal();}/*** 获取商品详情信息* @return ItemDetail*/@Overridepublic ItemDetail getItemDetailInfo(int spuId){ItemDetail itemDetail = itemMapper.getItemDetail(spuId);return  itemDetail;}}

随意写个SpringBoot启动类:

package com.muses.taoshop.item;/*** <pre>*  服务提供者* </pre>** @author nicky* @version 1.00.00* <pre>* 修改记录*    修改后版本:     修改人:  修改日期: 2018.11.17 23:24    修改内容:* </pre>*/
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;import java.util.concurrent.CountDownLatch;@SpringBootApplication
//@ImportResource({"classpath:dubbo-provider.xml"})
public class ItemProviderApplication {//  private static final Logger logger = Logger.getLogger(ItemProviderApplication.class);@Beanpublic CountDownLatch closeLatch() {return new CountDownLatch(1);}public static void main(String[] args) throws InterruptedException {ApplicationContext ctx = SpringApplication.run(ItemProviderApplication.class, args);
//      logger.info("项目启动!");
//      CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
//      closeLatch.await();}}

启动一下provider,在监控平台上可以看到启动成功的服务,服务接口暴露成功

服务消费者
Dubbo配置:

spring.dubbo.application.name=taoshop-consume-portal
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.scan=com.muses.taoshop
spring.dubbo.monitor.protocol=registry

xml配置就是这样的
自动发现

<dubbo:monitor protocol="registry"></dubbo:monitor>

引用,主要是引入import com.alibaba.dubbo.config.annotation.Reference;

@Reference
IItemService iItemService;

参考资料

SpringBoot+Dubbo

零基础搭建一套微服务框架(Spring Boot + Dubbo + Docker + Jenkins)

Dubbo系列之微服务框架整合教程相关推荐

  1. 「微服务系列」微服务框架的介绍

    为什么要学习微服务框架知识? 从求知的角度.企业的角度,微服务都是必知必会的! 需要学习哪些微服务知识? 传统单点架构,无法承载高并发场景:微服务领域按功能模块,将应用拆分成多个服务.大型企业可能拆分 ...

  2. go-zero微服务框架入门教程

    为什么使用go-zero 你还在手撕微服务?快试试 go-zero 的微服务自动生成神器,这可能是我见过最简单好用的微服务框架. 还有比它更简单好用的吗?欢迎留言评论和推荐. 几分钟搞定个接口和微服务 ...

  3. JavaEE 企业级分布式高级架构师(十三)微服务框架 SpringCloud (H 版)(1)

    Spring Cloud学习笔记 Spring Cloud入门 分布式技术图谱 Spring Cloud简介 官网介绍 百度百科 总结 Spring Cloud的国内使用情况 Spring Cloud ...

  4. serverless 框架_Malaguv1.4.1支持Serverless的微服务框架

    Malagu 框架简介 Malagu 基于 TypeScript 的 Serverless First.组件化.平台无关的渐进式应用框架. 背景 当我们着手开发一个新项目的时候,单体和微服务架构该如何 ...

  5. python的flask微服务-flask微服务框架的初步接触

    测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时, 常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicel ...

  6. Java 微服务框架对比:Dubbo 和 Spring Cloud

    微服务特点: 微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成. 独立部署 松耦合 单一职责,每个服务仅关注一件任务 微服务框架 相关概念: rpc 1. ...

  7. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    本文你将学到什么? 本文将以原理+实战的方式,首先对"微服务"相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 项目完整源码下载 https://github ...

  8. Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 微服 ...

  9. 两大微服务框架dubbo和spring cloud对比

    一.基本介绍 dubbo Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案.简单的说,Dubbo 就是个服务框架,说白了就是个远程服务 ...

最新文章

  1. C语言文件操作函数大全
  2. php获取访问浏览器,php获取访问者浏览器
  3. jzoj1281-旅行【dp】
  4. pyqt5 最小化 系统托盘_Qt中如何使窗口隐藏/最小化到托盘
  5. 计算机应用基础 a卷,计算机应用基础笔试A卷.doc
  6. python 生成器和迭代器介绍
  7. asp.net MVC:CheckBoxFor 绑定 nullablebool 类型
  8. Cinder组件解析
  9. Xcode 高级调试技巧
  10. 有三个桶,两个大的可装8斤的水,一个小的可装3斤的水,现在有16斤水装满了两大桶就是8斤的桶,小桶空着,如何把这16斤水分给4个人,每人4斤。没有其他任何工具,4人自备容器,分出去的水不可再要回来。
  11. 微信小程序开发部署发布可以在10分钟内完成
  12. 错误号 MSSQL_REPL20011 错误号:15517
  13. 八个有价值的消费者心理
  14. Excel妙用-公式结果我都要
  15. Python类和包的介绍
  16. vivo手机系统android9,vivo终于推送Android9.0,这几款机型你有吗?V粉们已经迫不及...
  17. 二级计算机vf里的sql,计算机二级考试vf常用sql语句
  18. 国产直流马达驱动芯片SS6216的功能参数以及应用
  19. RAID技术规范简介 RAID0 RAID1 RAID2 RAID3 RAID4 RAID5 RAID6 RAID7
  20. 【有奖测评】我的产品你来反馈,有奖

热门文章

  1. LoadRunner使用
  2. 网络嗅探 精华版(全)
  3. 解决”Windows已经保护您的电脑”的三个方法
  4. 游戏开发 - 开发流程 - 收集
  5. 【STM32】PWM 输出 (标准库)
  6. [MS Project]Project软件入门两天之旅
  7. 通过PS把月亮“搬”到自己的床上
  8. pytorch 定义torch类型数据_PyTorch 使用 TorchText 进行文本分类
  9. mysql lucene 结合_Lucene基础(四)-- 结合数据库使用
  10. MySQL 聚集索引(InnoDB)和 非聚集索引(MyISAM) 精讲~两张图彻底搞懂