SOA思想
面向服务的架构(SOA) ,他讲应用程序的不同单元进拆分,并**通过服务之间的接口 和协议联系起来,**接口是独立的方式定义的,接口应该独立于实现服务的硬件平台.这使得构件在各种服务中以统一的方式交互
RPC思想
RPC是远程过程调用的缩写形式,由不同的服务器之间进行的通讯就叫RPC,RPC调用本质就是代理思想的应用.
总结: 服务A想要完成任务,但是手中没有资源,去通知B帮我完成,这种操作方式称为RPC
注册中心
- 使用传统的架构设计,所有的请求都经过nginx中转,nginx负载很大,nginx出了问题,直接影响用户
- 如果服务器数量改变了,则必须修改nginx的配置文件
需求: 保证nginx负载压力不要太高,如果服务器数量发生变化可以自动更新配置,无需人为干预
注册中心原理
- 1)当服务器启动时,会将自己的服务名称IP:Port写入注册中心
- 2)当注册中心接收提供者数据时,会动态维护服务列表数据
- 3)消费者服务器启东时会连接到注册中心获取服务列表
- 4)消费者服务器请求注册中心之后,会将服务列表保存到本地,方便以后使用
- 5)消费者服务器根据服务列表,利用负载均衡机制挑选一个进行访问
- 6)册中心利用心跳检查机制发现服务提供者宕机时,会"同步更新"注册列表,并且"同步所有消费者的服务列表
Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
总结:Zookeeper负责服务的协调调度,当客户端发起请求时,返回正确的服务器地址
下载地址zookeeper.apache.org/releases.ht…
Zookeeper安装
1.上传Zookeeper后完成解压
tar -xvf zookeeper-3.4.8.tar.gz
2.修改配置文件
在zk的根目录下创建文件夹data/log
mkdir data log
3.跳入conf目录中修改配置文件
cp zoo_sample.cfg zoo.cfg
zk启动命令
sh zkServer.sh start 或 ./zkServer.sh start
sh zkServer.sh stop
sh zkServer.sh status
Zookeeper集群安装
1.在Zookeeper的根目录中创建新的文件夹zkCluster
2.创建zk1 zk2 zk3文件夹
3.在每个文件夹里创建data/log文件夹
mkdir {zk1,zk2,zk3}/{data,log}
4.添加myid文件夹
分别在zk1/zk2/zk3中的data文件夹中创建新的文件myid.其中的内容依次为1/2/3,与zk节点号对应
5.修改配置文件
将zoo_sample.cfg 复制为zoo1.cfg之后修改配置文件.
6.修改zoo1.cfg文件
配置完成后将zoo1.cfg复制2份.之后需要修改对应的文件夹目录.和不同的端口即可
zk集群测试:
sh zkServer.sh start zoo1.cfg
sh zkServer.sh stop zoo1.cfg
sh zkServer.sh status zoo1.cfg
Zookeeper集群中leader负责监控集群状态,follower主要负责客户端链接获取服务列表信息.同时参与投票
Dubbo框架
dubbo是一款高性能,轻量级的开源Java RPC框架提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo框架下其中一个提供者宕机,用户访问不受限,zk集群宕机,用户访问你也不受限,因为服务器注册列表已经到了web端
Dubbo负载均衡
Zookeeper数据存储结构
Dubbo通讯原理
不同服务器通讯之间需要通讯协议,dubbo使用的是dubbo协议(tcp-ip),dubbo将TCP-ip协议进行了封装
Dubbo框架中使用dubbo协议建立了连接,之后通过IP:20880等端口进行通讯,与LinuxIP地址无关,dubbo生成ip地址.
Dubbo负载均衡策略
根据IP:port进行hash运算,之后绑定固定的提供者进行访问.
效果: 以后消费者与服务提供者进行了绑定
1.挑选访问压力最小的
2.随机访问也是默认的配置
3.轮询策略
什么是客户端负载均衡/集中式负载均衡
集中式负载均衡(nginx)
1).用户访问服务器时,自己不清楚访问的真实的服务器到底是谁,由nginx服务器动态的反向代理实现.
2).统一由负载均衡服务器进行负载. 问题 负载均衡服务器访问压力高.
客户端负载均衡
1).消费者在访问服务提供者时清楚的了解 到底应该访问哪台服务器.
2).由于每个客户端都进行负载均衡.相当于将压力均匀的分配给客户端.访问压力低.
注意:
1).nginx一般只负责反向代理
2).在微服务框架中 几乎都是客户端负载均衡服务器.
京淘项目改造
导入dubbo的jar包
<!--引入dubbo配置 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
添加公共接口在jt-common中
构建服务提供者
编辑提供者Service实现类
实现类注解要是用Dubbo的注解
@Service
public class DubboUserServiceImpl implements DubboUserService {
@Autowired
private UserMapper userMapper;
@Autowired
private JedisCluster jedisCluster;
编辑YML配置文件
#关于Dubbo配置
dubbo:
scan:
basePackages: com.jt #指定dubbo的包路径
application: #应用名称
name: provider-user #一个接口对应一个服务名称
registry:
address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
protocol: #指定协议
name: dubbo #使用dubbo协议(tcp-ip) web-controller直接调用sso-Service
port: 20880 #每一个服务都有自己特定的端口 不能重复.
构建服务消费者(JT-WEB)
编辑UserController
Controller
@RequestMapping("/user")
public class UserController {
//false 程序启动时是否检查由该服务器提供者 否
@Reference(check = false)
private DubboUserService dubboUserService;
编辑YML配置文件
#配置dubbo
dubbo:
scan:
basePackages: com.jt
application:
name: consumer-web #定义消费者名称
registry: #注册中心地址
address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183