目录

  • 前言
  • 1. 分布式系统
    • 1.1 发展演变
    • 1.2 PRC
  • 2. dubbo核心概念
  • 3. dobbo环境搭建
    • 3.1 zookeeper
    • 3.2 监控中心
  • 4. 入门项目
    • 4.1 无dubbo
      • 4.1.1 接口工程
      • 4.1.2 提供者工程
      • 4.1.3 消费者工程
    • 4.2 结合dubbo
      • 4.2.1 接口工程
      • 4.2.2 提供者工程
      • 4.2.3 消费者工程
    • 4.3 dubbo注解
  • 5. 监控中心
  • 6. springboot集成dubbo
    • 6.1 接口工程
    • 6.2 提供者工程
    • 6.3 消费者工程
  • 7. dubbo配置解析
    • 7.1 配置属性优先级
    • 7.2 启动检查
    • 7.3 超时时间
    • 7.4 重试次数

前言

本博文的总结
基于尚硅谷Dubbo教程(dubbo经典之作)

在讲述dubbo之前先补充分布式系统的具体概念架构等知识

1. 分布式系统

分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统

1.1 发展演变

1.单一应用架构:流量很小,访问量很小,所有功能都部署在一个服务器,开发简单部署简单,适用于小型网站,简化增删改查工作量的数据访问框架(ORM)是关键
缺点: 性能扩展难; 协同开发问题难;不利于升级维护;

2.垂直应用架构:将应用拆成互不相干的几个应用,每个应用都是比较完整的,分工合作以提升效率,性能提高,可扩展。用于加速前端页面开发的Web框架(MVC)是关键
缺点:每个页面都是完整的,如果一改动需要改变界面和业务逻辑,无法重复利用。应用之间不可能完全分离,还需要交互的。

3.分布式服务架构:应用之间还需要交互,可将其上面的核心业务逻辑提取出来作为独立的服务,逐渐形成稳定的服务中心。用于提高业务复用及整合的分布式服务框架(RPC)是关键。RPC主要为远程过程调用

4.流动计算架构:当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键。

1.2 PRC

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式。A服务器调用B服务器的功能,主要是技术上的规范而已

决定RPC:通讯和序列化
PRC的框架为dubbo等

2. dubbo核心概念

dubbo的官网

高性能的java RPC框架主要是不同服务器之间如何调用如何执行通过dubbo

特点:

  • 面向接口代理的高性能,不需要了解其细节
  • 负载均衡,让每个服务器都有一样的负载量
  • 服务自动注册与发现,所有服务都注册到注册中心中,通过清单执行哪个服务
  • 高度可扩展能力
  • 运行期间流量调度,实现灰度发布(配置不同的路由规则,先让某些服务器升级)
  • 可视化的服务治理与运维,可视化的web界面调整一些参数等

具体框架如图所示


服务提供者(Provider):向注册中心注册自己提供的服务。
服务消费者(Consumer): 向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

3. dobbo环境搭建

3.1 zookeeper

如果想详细了解可查看我这篇文章
Zookeeper从入门到精通(全)

具体配置以及常见的错误,文章如下:

  1. Zookeeper的安装配置详解(window / linux)
  2. zookeeper启动过程出现zkServer.sh: command not found解决方法
  3. zookeeper启动时出现Starting zookeeper … FAILED TO START超全诠释的解决方案

该注册中心有多种,主要讲述Zookeeper注册中心
在官网下载zookeeper的版本后,也可以通过该资源下载

bin目录为二进制可执行文件

解压运行zkServer.cmd,第一次会出错


会出现配置文件找不到
需要在conf中添加zoo_sample.cfg的一个副本
其代码主要讲解:

dataDir=  //临时数据存储的目录(可写相对路径)
clientPort=2181   //zookeeper的端口号

在其dataDir中修改路径为../data
建立一个与bin目录同层次的data文件夹

启动zkServer.cmd

连接其服务器zkCli.cmd

基本的简单操作:
create -e /manongyanjiuseng 123456 创建一个临时节点,值为123456
ls / 列出根节点
get / 列出根节点值

