上文说了使用 consul做服务注册中心,实现服务注册与发现使用 consul 实现服务注册与发现
我们仅仅说了单机版(也就是单客户端,单服务端),本文介绍一下多服务端集群搭建。
其实consul的,服务集群搭建很简单,只需要在多建一台一摸一样的微服务项目即可(端口不同)。
一、搭建consul多服务版集群
我们按照8006的项目在建一个一模一样的项目8007。
application.yml,端口不同,服务名称spring.application.name一模一样。
#端口号 不同
server:
port: 8007
#服务名称 相同
spring:
application:
name: consul-provider-payment
####配置consul注册中心
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
分别启动 8006,8007项目:
可以看到我们的consul-provider-payment
服务下面有两个实例,点开看下:一个8007,一个8006
客户端80代码不需要改变,测试一下:
刷新一次变一次,因为我们默认使用的,负载均衡策略是轮询,依次调用。
二、使用Ribbon改变负载均衡策略
1. 什么是ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
2.ribbon的作用
Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,可以结合eureka,zookeeper,consul的做种服务注册组件。
3.ribbon的核心组件IRule
IRule:根据特定算法从服务列表中选取一个要访问的服务。
- com.netflix.loadbalancer.RoundRobinRule 轮询
- com.netflix.loadbalancer.RandomRule 随机
- com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试
- WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
- BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
- ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
4.改变ribbon的负载均衡算法
ribbon默认的负载均衡算法是:轮询。
如果我们想要换一种负载均衡算法,甚至是自定义一中算法都是可以的。
我们刚才在上面已经搭建好了8007的微服务,现在我们有一个客户端,两个微服务,我们要使它的负载均衡算法变成随机应该怎么操作?
1.首先,在主启动类的上一级目录创建一个myrule包,用于存放我们的rule配置。
2. 创建一个MyRuleConfig 类,并new 一个新的IRule 实例Bean。
package com.cpown.myrule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 创建新的ruleBean
* create by c-pown on
*/
@Configuration
public class MyRuleConfig {
@Bean
public IRule iRule(){
return new RandomRule();
}
}
3.在主启动类添加 @RibbonClient注解 指定我们需要应用自定义负载均衡算法的微服务名称,以及算法类class;
启动项目即可应用了。
最后:ribbon的算法其实并不复杂,比如轮询:就是记录请求的次数,以及拥有的实例个数,
通过 取模算法,获得每次请求所对应的微服务实例序号即可。