文章目录
RPC
RPC协议两个核心模块:通讯,序列化。
序列化:(为了对象的传输)数据传输需要转换
是什么?
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了***传输层***和***应用层***。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
有什么用?
-
如果我们开发简单的单一应用,逻辑简单、用户不多、流量不大,那我们用不着
-
当我们的系统访问量增大、业务增多时,我们会发现一台单机运行此系统已经无法承受。此时,我们可以将业务拆分成几个互不关联的应用,分别部署在各自机器上,以划清逻辑并减小压力。此时,我们也可以不需要RPC,因为应用之间是互不关联的
-
当我们的业务越来越多、应用也越来越多时,自然的,我们会发现有些功能已经不能简单划分开来或者划分不出来。此时,可以将公共业务逻辑抽离出来,将之组成独立的服务Service应用 。而原有的、新增的应用都可以与那些独立的Service应用 交互,以此来完成完整的业务功能。所以此时,我们急需一种高效的应用程序之间的通讯手段来完成这种需求,所以你看,RPC大显身手的时候来了
-
其实3描述的场景也是***服务化 、微服务*** 和***分布式系统架构*** 的基础场景。即RPC框架就是实现以上结构的有力方式
目前常用的RPC框架如下:
-
Thrift:thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
-
Dubbo:Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。 Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,Dubbo自2011年开源后,已被许多非阿里系公司使用。
-
Spring Cloud:Spring Cloud由众多子项目组成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。Spring Cloud基于Spring Boot, 使得开发部署极其简单。
分布式Dubbo+Zookeeper+SpringBoot
zookeeper
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境.
是一个分布式服务框架它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
简单来说:zookeeper=文件系统+监听通知机制
1、 Zookeeper维护一个类似文件系统的数据结构
每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
有四种类型的znode:
-
PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
-
PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
-
EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
-
EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
2、 监听通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
对zookeeper的再理解:
假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
使用:
1.下载地址: http://mirror.bit.edu.cn/apache/zookeeper/
2.配置JAVA环境,检验环境:java -version
3.运行/bin/zkServer.cmd,初次运行会报错,没有zoo.cfg配置文件。
Dubbo
Dubbo一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。(是一个专注于通讯的框架)
基于Java实现的RPC通信框架。
服务注册与发现,交给了zookeeper.
window下安装dubbo-admin
dubbo本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。
但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。
我们安装一下:
1.下载dubbo-admin
地址:https://github.com/apache/dubbo-admin/tree/master
2.解压进入目录
修改dubbo-admin\src\main\resources\application.properties指定zookeeper地址
3.在项目目录下打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
4.执行dubbo-admin-0.0.1-SNAPSHOT.jar
若不打开zookeeper必然报错,则需要打开zookeeper
之后访问http://localhost:7001 (7001为bubbo配置的端口)
需要输入登陆账户和密码,我们都是默认的root-root;
再理解:
dubbo-admin是一个监控管理后台,可以查看我们祖册了哪些服务,哪些服务被消费了。
zookeeper是一个注册中心。
dubbo是一个jar包
整合到springboot
在空项目dubbo+zookeeper中,建两个module(provider-server,consumer-server)
导入依赖(dubbo和zookeeper)
<!--导入依赖dubbo zookeeper -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!--日志会冲突-->
<!--引入zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
配置提供者的zookeeper注册中心:
server.port=8001
#服务应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服务要被注册
dubbo.scan.base-packages=com.muzi.service
提供者的方法:
写一个TicketService接口:
public interface TicketService {
public String getTicket();
}
写一个TicketServiceImpl类:
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
//服务注册与发现
@Service//可以被扫描到,在项目中一启动就自动注册到注册中心
@Component//使用了dubbo后尽量不要用Service注解
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "木子说Java";
}
}
}
启动提供者:
配置消费者:
server.port=8002
#消费者去哪里拿服务需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
写一个UserService类
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service//放在容器中
public class UserService {
//想拿到provider-server提供的票,要去注册中心拿到服务
@Reference//引用, Pom坐标,可以定义路径相同的接口名
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到"+ticket);
}
}
把服务者的接口放到消费者相同的包下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200324233920461.png)
在测试类中,写测试方法:
```java
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
微服务架构问题:
分布式架构会遇到的四个核心问题:
○这么多服务,客户端该如何去访问?
○这么多服务,服务之间如何进行通信?
○这么多服务,如何治理?
○服务挂了,怎么办?
解决方案:
SpringCloud,是一套生态,就是解决以上分布式架构的4个问题。
1.Spring Cloud NetFlix,出来了一套解决方案。一站式解决方案,我们都可以直接去这里拿
Api网关 Zuul
Feign基于HttpClient基于HTTP的通信方式,同步并阻塞
服务注册与发现,Eureka
熔断机制,Hystric
2018年年底,NetFlix宣布无限期停止维护。生态不再维护,就会脱节。现在已不行。
2.Apache Dubbo zookeeper,第二套解决系统
API:没有。要么找第三方组件,要么组件实现。
Dubbo是一个高性能的基于Java的通信框架。
服务通信与发现交给了Zookeeper
没有。借助了Hystrix.
不完善,Dubbo.
Dubbo3还没出。
3. SpringCloud Alibaba 一站式解决方案。
目前,又提出了一种方案:
服务网格:下一代微服务标准,Server Mesh
代表解决方案:istio (未来)