3.2 监控中心

通过dubbo中的github中下载监控中心

  1. 进入目录 修改路径dubbo-admin配置
    修改 incubator-dubbo-ops-master\dubbo-admin\src\main\resources\application.properties 指定zookeeper地址

  2. 在dubbo-admin中的pom.xml中,
    dubbo2.6以后都是jar包形成,之前都是web包
    通过mvn clean package打包

  3. 通过运行java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

  4. 打开localhost的网址以及端口号
    http://localhost:7001/

    账号和密码都是root

4. 入门项目

4.1 无dubbo

4.1.1 接口工程

bean的对象类
继承这个序列化Serializable类主要是为了防止序列化

/*** 用户地址* @author lfy**/
public class UserAddress implements Serializable {private Integer id;private String userAddress; //用户地址private String userId; //用户idprivate String consignee; //收货人private String phoneNum; //电话号码private String isDefault; //是否为默认地址    Y-是     N-否public UserAddress() {super();// TODO Auto-generated constructor stub}public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum,String isDefault) {super();this.id = id;this.userAddress = userAddress;this.userId = userId;this.consignee = consignee;this.phoneNum = phoneNum;this.isDefault = isDefault;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserAddress() {return userAddress;}public void setUserAddress(String userAddress) {this.userAddress = userAddress;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getConsignee() {return consignee;}public void setConsignee(String consignee) {this.consignee = consignee;}public String getPhoneNum() {return phoneNum;}public void setPhoneNum(String phoneNum) {this.phoneNum = phoneNum;}public String getIsDefault() {return isDefault;}public void setIsDefault(String isDefault) {this.isDefault = isDefault;}}

接口地址

public interface UserService {/*** 按照用户id返回所有的收货地址* @param userId* @return*/public List<UserAddress> getUserAddressList(String userId);}

4.1.2 提供者工程

引入接口工程的依赖文件

<dependency><groupId>com.atguigu.gmall</groupId><artifactId>gmall-interface</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

引入业务逻辑的实现

public class UserServiceImpl implements UserService {@Overridepublic List<UserAddress> getUserAddressList(String userId) {// TODO Auto-generated method stubreturn userAddressDao.getUserAddressById(userId);}}

4.1.3 消费者工程

同样也是引入接口工程的依赖文件
和上面的相同概念
之后调用接口并且执行等

public class OrderService {UserService userService;/*** 初始化订单,查询用户的所有地址并返回* @param userId* @return*/public List<UserAddress> initOrder(String userId){return userService.getUserAddressList(userId);}}

4.2 结合dubbo

但问题来了三个方程都处于不一样的地方,文件会执行不了

配合一些基本的逻辑搭建一个dubbo的项目框架

一开始建议将服务接口,服务模型,服务异常等都均放在api包中,因为服务模型及异常也是api的一部分

4.2.1 接口工程

接口工程与上面的接口同理

4.2.2 提供者工程

将服务提供者注册到注册中心

导入dubbo依赖以及操作zookeeper客户端的依赖

<!-- 引入dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.2</version>
</dependency>
<!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version>
</dependency>

dubbo的依赖文件区分版本主要如下

<!-- 引入dubbo --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.2</version></dependency><!-- 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper dubbo 2.6以前的版本引入zkclient操作zookeeper dubbo 2.6及以后的版本引入curator操作zookeeper 下面两个zk客户端根据dubbo版本2选1即可 --><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version></dependency><!-- curator-framework --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version></dependency>

配置服务提供者
使用spring配置声明暴露服务
先设置dubbo的名称空间

<!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
<dubbo:application name="user-service-provider"></dubbo:application><!-- 2、指定注册中心的位置 -->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry><!-- 3、指定通信规则(通信协议?通信端口) -->
<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol><!-- 4、暴露服务   ref:指向服务的真正的实现对象 -->
<dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0"><dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
</dubbo:service><!--统一设置服务提供方的规则  -->
<dubbo:provider timeout="1000"></dubbo:provider><!-- 服务的实现 -->
<bean id="userServiceImpl01" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>

加载spring的配置并且启动
测试代码

public class MainApplication {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");ioc.start();System.in.read();}}

System.in.read();这行代码主要是不让代码程序终止

4.2.3 消费者工程

让服务消费者去注册中心订阅服务提供者的服务地址

引入接口工程的依赖文件

<dependency><groupId>com.atguigu.gmall</groupId><artifactId>gmall-interface</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

导入dubbo依赖以及操作zookeeper客户端的依赖

<!-- 引入dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.2</version>
</dependency>
<!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version>
</dependency>

使用spring配置声明暴露服务
先设置dubbo的名称空间

<context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan><dubbo:application name="order-service-consumer"></dubbo:application><dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>

之后就有对象被注入到容器中可以去使用
通过界面层类

@Service
public class OrderServiceImpl implements OrderService {@AutowiredUserService userService;@Overridepublic List<UserAddress> initOrder(String userId) {// TODO Auto-generated method stubSystem.out.println("用户id:"+userId);//1、查询用户的收货地址List<UserAddress> addressList = userService.getUserAddressList(userId);for (UserAddress userAddress : addressList) {System.out.println(userAddress.getUserAddress());}return addressList;}}

测试类
通过获取xml配置文件之后getbean获取对象

public class MainApplication {@SuppressWarnings("resource")public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");OrderService orderService = applicationContext.getBean(OrderService.class);orderService.initOrder("1");System.out.println("调用完成....");System.in.read();}}

4.3 dubbo注解

通过注解实现交互
服务提供者

