spring cloud---------- Ribbon负载均衡

在过去的时代,互联网病不普及,那时候的应用的流量是很低的,所以普通的应用都能抗住,但是现在这个全名都普及的互联网时代就不一样了。我们就拿淘宝来举例子吧,如果他只有一个服务器的话,那么他早倒闭了,这么多流量一起访问,啥服务器都扛不住,扛不住就直接蹦了,那么他的损失将是巨大的。而负载均衡也因此而出现,他的出现就是为了解决一个服务器压力过大而导致程序崩掉。
如果我们做程序的话,如果不是新手,那么至少应该听说过nginx这个吧,他也具有负载均衡的作用,而我们本次主讲的不是nginx,而是另一个spring cloud下的一个ribbion。
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
ribbion:
Ribbon是Netflix公司开源的一个负载均衡的项目,它属于上述的第二种,是一个客户端负载均衡器,运行在客户端上。它是一个经过了云端测试的IPC库,可以很好地控制HTTP和TCP客户端的一些行为。 Feign已经默认使用了Ribbon,网关其实也是用了ribbon,但是要结合注册中心
负载均衡
容错
多协议(HTTP,TCP,UDP)支持异步和反应模型
缓存和批处理。
在spring cloud中我们最常用的是RestTemplate和ribbion来使用,通过ribbion来将我们的请求分发到我们集群上面的各个服务上面去。
ribbion其实也和nginx一样有好多方式来分发请求。这些可以根据自己的情况设置:
这里写图片描述
我们直接通过一个简单的列子来整合一下,可能就清楚了。因为ribbion基本上是跟注册中心一起使用的,当然也可以单独使用,但是和注册中心一起使用的话就不需要再导入jar包了,因为他们内部就已经包含了,如果是单独写的话,就要导入jar包了

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency> 

我们建立两个项目吧,一个是消费者,一个是生产者,我们之后更改一下生产则的端口,然后消费者通过resttemplate访问。我们的注册中心使用的是consul。
我们消费者的代码config-server的代码是这样的

@SpringBootApplication  
@RestController
//@EnableConfigServer
@EnableDiscoveryClient
//@EnableHystrix
@EnableCircuitBreaker
@EnableHystrixDashboard
@RequestMapping(value="/config-server")
public class App 
{
    @Autowired
    private Hystrix h;
    public static void main( String[] args )
    {
         SpringApplication.run(App.class,args);
    }
    @RequestMapping(value="/hello")
    public String haha(){
        String a=restTemplate().getForObject("http://client1/hello", String.class);
        return a;
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

记住上面的restTemplate方法的@LoadBalanced这个注解一定要加啊,这个是开启负载均衡的注解.
我们生产则的代码如下:

public class App 
{
    @Autowired
    private Hystrix h;
    public static void main( String[] args )
    {
         SpringApplication.run(App.class,args);
    }
    @RequestMapping(value="/hello")
    public String haha(){
        return "zj2222222222222";
    }
}

端口为8088,
我们在修改一下他的端口为8081,同时修改一下他的get返回数据为zj1,在继续启动我们的服务,可以通过我们的注册中心consul看到如下的服务
这里写图片描述
我们可以清楚的看到我们的生产者有连个服务,端口是8081和8088,这样我们的生产者就有一个小小的集群了。这时候我们去访问我们的消费者的接口,连续访问四次,会出现如下的结果
这里写图片描述
可以看到我们在没有设置ribbon的负载均衡模式下的时候,默认使用的是轮询模式,也就是轮流去访问。
但是有的人会问,我想换其他方式,该怎么换呢?
如果要换方式的话,有两种方式来换,一种是java代码来换,而另一种就是通过配置来换,我想大家还是更倾向于这种吧,但是对于我们,者两种都有必要了解下,我就一种一种来说吧。
首先还是说大家更偏向的这种方式吧:

只需要在你消费者那边的配置文件配置上如下内容:
client1.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
client1代表的是你的生产者服务,后面的值表示的是你想要的负载方式

这样在重启就会发现我们的服务就不是轮询的了,而是随机的。
而Java模式下的怎么弄呢?请看下面
其实也和上面一样

@Configuration
public class RibbonConfiguration {
     @Bean
     public IRule ribbonRule(){
         //随机负载,这里可以设置你想要的方式
         return new RandomRule();
    }
}

这个设置好了,在继续设置下面的一个

@Configuration
@RibbonClient(name="client1", configuration=RibbonConfiguration.class)
public class ZjRibbonConfiguration{
}

因为我这边采用的是对client1的负载均衡,你们那边根据自己的实际情况来搞。弄完后,启动服务,然后访问hello接口,你会发现两个返回的数据数据出现。这样就达到我们自己设置负载均衡的方式。
在spring cloud中,ribbion默认采用的是轮询方式。像网关、fegin等都是默认采用轮询,使用负载均衡的好处就是分担服务器的压力,同时保证服务的高可用,即使因为某个服务出现故障,但是集群的其他的还能继续工作

猜你喜欢

转载自blog.csdn.net/u013825231/article/details/80113926