微服务的思考
spring cloud
引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
Ribbon 的负载均衡策略类,可以实现随机策略、顺序策略等 7 中策略
| 策略名 | 策略描述 |
|---|---|
| BestAvailableRule | 选择一个最小的并发请求的 server |
| AvailabilityFilteringRule | 过滤掉那些因为一直连接失败的被标记为 circuit tripped 的后端 server,并过滤掉那些高并发的的后端 server(active connections 超过配置的阈值) |
| WeightedResponseTimeRule | 根据响应时间分配一个 weight,响应时间越长,weight 越小,被选中的可能性越低。 |
| RetryRule | 对选定的负载均衡策略机上重试机制 |
| RoundRobinRule | roundRobin 方式轮询选择 server |
| RandomRule | 随机选择一个 server |
| ZoneAvoidanceRule | 复合判断 server 所在区域的性能和 server 的可用性选择 server |
熔断器
Hystrix 是由熔断器和线程池组成,用户请求是先到熔断器,熔断器根据开关状态,如果开关是打开状态,则不调用线程池,而调用降级服务, 熔断器的三个状态根据调用情况进行转换,熔断器根据状态产生对应的动作。
限流
网关总会面临高并发,限流就是在高并发情况下,限制请求总数,对于超出限流阈值的请求采用拒绝服务、降级服务手段,保证负荷不超过系统处理的上限。限流采用的算法包括计数器、漏斗桶和令牌桶。算法比较如下:
| 算法 | 优缺点 | 原理 |
|---|---|---|
| 滑动窗口计数器 | 不能满足波动处理 | 滑动窗口时间内发送数量 - 滑动窗口时间内接受数量<= 滑动窗口大小 |
| 漏斗桶 | 只能按固定速率处理请求 | 发送到漏斗中的请求不受限制,但是从漏斗中获取请求的速率是固定的 |
| 令牌漏斗桶 | 可以处理突发流量,放入令牌的速率可以调整 | 令牌桶大小固定,以一定速率产生令牌放入桶中,如果消耗令牌速率小于放入令牌速率,则填满令牌桶后的令牌会被丢弃 |
Bucket4j 是一款优秀的限流组件,他可以实现针对某个维度在集群中限流,例如,针对某个客户的一个特定接口请求限流,该客户的该接口请求可能被路由到集群中不同节点上,利用 Bucket4j 可以计算在集群中的总请求,进而实现限流。它还有其他优点例如可以通过插件实现日志和监控,有同步和异步接口,可以实现多个维度限流。
监控
网关系统是所有业务系统的门户,是核心系统,网关系统可靠运行是衡量网关系统建设成败的关键因素,通过系统监控可以及时了解系统运行状态,以及可以及时发现系统运行异常,因而系统监控可以提升网关的可用性。系统监控功能主要包括:监控数据采集、监控数据分析展现、监控报警等。 在网关系统中监控数据采集主要包括:接口成功、失败情况,为了使监控功能和网关核心功能松耦合,采用 metris 异步埋点技术或者用通过日志文件埋点等,数据分析可以采用 flume 收集日志 +kafka+storm(flink)等技术进行实时计算分析,通过计算分析可以了解系统运行状态,发现系统异常情况并进行报警。
安全
在网关中采用数据加密和签名机制,加密保证数据不会泄密,签名保证数据交互双方身份不可抵赖以及数据的完整性。
故障转移
网关访问下游服务集群,例如下游某个服务,分别部署在两个节点,如果其中一个节点服务异常,那么是希望网关能否发现有一个节点异常,并且能够不再请求异常节点,而是全部访问正常节点服务,这就是希望实现的故障转移。 由于微服务网关是采用 springcloud 的技术体系,所以可供选择的故障转移技术有 erueka 或者 consul。