 <dubbo:application name="gmall-user"></dubbo:application><dubbo:registry address="zookeeper://118.24.44.169:2181" /><dubbo:protocol name="dubbo" port="20880" />
<dubbo:annotation package="com.atguigu.gmall.user.impl"/>
import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.UserService;
import com.atguigu.gmall.user.mapper.UserAddressMapper;@Service //使用dubbo提供的service注解,注册暴露服务
public class UserServiceImpl implements UserService {@AutowiredUserAddressMapper userAddressMapper;

服务消费者

<dubbo:application name="gmall-order-web"></dubbo:application>
<dubbo:registry address="zookeeper://118.24.44.169:2181" />
<dubbo:annotation package="com.atguigu.gmall.order.controller"/>@Controller
public class OrderController {@Reference  //使用dubbo提供的reference注解引用远程服务UserService userService;

5. 监控中心

图形化的服务管理页面安装时徐娅指定注册中心地址,即可从注册中心获取到所有的提供者,消费者进行配置管理

在官网安装完成之后,通过mvn pcckage 生成监控中心的jar包
先不要提前运行jar包,将其压缩包解压后
在配置文件中查看其配置并且修改
在conf中的配置文件中主要是zookeeper的ip地址以及端口号的通信地址配置等
之后没有错误则启动bat文件

主要是在提供者和消费者的依赖文件中添加
消费者的依赖文件

<dubbo:monitor protocol="registry"></dubbo:monitor>
<!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> -->

提供者的依赖文件

<!-- 连接监控中心 -->
<dubbo:monitor protocol="registry"></dubbo:monitor>

6. springboot集成dubbo

有spring的区别主要是
通过使用依赖文件,继承了dubbo的配置
不需要使用xml的粗糙配置,只需要通过注解还有配置文件即可
主要的注解有扫描springboot启动,@service以及@reference这些
配置文件主要是配置端口ip等地址

这部分依赖文件主要是涉及提供者工程和消费者工程不涉及接口工程

导入依赖:dubbo-starter以及dubbo的其他依赖
依赖文件如下

<dependency><groupId>com.atguigu.gmall</groupId><artifactId>gmall-interface</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version>
</dependency>

之前都是配置远程调用的接口以及服务
但是如果服务太多的话,就很麻烦
现在通过注解方式进行配置

6.1 接口工程

如上所示

6.2 提供者工程

导入依赖后
需要配置相对应的配置
该配置文件的主要解析如下

配置 描述
application.name 服务名,不能跟别的dubbo提供端重复
registry.protocol 注册中心协议
registry.address 注册中心的地址加端口号
protocol.name 分布式固定是dubbo
base-package 注解方式要扫描的包
dubbo.application.name=user-service-provider
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeperdubbo.protocol.name=dubbo
dubbo.protocol.port=20881dubbo.monitor.protocol=registry
dubbo.scan.base-packages=com.atguigu.gmall

上面这部分的文件主要和xml的配置是一样的

服务的暴露和xml配置中的这个同理

<!-- 服务的实现 --><bean id="userServiceImpl01" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>

提供者层面的代码
使用@Service暴露服务

@Service//暴露服务
@Component
public class UserServiceImpl implements UserService {@Overridepublic List<UserAddress> getUserAddressList(String userId) {// TODO Auto-generated method stubSystem.out.println("UserServiceImpl..3.....");UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");if(Math.random()>0.5) {throw new RuntimeException();}return Arrays.asList(address1,address2);}}

在主程序的界面中还要添加基于注解的开启

//@EnableDubbo //开启基于注解的dubbo功能
@SpringBootApplication
public class BootUserServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(BootUserServiceProviderApplication.class, args);}
}

6.3 消费者工程

导入依赖后
需要配置相对应的配置
以为提供者工程的端口是8080
为了防止被占用,使用的端口号是8081

server.port=8081dubbo.application.name=boot-order-service-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.monitor.protocol=registry

要使用声明远程调用的服务,在消费者中使用的是@Reference远程引用service服务

具体其service层面的代码

@Service
public class OrderServiceImpl implements OrderService {//@Autowired@ReferenceUserService userService;@Overridepublic List<UserAddress> initOrder(String userId) {// TODO Auto-generated method stubSystem.out.println("用户id:"+userId);//1、查询用户的收货地址List<UserAddress> addressList = userService.getUserAddressList(userId);return addressList;}}

消费者的控制层面代码如下

@Controller
public class OrderController {@AutowiredOrderService orderService;@ResponseBody@RequestMapping("/initOrder")public List<UserAddress> initOrder(@RequestParam("uid")String userId) {return orderService.initOrder(userId);}}

7. dubbo配置解析

7.1 配置属性优先级

配置规则的具体优先级别从上往下

7.2 启动检查

所谓的检查是如果只开启了消费者,而没有开启生产者则会直标出错
如果关闭检查,直接开启消费者,消费者工程有输出也会输出结果

<!-- 配置当前消费者的统一规则:所有的服务都不检查 -->
<dubbo:consumer check="false" timeout="5000"></dubbo:consumer>

或者是

<dubbo:reference interface="com.atguigu.gmall.service.UserService" id="userService" checkt="false">

7.3 超时时间

由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间。

