1.1SOA思想
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构件在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。 概括:SOA思想要求按照业务将服务进行拆分,之后按照同一的中立的接口进行交互.
1.2RPC(概念)
远程过程调用: 在服务之间,由第三方完成自己的任务的过程称之为远程过程调用.
1.3微服务调用原理说明
标准: 1.根据业务拆分的思想 进行了分布式的设计 2.当服务发生异常时可以自动的实现故障的迁移 无需人为的干预.
1.3.1传统服务调用方式
说明: 由于nginx做负载均衡时需要依赖配置文件.但是当服务器新增/减少时.都需要手动的修改.不能自动化的实现.所以暂时达不到微服务的标准.
1.3.2微服务的调用原理介绍
步骤: 1.当服务的提供者启动时,会将自己的服务信息(服务名称/IP/端口号)进行记录 2.服务注册中心需要记录提供者的信息 维护服务列表 3.当服务消费者启动时会链接注册中心. 4.从注册中心中获取服务列表信息,方便下次调用 5.当消费者调用服务时,会根据负载均衡的机制挑选其中的一个服务提供者进行访问. 6.当服务提供者宕机时,由于注册中心有心跳检测机制,会维护服务列表.当宕机的提供者标识为down 7.当服务列表维护之后,会全网广播通知所有服务器的消费者更新服务列表信息.
1.4关于集群说明
1.4.1为什么集群是奇数台
原则: 搭建集群必须满足公式 现有的节点数量 > N/2 为什么集群的最小单位是3台: 假设: 1台 1-1=0 > 1/2 假的 2台 2-1=1 > 2/2 假的 3台 3-1=2 > 3/2 真的 3台是搭建集群的最小单位. 4台 4-1=3 > 4/2 真的 只要大约3台都可以搭建集群.
集群中最多允许宕机的台数为多少???
3台最多允许宕机几台? 最多宕机1台
4台最多允许宕机几台? 最多宕机1台
从实用性的角度考虑问题 发现搭建奇数台和偶数台的容灾能力相同.所以选用奇数台.
1.4.2zk集群选举的原理
原理说明: zk集群的选举根据最大值优先的规则,进行选举. 如果集群一旦超过半数以上的票数同意,则当选主机,同时选举结束.
问题: 有1,2,3,4,5,6,7节点依次启动. 问题1: 谁当主机? 4当主机 问题2: 哪几台永远不能当选主机? 1 2 3
1.5Dubbo框架介绍
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
1.5.1Dubbo框架通讯的方式
说明:只要使用Dubbo框架 ,在内部使用了dubbo协议进行通讯,其中的IP地址是动态生成的.并且端口号是访问服务的唯一标识信息.
1.6Dubbo入门案例
1.6.1导入项目
项目下载地址
1.6.2提供者的说明
1.6.3.1编辑Dubbo实现类
package com.jt.dubbo.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.jt.dubbo.mapper.UserMapper;
import com.jt.dubbo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@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);
}
}
1.6.3.2YML配置文件说明
server:
port: 9000 #定义端口
spring:
datasource:
#引入druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT+8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#关于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 #每一个服务都有自己特定的端口 不能重复.
mybatis-plus:
type-aliases-package: com.jt.dubbo.pojo #配置别名包路径
mapper-locations: classpath:/mybatis/mappers/*.xml #添加mapper映射文件
configuration:
map-underscore-to-camel-case: true #开启驼峰映射规则
1.6.4服务消费者说明
1.6.4.1编辑Controller层
package com.jt.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.dubbo.pojo.User;
import com.jt.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
利用dubbo的方式为接口创建代理对象 利用rpc调用
//check=false 先启动提供者/消费者没有关系
@Reference(check = false,timeout = 3000) //(loadbalance="leastactive")
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 "用户入库成功!!!";
}
}
1.6.4.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
测试
1.7关于负载均衡的说明
1.7.1集中式的负载均衡
说明:由于nginx处于负载均衡的中心,所以什么样的服务都会经过nginx之后转向到不同的服务器中. 所以会造成nginx的负载压力很大. nginx的主要的作用是反向代理.
1.7.2客户端的负载均衡
说明:在微服务调用过程中每个服务的消费者都可以在客户端实现负载均衡的操作,在每次请求之前通过服务列表获取将要访问的服务信息.实现了压力私有化.
1.7.3Dubbo负载均衡的方式
名称都是类名的前半部分都小写即可. 1.RandomLoadBalance 随机负载均衡 语法: random 默认的 2.RoundRobinLoadBalance 轮询策略 语法: roundrobin 3.ConsistentHashLoadBalance 一致性hash算法 将消费者与服务提供者绑定 语法: consistenthash 4.LeastActiveLoadBalance 挑选负载压力小的服务器进行访问 语法: leastactive
关闭Dubbo面试题
问题1: 如果将其中的一个服务的提供者关闭,问 用户访问是否受影响?? 不受任何影响 问题2: 如果将dubbo中的注册中心全部关闭,问用户访问是否受到影响??? 不受影响,因为消费者将服务列表数据保存到本地.