SOA思想
SOA介绍
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
RPC协议
RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。
HTTP协议与RPC的关系层级关系与对应的协议.
区别:
1.RPC是传输层协议(4层).而HTTP协议是应用层协议(7层).
2.RPC协议可以直接调用中立接口,HTTP协议不可以.
3.RPC通信协议是长链接,HTTP协议一般采用短连接需要3次握手(可以配置长链接添加请求头Keep-Alive: timeout=20).
(长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。)
4.RPC协议传递数据是加密压缩传输.HTTP协议需要传递大量的请求头信息.
5.RPC协议一般都有注册中心.有丰富的监控机制.
dubbo
Dubbo(读音[?d?b??])是阿里巴巴公司开源的一个高性能优秀的服务框架(SOA),使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,
它提供了三大核心能力:
- 面向接口的远程方法调用,
- 智能容错和负载均衡,
- 服务自动注册和发现。
dubbo调用原理
1.DUBBO框架的底层实现RPC协议,不会执行HTTP协议.
- 1.当服务生产者启动时,会将自己的服务名称/IP/端口号写入注册中心
- 2.注册中心接收服务器请求时,会将服务信息写入自己维护的服务列表中.
- 3.当服务消费者启动时,首先会链接注册中心.获取服务列表数据.并且保存到本地内存中.
- 4.当用户发起请求时,这时消费者根据用户的需求查询服务列表信息.基于负载均衡策略.查找正确的IP:端口之后发起RPC请求.
- 5.服务提供者接收用户的请求,之后开始完成业务处理.并且将数据返回.
注意事项:对象必须实现序列化接口. - 6.当后台服务器宕机时.注册中心基于心跳检测机制.发现服务器宕机.同时更新自己的服务列表数据.同时全网广播.之后消费者接收注册中心的信息之后.也同步更新自己的本地数据.方便下次服务调用.
Zookeeper
Zookeeper介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
总结:Zookeeper负责服务的协调调度.当客户端发起请求时,返回正确的服务器地址.
下载安装
http://mirrors.hust.edu.cn/apache/zookeeper/
Zookeeper安装
先安装1.8版本的JDK
上传文件,解压安装
修改配置文件
在zk根目录下创建文件夹data/log
mkdir data log
复制配置文件并且修改名称
cp zoo_sample.cfg zoo.cfg
启动zk
zk启动关闭命令如下.
sh zkServer.sh start 或者 ./zkServer.sh start
sh zkServer.sh stop
sh zkServer.sh status
集群的安装
准备文件夹
在zookeeper根目录中创建新的文件夹zkCluster.
创建zk1/zk2/zk3文件夹.
在每个文件夹里创建data/log文件夹.
mkdir {zk1,zk2,zk3}/{data,log}
添加myid文件
分别在zk1/zk2/zk3中的data文件夹中创建新的文件myid.其中的内容依次为1/2/3,与zk节点号对应.
编辑myid文件,定义编号.
编辑配置文件
将zoo_sample.cfg 复制为zoo1.cfg之后修改配置文件.
修改zoo1.cfg
配置完成后将zoo1.cfg复制2份.之后需要修改对应的文件夹目录.和不同的端口即可.
ZK集群测试
注意: 关闭上面开启的zookeeper
通过下面的命令启动zk集群.
sh zkServer.sh start zoo1.cfg
sh zkServer.sh stop zoo1.cfg
sh zkServer.sh status zoo1.cfg
检查主从关系,从机情况说明.
实现一主二从的集群机构
关于zookeeper集群说明
Zookeeper集群中leader负责监控集群状态,follower主要负责客户端链接获取服务列表信息.同时参与投票.
Dubbo入门案例
1.2.1导入jar包
<!--引入dubbo配置 --><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version></dependency>
定义接口
编辑服务提供者
实现业务接口
//com.alibaba.dubbo.config.annotation.Service
@Service(timeout=3000) //3秒超时
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAll() {System.out.println("我是第一个服务的提供者");return userMapper.selectList(null);}@Overridepublic void saveUser(User user) {userMapper.insert(user);}}
编辑提供者YML文件
server:port: 9000spring:datasource:#引入druid数据源type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: root#dubbo配置
dubbo:scan:basePackages: com.jt #包扫描application:name: provider-user #定义服务名称registry:address: zookeeper://192.168.8.128:2181?backup=192.168.8.128:2182,192.168.8.128:2183protocol:name: dubbo #dubbo节点保存的名称port: 20880 #dubbo rpc调用的端口信息mybatis-plus:type-aliases-package: com.jt.dubbo.pojo #配置别名包路径mapper-locations: classpath:/mybatis/mappers/*.xml #添加mapper映射文件configuration:map-underscore-to-camel-case: true
编辑消费者
编辑消费者Controller
@RestController
public class UserController {@Reference(timeout=3000,check=false)private UserService userService;@RequestMapping("/findAll")public List<User> findAll(){return userService.findAll();}@RequestMapping("/saveUser/{name}/{age}/{sex}")public String saveUser(User user) {userService.saveUser(user);return "用户入库成功!!!";}
}
编辑消费者YML配置
server:port: 9001
dubbo:scan:basePackages: com.jtapplication:name: consumer-userregistry:address: zookeeper://192.168.8.128:2181?backup=192.168.8.128:2182,192.168.8.128:2183
Dubbo负载均衡策略
随机策略(默认策略)
@Reference(timeout=3000,check=false,loadbalance = "random")private UserService userService;
轮询策略
@Reference(timeout=3000,check=false,loadbalance = "roundrobin")private UserService userService;
Hash策略
@Reference(timeout=3000,check=false,loadbalance = "roundrobin")private UserService userService;
最少使用策略
规则:按照当前服务器的连接数量,挑选最少的连接.
@Reference(timeout=3000,check=false,loadbalance = "leastactive")private UserService userService;
面试题
当zookeeper宕机时是否影响操作.
说明:当zookeeper宕机时,现有的服务器不会受到影响.因为在服务器启动时,消费者首先会连接注册中心.获取其中的服务列表数据,保存到本地内存中.保证现有服务的正常运行.
如果zk宕机后,提供者部分宕机是否有影响.
消费者会受到一定的影响,但是影响很小.当消费者连接提供者时,如果发现提供者连接不通.则标识为down,连接后续的提供者.