  • 方法级优先,接口级次之,全局配置再次之
  • 如果级别一样,消费方优先,提供方次之
全局超时配置
<dubbo:consumer timeout="5000" />指定接口以及特定方法超时配置
<dubbo:reference interface="com.foo.BarService" timeout="2000"><dubbo:method name="sayHello" timeout="3000" />
</dubbo:reference>

7.4 重试次数

失败自动切换,当出现失败,重试其它服务器,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)。

重试次数配置如下:
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference><dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

Dubbo从入门到精通(全)相关推荐

  1. 原型设计大师:Axure RP网站与APP设计从入门到精通(全彩) 中文pdf扫描版

    原型设计大师:Axure RP网站与APP设计从入门到精通内容丰富且实用,由浅入深地传授了Axure 原型设计工具在网站和APP设计中的应用与技巧,并在文中贯穿了众多精彩实战案例.书中完整展现了多个鲜 ...

  2. Arduino从入门到精通全课时教程分享

    Arduino从入门到精通全课时教程分享 欢迎使用Arduino全套教程下载 课程详细图片 链接:https://pan.baidu.com/s/1a2xMyWa6n5de1WlRulSmYQ 提取码 ...

  3. python从入门到精通清华_java从入门到精通(第5版)+python从入门到精通+c语言从入门到精通 全3册 清华大学出版社...

