一微服务思想
面向服务的架构(SOA)是一个组件模型(程序结构),它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构件在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
二RPC远程调用
总结:
1.RPC解决分布式系统中,服务之间的调用问题
2.远程调用时,就是一个代理的调用,使用的时候感觉就是在使用本地服务.
三微服务
1在分布式的思想的条件下,应该尽可能的降低服务之间的耦合性,同时满足当服务发生异常时,可以自动的实现故障的迁移.
关键词: 1.分布式 2.架构的松耦合 3.服务高可用
2微服务中高可用实现策略
2.1传统高可用弊端
如果添加/减少服务器时,需要手动的修改nginx的配置文件,并且重启服务之后,服务才能生效. 效率略低.不够智能,不能满足微服务条件下的高可用的要求
2.2采用注册中心的方式实现高可用
调用步骤:
1.当服务生产者启动时,会链接注册中.将服务信息写入到注册中.
2.当注册中心接收到服务信息时,会动态的维护服务注册列表数据.
3.当消费者在启动时,首先会链接注册中心.目的是获取注册列表.
4.当消费者接收到注册列表时,将列表缓存到本地,方便以后调用.
5.当服务的生产者有多个时,进行负载均衡,挑选其中的一个服务器进行访问.
6.当服务的生产者宕机时,注册中心有心跳检测机制.当发现服务宕机时,首先会维护自己的注册列表数据,标识为down.之后全网广播通知所有的消费者修改服务列表数据.
四Zookeeper介绍
Zookeeper当作注册中心使用。zookeeper是分布式环境中提供一致性服务的调度器.
五Dubbo
5.1dubbo介绍
Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
5.2入门案例
5.2.1导入jar包
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
5.2.2定义接口
public interface UserService {
//查询全部的用户信息
List<User> findAll();
//新增用户入库操作.
@Transactional
void saveUser(User user);
}
5.2.3定义服务生产者
5.2.3.1定义接口的实现类
@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);
}
}
5.2.3.2编辑YML配置文件
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%2B8&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是dubbo协议内部的通信端口
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 #开启驼峰映射规则
5.2.3.3对象序列化问题
说明:对象的远程数据传输,必须序列化
@Data
@Accessors(chain=true)
@TableName
public class User implements Serializable{
//dubbo协议中传输的对象必须序列化
private static final long serialVersionUID = 1L;
@TableId(type=IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private String sex;
}
5.2.4定义服务消费者
5.2.4.1编辑Controller
@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 "用户入库成功!!!";
}
}
5.2.4.2编辑YML.xml
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
5.2.5Dubbo高可用测试
测试1: 当有多个生产者时,检查是否能够负载均衡.
结论:dubbo可以实现负载均衡策略
测试2:当服务宕机时,检查用户请求是否收到影响.(测试高可用)
结论: 当服务器宕机一台时,用户不会收到影响.
测试3:当zookeeper宕机时是否收到影响.
结论:用户的访问不受任何影响.因为消费者自身有缓存.
但是程序的运行的环境处于高风险状态,需要及时恢复zk.
5.3Zookeeper的注册
registry:
address: zookeeper://192.168.126.129:2181 #?backup=192.168.126.129:2182,192.168.126.129:2183
5.4Dubbo负载均衡策略
5.4.1随机策略
@Reference(loadbalance="random")
5.4.2轮询策略
@Reference(loadbalance="roundrobin")
5.4.3一致性hash算法
@Reference(loadbalance="consistenthash")
5.4.4最小访问
@Reference(loadbalance="leastactive")