一. 为什么大家都在谈微服务?
-
二. 我们希望的微服务是什么样子
-
● 学习成本:不想为了用它得先学习准备个10天半个月,这跟我爱不爱学习新东西无关 -
● 使用简单:不希望一个hello -
● 迁移成本:已经有很多系统在维护中,不希望大动干戈,推倒重来是一定程度的犯罪(你无法保证建立的新世界比原来好) -
● 易于测试:希望一个单元测试或者集成测试很快就能跑起来 -
● 高性能:不会有性能瓶颈,引入的负载小 -
● 部署简单:部署也是成本,自动化,不进行人工环境干预。适应各种环境,最大利用硬件资源 -
● 易于监控:完善的日志记录,出现问题能被监控、告警,对系统运行状态及各种指标能随时掌握 -
● 易于运维:对突发事件有运维调度能力,防止雪崩效应。可以对系统进行弹性伸缩,快速的拉起和优雅关闭等等
-
三. 实现微服务
-
● 微服务自身实现
-
● 部署
-
● 其他
-
◆ 代码优先
-
◆ HTTP+REST
-
◆ 客户端治理
-
◆ 外部管理VS进程自治管理
-
◆ 配置与代码耦合VS配置与代码的分离
-
四. 让微服务快速落地
-
五. 附录
Q1:api gateway使用开源产品还是自己开发,是否有必要自己开发?
A1:gateway是自己基于netty开发的,看需求和对可控性的要求来决定是否自己开发。如果觉得开源的产品不符合你想要的要求,那自己开发也是一条没有太多选择的路。
Q2:能解释一下什么是代理,什么是存根,以及它们的关系是什么吗?
A2:这个问题不是很明白你具体指的上下文,按我个人的理解,代理是在原有事情上包装一层,但是做的事情的核心没变。存根是一种降低使用复杂度的手段,生成一些重复、复杂的代码来减少使用者的负担。存根可能会使用到代理模式。
Q3:netty也适合做实时返回的交api gateway开发?netty发布的是什么协议的api?
A3:netty跟实时不冲突,只要你是长连接,那么它就具备接收和推送的能力。关于协议你只要在实现的时候不对原协议做破坏,那么它就是一个透明的穿透。我们内部的实现中,netty工作在http2上。
Q4:你们gateway有什么功能点?单机qps多少?
A4:现阶段具备注册发现、健康检查、负载均衡、反向代理、流量控制等功能。单机QPS在空包的情况下13万,1k数据包情况下3万左右,5k数据包的情况下1万5左右
Q5:spring boot很火,版本迭代速度很快,一些模块改动很大,但这给开发和部署带来一定的困惑,并且新人如果没接触过springMVC的话很容易掉入坑里,因为自动化程度很高,很多时候错误莫名其妙,也看不到里面发生了什么,这些问题如何解决?
A5:springboot的加载机制其实是很严谨的,都是在各种condition情况满足下才会加载,部署的话其实应该比原来更简单才对,它提供的maven 打包插件打出一个jar就能进行部署。如果说坑那可能是没有按照springboot的约定实施造成的,它提供了很多机制去查看它的状态,比如各种http的endpoint,官方参考文档应该会帮上大忙。
Q6:从esb soa转微服务,原本进程内的调用关系变成了网络调用,一次rpc变成了几次或者几十次rpc,同等条件下性能损失严重。这个问题如何得到解决?
A6:任何问题都有两面性,从开发的可维护性和降低复杂度等、部署的效率,故障影响的范围等等来说,微服务有很大的优势。你提到的性能问题,可能是服务的拆分过细导致,但不管怎么拆,从一个调用被拆成几十次调用肯定是粒度有严重问题,提高性能可以从按业务单元合理拆分粒度、合理的网络规划及部署、提高微服务本身性能等方面着手。
来源:中生代技术