    <JAVA从入门到精通(第5版)> <Java从入门到精通(第5版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识 ...

  4. xxljob从入门到精通-全网段最全解说

    XXL-JOB特性一览 基本概念 xxljob解决的是以下几个痛点: 1) 跑批处理监控无法可视化,当前跑批的状态是:成功?失败?挂起?进度?为什么失败/原因? 2)批处理任务不可重用,特别是无法对批 ...

  5. 云之梦php免费教学视频下载_2017年8月云知梦php入门到精通全栈开发全套教程+laravel商城...

    php全栈工程师 云知梦 2017.7月底更新截止. 全套教程一共172集,每天两小时深入讲解,注意只是讲,课下自己要练习,总和86天课程,直到完全掌握php后端开发 从基础变量函数.mysql.缓存 ...

  6. Altium Designer 20 19(入门到精通全38集)四层板智能车PCB设计视频教程AD19 AD20 凡亿----笔记

    某博主笔记1 又一博主笔记2 AD18的安装教程(包括资料) AD19在进行PCB设计时,板上的元器件全部被锁定,怎么解锁? PCB各层定义 AD中关于PCB规则的设置 画PCB要考虑生产:电子元件的 ...

  7. JQuery从入门到精通(全一章)

    活动地址:CSDN21天学习挑战赛 文章目录 学习目录 1.jQuery介绍 官网地址:(https://www.bootcdn.cn/jquery/) 2.JQuery对象基本使用方法 3.Java ...

  8. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

    目录 前言 1. 学习路线 2. 学习方法 前言 这篇文章主要总结我之前所学过的框架以及学习路线 从实打实的零基础到框架再到项目 之后实习工作 也在这篇博客中记录我的学习笔记 以及在笔记中遇到的配置安 ...

  9. JAVA入门到精通-第94讲-山寨QQ项目8-好友在线提示

    遇到的问题: 现在每登录一个人,后面的人是能看到前面的登录的人的: 但是,前面的人看不到后面的人登录: //后面每登录一个人,有责任去通知前面登录的人他已经上线了: 通知了完以后,需要更改好友在线的情 ...

最新文章

  1. 【基础积累】1x1卷积到底有哪些用处?
  2. python数字排序分组代码_python pandas 组内排序、单组排序、标号的实例
  3. Bootstrap验证控件的使用
  4. 中国食用香精行业品牌策略与销售渠道分析报告2022-2028年
  5. docker环境下指定jvm参数
  6. 线性规划总结3——单纯形法和对偶单纯形法
  7. 树莓派gparted启动失败解决方法
  8. 修改默认共享内存tmpfs大小
  9. 解决Ubuntu18.04没有声音(简便且终极方法)
  10. 《Python预测之美》送书活动,中奖名单公示
  11. 分享一款国外的优化IE9浏览器的软件感觉很好用兼容win7
  12. PHP笔记(CSS篇)
  13. Androd 如何使andorid应用程序的icon不在Launcher界面上显示
  14. 计算机基础cpu知识,CPU基础知识大全详解
  15. 数据特征分析方法总结
  16. tensorflow2.0 numpy.ndarray 与tenor直接互转
  17. Python的GUI图形界面工具大全
  18. tp5微信公众号开发(1) 申请公众号配置token验证
  19. html 搜索历史记录,使用cookie实现历史搜索记录功能
  20. JavaSE编码实操

热门文章

  1. CreateMutex函数
  2. oracle10g可视化界面,GUI图形化界面工具
  3. 无锡规划国家物联网示范区
  4. 深入浅出聊Taier—大数据分布式可视化DAG任务调度系统
  5. 服务器部署php环境,php服务器环境搭建方法
  6. bat脚本对文件目录的复制和移动
  7. 20kw-100kw光伏逆变器原理图 PCB 代码 20KW-100kw双路光伏BOOST三相三电平光伏并网逆变器
  8. Mac 修改文件夹权限
  9. 认识计算机系统学情分析,小学信息技术《认识计算机》说课稿——获奖说课稿...
  10. jdbc连接oracle教程