Dubbo框架基本使用

一:软件架构的演练过程【了解】

单体应用架构--->垂直应用架构--->分布式架构(SOA架构/微服务架构)`

 1.单体应用架构

单体应用架构,就是将一个系统的多个模块做成一个项目,然后部署到tomcat服务器上

优点:

        项目架构简单,开发,测试,部署成本低;

        项目部署在一个节点上,后期维护方便

缺点:

        项目模块之间紧密耦合,容错率低

        无法针对不同模块进行针对的扩容

2.垂直应用架构 

垂直应用架构,就是将原来的一个系统拆成成多个工程,然后每个工程部署在tomcat服务器上

* 优点:
    - 可以针对不同模块进行针对性的扩容
    - 一个系统的问题不会影响到其他系统,提高容错率
    
* 缺点:
    - 系统之间相互独立,会有重复的开发任务(造成了代码冗余)

 3.分布式架构(思想)

分布式架构就是指将服务层(service)单独启动,并部署在tomcat上对外提供服务,在controller中可以通过远程调用访问服务层中的方法

* 优点:
    - 抽取公共的功能为服务层,提高代码复用性

* 缺点:    
    - 调用关系错综复杂,难以维护,宕机以后不能及时更换

1.SOA架构

SOA结构,在分布式架构的基础上,增加一个调度中心对系统进行实时管理。

* 集群:
    多台服务器重复完成同一个任务,即同一个任务部署在多台服务器上

* 分布式:
    多台服务器协同完成同一个任务,即同一个任务拆分为多个子任务,多个子任务部署在多台服务器上协同完成同一个任务

 2.微服务架构(SpringCloud)

在这里SpringCloud先有一个概念,后边有挺多东西要学

架构体系先了解到这里

二:dubbo使用 

 首先我们看soa架构,里边要有调用中心,(不用担心,就相当于一个软件),最重要的就是rpc远程调用,dubbo就是rpc远程调用的一种框架

注意rpc 并不是一个新的技术,而是指整个网络远程调用过程

 1.Dubbo简介

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

官网地址:Apache Dubbo

发展历程

  • Dubbo是阿里巴巴内部使用的分布式业务框架,2012年由阿里巴巴开源

  • 在很短时间内,Dubbo就被许多互联网公司所采用,并产生了许多衍生版本,如网易,京东,新浪,当当等等

  • 由于阿里策略变化,2014年10月Dubbo停止维护。随后部分互联网公司公开了自行维护的Dubbo版本,比较著名的如当当DubboX

  • 经过三年的沉寂,在2017年9月,阿里宣布重启Dubbo项目,并决策在未来对开源进行长期持续的投入

  • 随后Dubbo开始了密集的更新,并将停摆三年以来大量分支上的特性及缺陷修正快速整合

  • 2018.2月,阿里将Dubbo捐献给Apache基金会,Dubbo成为Apache孵化器项目

RPC介绍

  • RPC全称为remote procedure call,即远程过程调用

  • 简单的讲,RPC可以让我们像调用本地方法一样来调用远程方法

  • 需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程

  • Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等

RMI、Hessian等一些远程调用 可以去了解

 2.Dubbo实现RPC调用的原理【面试】

节点 角色名称
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心(查看服务状态)
Container 服务运行容器

 

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

  1. 服务提供者在启动时,向注册中心注册自己提供的服务

  2. 服务消费者在启动时,向注册中心订阅自己所需的服务

  3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推 送变更数据给消费者。

  4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用, 如果调用失败,再选另一台调用。

  5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计 数据到监控中心。

特别重要

 3.SpringBoot整合Dubbo【重要】

这里应该还有Spring整合Dubbo 不过SpringBoot整合更简单写,企业开发用的更多一些

1.首先,先要有注册中心,这里用的是zookeeper

 

 

 然后启动,就ok了,这里只是当一个注册中心

 整体项目结构

 2.父项目导入依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.2.RELEASE</version>
</parent>

<properties>
	<java.version>1.8</java.version>
</properties>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter</artifactId>
	</dependency>
	<!--dubbo的起步依赖-->
	<dependency>
		<groupId>org.apache.dubbo</groupId>
		<artifactId>dubbo-spring-boot-starter</artifactId>
		<version>2.7.5</version>
	</dependency>

	<!-- zookeeper的api管理依赖 -->
	<dependency>
		<groupId>org.apache.curator</groupId>
		<artifactId>curator-recipes</artifactId>
		<version>4.2.0</version>
	</dependency>
	<!-- zookeeper依赖 -->
	<dependency>
		<groupId>org.apache.zookeeper</groupId>
		<artifactId>zookeeper</artifactId>
		<version>3.4.12</version>
	</dependency>
</dependencies>

接口:

public interface HelloService {
    String hello(String name);
}

Impl:


@Service//  dubbo的Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String hello(String name) {
        System.out.println(222);
        return "hello:" + name;

    }
}

提供者的启动类

@SpringBootApplication
public class ProvierApp1 {
    public static void main(String[] args) {
        SpringApplication.run(ProvierApp1.class,args);
    }
}

配置文件:(application.yml)

dubbo:
  application:
    name: springboot-provider1
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20080
  scan:
    base-packages: com.itheima.service

消费者:

@RestController
public class HelloController {
    @Reference
    private HelloService helloService;

    @GetMapping(value = "/name")
    public ResponseEntity hello(@RequestParam String name){
        String hello = helloService.hello(name);
        return ResponseEntity.ok(hello);
    }

}

消费者的启动类:


@SpringBootApplication
public class ConsumerApp1 {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp1.class,args);
    }
}

 配置文件:(application.yml)

dubbo:
  application: # 应用名称
    name: springboot-consumer1
  registry: # 连接注册中心
    address: zookeeper://127.0.0.1:2181
  scan:
    base-packages: com.itheima.service
  consumer: 
    timeout: 5000
    retries: 0

4.dubbo使用的一些小细节【重点】

1.扫描包:

<!--服务提供者和服务消费者都需要配置包扫描,
作用是扫描指定包(包括子包)下的类中的注解: @Service  @Refrences ...-->
<dubbo:annotation package="com.itheima.dubbo" />

scan:
  base-packages: com.itheima.service

2.协议:

 <!--
    在服务提供者一方配置,可以指定使用的协议名称和端口号。
    其中RPC支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。
    port:20880默认端口 可以省略
    后期如果服务比较多:我们可以选择:20881 20882 20883....
-->
<dubbo:protocol name="dubbo" port="20880"/>

yml配置文件:

dubbo:

protocol:
  name: dubbo
  port: 20080

3.启动时检查:

Dubbo在启动时会检查服务提供者所提供的服务是否可用,默认为true

通过配置服务消费者的统一规则来关闭服务检查

<dubbo:consumer check="false"/>    开发屏蔽(false)  上线开启(true)

consumer:
  check: false

 4.dubbo的超时和重试【面试】

Dubbo在通信时,由于网络或服务端不可靠,会导致调用过程中出现不确定的阻塞状态(超时)

为了避免超时导致客户端线程挂起处于一致等待状态,必须设置超时时间和请求重试,默认为1S超时和重试2次数

<!--配置在消费者端一方: 默认的超时时间是1s ,默认的重试次数是2次--> 
<dubbo:consumer timeout="5000" retries="0" />

猜你喜欢

转载自blog.csdn.net/weixin_50769390/article/details/127350639