一,微服务
1,什么是微服务
是一种架构模式,把一个程序分成很多不同的服务,各个服务运行在其独立的进程内,服务之间相互协调,相互配置。服务之间采用轻量级的通信机制http沟通,每个服务负责自己的业务,再有一个轻量级的集中式管理来协调这些服务
2,微服务优缺点
优点
高内聚,低耦合:每个服务足够小,代码容易理解,更方便各部门专注自己业务。各个服务相互独立
能使用不同语言进行开发
易于集成和部署
缺点
运维的复杂度加大
数据一致性问题,系统集成测试问题
3,微服务的技术栈
技术条目 | 落地技术 |
---|---|
服务开发 | springboot,spring,springMVC |
服务配置及管理 | Archaius,Diamond |
服务注册与发现 | Eureka,Zookeeper |
服务调用 | Rest,RPC |
服务熔断 | Hystrix,Envoy |
负载均衡 | Ribbon,Nginx |
消息队列 | kafka,RocketMQ,RabbitMQ |
服务配置中心管理 | SpringCloudConfig,Chef |
服务路由 | Zuul |
服务监控 | Metrics,Zabbix,Cat |
服务部署 | Docker,Kubernetes |
4 ,微服务通讯
常见的微服务框架:dubbo和springcloud
dubbo采用RPC远程调用,二进制传输,占用带宽小一些
springcloud采用http传输,带宽占用多一点,比RPC调用更灵活
二,注册中心 Eureka
Eureka: 注册中心,SpringCloud封装了Eureka模块来完成服务注册和发现,类似于Zookeeper的客户端的作用
包含两个组件
Eureka Server:提供服务注册,节点启动后再Server中注册,通过注解@EnableEurekaServer启动Server
Eureka Client:Java客户端,应用启动后,会向EurekaServer发送心跳(30s),周期内没接到心跳则移除节点。通过注解@EnableEurekaClient连接Server
CAP原则
C:Consistency 强一致性 各分区数据保证一致
A:Availablility 可用性 复制数据过程的效率问题
P: Partition tolerance 分区容错性 一个数据复制到多个分区中
由于无法完全满足全部三个原则,只能同时实现两点,,Eureka保证的是AP
Zookeeper保证的是CP:Master 宕机后,从机需要重新选举Leader,这个过程很漫长,服务处于不可用状态,牺牲可用性
Eureka保证的是AP:节点之间平等,当某个Eureka节点向Eureka服务器注册失败时,剩余节点依旧可以提供服务。不过查到的信息不一定是最新的。好处就是不会使整个服务瘫痪
三,Ribbon负载均衡
Ribbon是一款客户端负载均衡的中间件,通过在客户端配置,轮询,或者随机分配达到负载均衡的目的。
Nginx是在服务器和客户端之间的独立负载均衡的中间件
Ribbon配置好后,不需要知道具体IP地址和端口号,由Eureka负责
四,高并发架构
客户端<–>服务器<–>数据库
1,多个客户端和服务器之间通过Nginx将请求分到不同的服务器上去。Nginx特点:负载均衡,正向代理,反向代理
2,经过Nginx之后,可以再用消息队列对短时间内的大量消息进行缓冲,比如Kafka,RabbitMQ。消息队列特点:生产者发布,消费者订阅;流量削峰,服务解耦
3,不同服务器负责不同的请求,比如查数据库,执行搜索功能等等。不同的服务共同构成了微服务架构。微服务架构之间通信采用的是RPC框架。微服务还需要服务治理等中间件,本篇博客上面写了。了解即可
4,到服务器层面,如果涉及秒系统的高并发,涉及的问题包括热点key的查询,修改。用到的技术不一样。对于查询服务,可以使用Redis存储热点内容,提高访问速度。或者Mysql分库分表,减少一张表的数据量。Redis特点:非关系型数据库,单线程,速度比Mysql快
5,对于热点数据的修改,必须要改Mysql的数据,设计的技术一方面是加锁,包括Mysql语句里加update加锁,Spring注解@Transaction保证事务性等方式。