Java服务端面试微服务IT

微服务核心技术梳理

2019-03-24  本文已影响105人  索伦x

学习本文前,请确保你了解并搭建过至少一个简单的微服务应用。对微服务的设计理念及编程思想有一定的了解。

当我们需要自己从零开始设计或搭建微服务项目的时候,由于缺乏经验及高人指点,心中难免有些惶恐。我们要如何去搭建我们的微服务项目?如果不能一步到位的话,我们该如何逐步去实施?微服务系统会存在哪些常见问题?有哪些风险点需要去关注?微服务的边界在哪里,哪些东西可以用微服务来实现,哪些不能?

那么本文讲从易到难、从浅到深、逐步实现从实用到四高的相关技术梳理(高可能、高性能、高并发、高智能)。让你在微服务项目的各个阶段都能够不慌不忙,胸有成竹的构建及完善我们的微服务项目

1.微服务最少组件

当我们对微服务的四高没什么要求的时候,仅仅是想将项目拆分成多个团队并行开发,那我们要如何去搭建我们的微服务项目呢?

以dubbo微服务框架为例:
我们至少需要有api网关、zk、provider、consumer

2.微服务编排

当我们对微服务项目进行拆分的时候,该如何下手,怎么拆分才是正确的? 有没有统一的标准?

目前业内对微服务的拆分并没有统一的规范及标准,拆分的时候必须根据具体的业务及开发团队现状来确定。下面我们以一个旅游微服务系统平台实例来进行说明:

RPC依赖关系图

从上图我们不难看出一些基本的编排规则:

  1. 微服务不能交叉调用,否则上线的时候可能会出现服务不可用的问题
  2. 微服务可以是独立的、不依赖其他任何服务的
  3. 微服务必须进行分层,低层级的不能调用高层级的微服务
  4. 微服务的交互方式,必须提前设计好,是同步还是异步?
    比如: 消息通知最好用MQ异步来实现,否则会影响诸如订单主流程的运行

3.微服务排障

当我们在线运行的微服务项目频繁出现Bug,又无法快速准确的定位的时候,我们需要对微服务项目进行哪些升级改造?

以Dubbo微服务框架为例,常见的使用zipkin来进行调用链的跟踪:


zipkin

在zipkin的图形管理界面上,很容易能看到调用链故障环境
ELK日志系统通过对日志的监控及分析,也可以帮我们快速定位故障


ELK日志监控界面

4.微服务的高并发

当微服务项目在线运营一段时间后,总会迎来流量的高峰,那我们应该提前做好哪些准备来应对高并发的用户场景呢?

  1. 利用Nginx进行前后端分离,请静态资源部署在NG上
  2. 接入云存储,把图片、视频、app安装包等发布到云存储上
  3. 把云存储、静态资源全部接入CDN,并做好相应的策略
  4. 充分利用Redis等缓存层,减轻数据库的压力

5.微服务高可用

当个别微服务偶尔出现问题影响用户体验的时候,比如偶尔用户无法下单、无法支付,又或者我们需要频繁升级的时候,我们应该采取什么样的措施?

  1. 负载比较高的服务,相同的开启多个
  2. 上线发布的时候,采用灰度发布的方式
  3. 打开错误重试机制,dubo默认重试3次

6.微服务的高性能

当一个项目用户越来越多、业务越来越复杂、我们该如何保证在复杂的业务场景下,实现对用户请求的快速响应?

  1. 数据库开启一主多从,把查询量大的微服务单独分配到从库上
  2. 利用Mycat等服务中间件,实现对数据库主从自动切换
  3. 利用MapReduce算法,都任务进行分片处理,统一结果汇总
  4. 利用多库进行数据库水平拆分,也就是我们常说的分库分表
  5. 把查询量大的服务采用NoSQL数据库(例如:ES)进行部署

7.微服务的分布式事务

当多个微服务同时处理一个用户请求的时候,比如用户下单需要同时调用权限系统、商品管理系统、进销存系统、支付系统等微服务,如果保证数据的一致性?而且失败的时候还必须同时回滚?

常见的分布式事务有2种

  1. 补偿机制,利用定时任务检查数据是否需要回滚
  2. 强事务,利用mysql的xa事务(也可以使用各种中间件:比如阿里的FESCAR)
#mysql实现XA事务的SQL语句
XA START 'xatestx','XXXXXXXXXXXXXXXXXXXXXXXX';
INSERT INTO suoron_test (id,name) VALUES(21,'试试');
XA END 'xatestx';
XA PREPARE 'xatestx';
#大家都准备好了,一块提交
XA COMMIT 'xatestx';
XA ROLLBACK 'xatestx';
XA RECOVER;

8.微服务服务治理

当我们团队越来越大的时候,我们需要把系统交付给运维的兄弟进行维护,我们该如何帮忙他们制定专门的运维管理的规则?

微服务治理

常见的服务治理框架有:

  1. Dubbo的Admin -- 服务管理
  2. Spring cloud 的hystrix -- 熔断
  3. zabbix -- 微服务监控及巡检
  4. apollo -- 携程配置管理(后期服务器配置全由运维负责)

9.微服务的高智能

当系统出现问题,或者资源不够的时候,每次需要手工去维护显然不现实,人工处理的响应速度太慢,恢复一个故障可能需要长达几个小时的时间,那我们该如何实行系统的智能运行?

必须充分利用容器集群及容器调度系统(例如:Kubernetes)
比如:微服务出现严重故障时,容器能够自动重启
当请求流量增大的时候自动开启新的微服务
当流量减少时,自动释放资源,用于资源消耗严重的报表统计等

上一篇下一篇

猜你喜欢

热点阅读