一:软件架构的演练过程【了解】
单体应用架构--->垂直应用架构--->分布式架构(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. 服务容器负责启动,加载,运行服务提供者。
-
服务提供者在启动时,向注册中心注册自己提供的服务。
-
服务消费者在启动时,向注册中心订阅自己所需的服务。
-
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推 送变更数据给消费者。
-
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用, 如果调用失败,再选另一台调用。
-
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计 数据到监控中心。
特别重要
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" />