微服务设计指导-微服务各层间应该如何调用

Posted TGITCIC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务设计指导-微服务各层间应该如何调用相关的知识,希望对你有一定的参考价值。

你千万别把consumer去冲到前端直接这样调用了哈。

下面说一下微服务和DB、中间件(包括一切中间件)的调用关系,这个是精华,网上的复制、粘贴是没的。

微服务与中间件、DB的调用关系最佳实践(这不是规范是最佳实践)

从Consumer端来看设计

  • Consumer端经常会去调用Redis,是因为consumer端有时需要通过一个状态、一个值来“反转”或者“组织”provider“端;
  • 假设有一个provider端叫getCity,consumer端每个请求都要调一次getCity,这时就会造成微服务泛滥,而这种场景在“业务代码编织时”又不可避免,那么怎么办?我们调过一次provider端的getCity后,反它缓存起来,这样consumer端是不是就减少了对provider端的调用?
  • 字典表、枚举值放在db一个table里,consumer端也要调用。不是不可以,而是这样做你:1. 降低了服务的响应速度 2. 变相增加了泛滥DB的调用,不是不可以而是在consumer端我们提倡可以做到0调用DB,尽量多用redis,mongodb;
  • Consumer端也会去调MQ的,异步多线程去请求provider端;

所以,consumer端的总结就是:尽量少用或者不用db,多用缓存减少对provider端的调用、多用mongodb减少对db的依赖、用mq和多线程控制住对provider端的泛滥。

从Provider端来看设计

这边的设计其实就是平峰削谷的5个层次、3个维度去在provider的单根服务的响应速度上做足功课,力争单根微服务<2秒(万级并发下)

5个层次

第一层,用waf上的三道防火墙挡住各种CC和BOT攻击 - 和provider端无关
第二层,用varnish尽可能的去多挡各种静态,get请求- 和provider端无关
第三层,用redis加速API的访问速度(一般使用redis和不使用redis可以相差千倍性能);
第四层,用异步MQ去保护后台交易、提交、支付、供应链端应用;
第五层,用mongodb或者是redis存储功能去替代传统数据库做流水、历史、小DB应用;

3个维度


第一个维度,单SQL在基于千万级数据库表结果的底上运行时间不得超过500ms;
第二个维度,系统日志、历史数据要可archive,即需要有明确的字段、标识以便于DEVOPS、DB巡检维度,不断去发现不合理设置,尽可能提前对系统进行扩、缩、Archive动作;
第三个维度,少用DB,多用NOSQL;

大家可以把5层漏斗想像成一个空心漏斗,水是无缝不渗透的。这才有了这三个维度形成了包裹着这个漏斗的三层防洪堤。

最后再说一句

后台跑批、跑JOB可以跨库也必须跨库访问DB,都跑JOB了你还调用微服务,这不是自己no zuo no die吗?这条是规范,不要触碰。

 

以上是关于微服务设计指导-微服务各层间应该如何调用的主要内容,如果未能解决你的问题,请参考以下文章

微服务设计指导-使用云原生微服务解决传统海量跑批时引起的系统间“级联雪崩”以及效率

Spring Cloud微服务如何设计异常处理机制?

微服务设计指导-通过一个生产事故的具体例子来看微服务

微服务设计指导-让Redis循环写入时提高10倍的技巧

小团队如何以“正确的方式”设计微服务架构?

微服务设计指导-hystrix参数介绍