SOA (面向服务的架构)
概念
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
概括:SOA思想要求按照业务将服务进行拆分,之后按照同一的中立的接口进行交互.
RPC思想
概念
RPC是远程过程调用(Remote Procedure Call)的缩写形式。
总结:
- 当完成业务时自己没有办法直接完成时,需要通过第三方帮助才能完成的业务.
- 使用RPC时"感觉"上就是在调用自己的方法完成业务.
微服务思想
核心:
- 分布式思想(拆)
- 自动化(HA,自动化)
传统项目问题
1.如果采用nginx方式 实现负载均衡,当服务数量改变时,都必须手动的修改nginx.conf配置文件.不够智能.
2.所有的请求都会通过nginx服务器作为中转.如果nginx服务器一旦宕机,则直接影响整个系统.nginx最好只做简单的反向代理即可
传统的方式 不够智能…
微服务调用方式介绍
调用步骤:
1.将服务信息写入到注册中心(1.服务名称 2.服务IP地址 3.端口)
2.注册中心接收到服务器信息,会动态的维护服务列表数据.
3.消费者启动时会链接注册中心.目的获取服务列表数据.
4.注册中心会将服务列表数据同步给消费者,并且保存到消费者本地.以后方便调用.
5.当消费者开始业务调用时,会根据已知的服务信息进行负载均衡操作,访问服务提供者.
6.当服务提供者宕机时,由与注册中心有心跳检测机制.所以会动态的维护服务列表.
7.当注册中心的服务列表变化时, 则会全网广播 通知所有的消费者 更新本地服务列表.
Zookeeper 注册中心介绍
1.概念
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
概括: ZK主要的任务是服务的调度,提供一致性的功能.
2.关于集群说明
公式: 存活节点的数量 > N/2 集群可以创建
1台: 1-1 > 1/2 假的
2台: 2-1> 2/2 假的
3台: 3-1> 3/2 正确
4台: 4-1> 4/2 正确
结论: 搭建集群的最小单位3台.
3.为什么集群一般都是奇数?
3台集群最多宕机几台 集群可以正常工作 最多宕机1台
4台集群最多宕机几台集群可以正常工作 最多宕机1台
如果实现相同的功能 奇数台更优.
4.关于zk集群选举规则
原则: myid最大值优先 myid值越大的越容易当主机. 超半数同意即当选主机
题目: 问1,2,3,4,5,6,7依次启动 问1:谁当主机 4当主机
问2:谁永远不能当选主机??? 1 2 3
5.ZK数据存储结构
说明:zk中的数据的存储的方式是树形结构的.一般三级.
命令: [root@localhost bin]# sh zkCli.sh
查询命令: ls /…
Dubbo框架
Dubbo介绍
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo特性
Dubbo工作原理
Dubbo入门案例
1 定义公共接口项目
说明:接口项目一般定义公共的部分,并且被第三方依赖.
编辑接口
2.服务提供者 —provider
1.提供者代码结构
2.继承公共接口,编辑实现类
package com.jt.dubbo.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.config.annotation.Service;
import com.jt.dubbo.mapper.UserMapper;
import com.jt.dubbo.pojo.User;
@Service(timeout=3000) //3秒超时 内部实现了rpc
//@org.springframework.stereotype.Service//将对象交给spring容器管理
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
System.out.println("我是第一个服务的提供者");
return userMapper.selectList(null);
}
@Override
public void saveUser(User user) {
userMapper.insert(user);
}
}
@service 注意导包
import com.alibaba.dubbo.config.annotation.Service;
3.编辑提供者配置文件
#关于Dubbo配置
dubbo:
scan:
basePackages: com.jt #指定dubbo的包路径 扫描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 #每一个服务都有自己特定的端口 不能重复.
3.服务消费者–consumer
1 编辑Controller
package com.jt.dubbo.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.dubbo.pojo.User;
import com.jt.dubbo.service.UserService;
@RestController
public class UserController {
//利用dubbo的方式为接口创建代理对象 利用rpc调用
@Reference
private UserService userService;
/**
* Dubbo框架调用特点:远程RPC调用就像调用自己本地服务一样简单
* @return
*/
@RequestMapping("/findAll")
public List<User> findAll(){
//远程调用时传递的对象数据必须序列化.
return userService.findAll();
}
@RequestMapping("/saveUser/{name}/{age}/{sex}")
public String saveUser(User user) {
userService.saveUser(user);
return "用户入库成功!!!";
}
}
@Reference
利用dubbo的方式为接口创建代理对象 利用rpc调用
2 编辑YML配置文件
server:
port: 9001
dubbo:
scan:
basePackages: com.jt
application:
name: consumer-user #定义消费者名称
registry: #注册中心地址
address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
Dubbo入门案例测试
Dubbo框架知识点
1 问题1:如果其中一个服务器宕机 用户访问是否受限?
答:由于zk的帮助,使得程序永远可以访问正确的服务器.并且当服务重启时,duboo有服务的自动发现功能,消费者不需要重启即可以访问新的服务.
2 问题2:如果ZK集群短时间宕机,用户访问是否受限?
答: 用户的访问不受影响,由于消费者在本地存储服务列表信息,当访问故障机时,自动的将标识信息改为down属性.
Dubbo负载均衡策略
1.客户端负载均衡
Dubbo/SpringCloud等微服务框架
Dubbo框架下客户端有注册中心传过来的服务列表,会根据服务信息进行负载均衡
2.服务端负载均衡
说明:客户端发起请求之后,必须由统一的服务器进行负载均衡,所有的压力都在服务器中.
NGINX
Dubbo负载均衡方式
@RestController
public class UserController {
//利用dubbo的方式为接口创建代理对象 利用rpc调用
//@Reference(loadbalance = "random") //默认策略 负载均衡随机策略
//@Reference(loadbalance = "roundrobin") //轮询方式
//@Reference(loadbalance = "consistenthash") //一致性hash 消费者绑定服务器提供者
@Reference(loadbalance = "leastactive") //挑选当前负载小的服务器进行访问
private UserService userService;
}
-
@Reference(loadbalance = “random”) 默认策略 负载均衡随机策略
-
@Reference(loadbalance = “roundrobin”) 轮询方式
-
@Reference(loadbalance = “consistenthash”) 一致性hash 消费者绑定服务器提供者
-
@Reference(loadbalance = “leastactive”) 挑选当前负载小的服务器进行访问