本文是一个开坑文,列出了所有笔者能想到以及接触到的微服务场景下用到的技术栈以及技术选型,将来会详细展开每一个内容
很多人刚入门时候都是从tomcat开始的,下载一个tomcat容器,然后启动startup.sh,在浏览器输入经典的 http://localhost:8080
,就看到那个画风诡异的汤姆猫了(啊,爷春回)
web服务早期的模式其实也是如此,一台暴露在公用ip的服务器,接收来自网民的请求。
访问量多了以后,一台服务器肯定是承受不住的,所以需要引入 nginx反向代理 ,根据一定的负载均衡算法将流量路由到不同的服务器上,就会变成这样
起初,网站的功能很简单的时候,上面的结构就足以处理请求了,但是当业务规模逐渐扩大后会遇到很多问题:
所以提出了一种将模块的调用当做方法调用一样实现的结构,也就是 微服务 。不同模块提供一类业务相关功能的子集,然后通过 RPC框架 来相互调用
RPC框架要做的事情大体上就是如下图
通过 动态代理技术 将一个RPC调用的过程伪装成普通的方法调用,例如代码
int result = calculator.add(a, b); 复制代码
calculator类的add()方法就可以是通过动态代理生成的一个代理方法,背后执行的是RPC的操作
调用方请求提供方时需要实时的知晓提供方的ip和端口,用来发送请求,这里就需要用到 ZooKeeper 或者 Eureka 来实现 服务发现功能 ,这里的选型涉及到分布式领域的 CAP定理 ,ZooKeeper是CP,Eureka是AP
即序列化/反序列化,也就是把内存中的对象转为二进制的字节用于在网络中传输,编码解码可选择的方案有:
序列化需要关注的能力包括:
RPC框架需要支持 负载均衡 的能力,常见的负载均衡算法有随机、轮询、权重(动态权重,根据响应时间等参数来进行计算)
调用端可以搞一个流控的功能,控制发送请求的流量,可以通过维护一个ConcurrentHashMap,key是接口或者方法,value是正在处理中的请求数量,可以针对不同的方法设置不同的阈值,当正在处理中的请求量到达一定阈值的时候选择 快速失败 或者 队列
Java的BIO、NIO、AIO的功能对比 可以使用mina或netty这样的框架来通过NIO来处理高并发请求场景,这样也更符合大部分网络服务的请求规律,即高频零碎的低耗时请求
微服务下同样的模块会部署在n台机器上,这n台机器的配置需要有一个系统来进行统一的管理,可能的实现方案有: