Ribbon:负载均衡及Ribbon

Ribbon:负载均衡及Ribbon_第1张图片

什么是负载均衡?

第一种轮询算法,依次遍历去执行,达到负载均衡Ribbon:负载均衡及Ribbon_第2张图片 

 Ribbon:负载均衡及Ribbon_第3张图片

 Ribbon:负载均衡及Ribbon_第4张图片

 

 集成Ribbon

导入pom,在消费者服务里的pom文件导入

  
        
        
            org.springframework.cloud
            spring-cloud-starter-ribbon
            1.4.6.RELEASE
        

还要导入Eureka客户端

        
        
            org.springframework.cloud
            spring-cloud-starter-eureka
            1.4.6.RELEASE
        

然后消费者服务里的yml

server:
  port: 80

#Eureka 配置
eureka:
  client:
    register-with-eureka: false #不向Eureka注册自己
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

主启动类加上注解

package com.kuang.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer80.class,args);
    }
}

在配置类上加一个注解,即可实现Ribbon的负载均衡的RestTemplate

package com.kuang.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration//
public class ConfigBean {

    //配置负载均衡实现RestTemplate,只需要加个注解@LoadBalanced ,它去注册中心去请求的时候,会平均分请求每个,eureka中的注册的服务,
    @Bean
    @LoadBalanced //Ribbon 基于这个注解实现的
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }


}

在Controller访问那里别写死了,改成 服务名,因为服务在三个注册中心Eureka上面都注册了,但是都是同一个服务名,三个服务器相互绑定,你只需要该地址为服务名,他会用负载均衡算法来计算出下一个将要访问的服务器

package com.kuang.springcloud.controller;

import com.kuang.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class DeptConsumerController {

    //理解:消费者,不应该有Service层
    //模板有很多方法供我们去使用

    //注入过来
//(String url, 实体:map, Class responseType, Object... uriVariables)
//(url,实体,map,Class responseType 返回值类型)  三个参数  五种请求方式
    @Autowired
    private RestTemplate restTemplate;
//Ribbon 我们这里的地址,应该是一个变量,通过服务名字来访问
   // private static final String REST_URL_PREFIX="http://localhost:8001";
    private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-DEPT";

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id")Long id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
    }


    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }


    @RequestMapping("/consumer/dept/list")
    public List list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
    }


}

Ribbon:负载均衡及Ribbon_第5张图片

 默认是随机路由

实现的是这个接口

Ribbon:负载均衡及Ribbon_第6张图片

 Ribbon:负载均衡及Ribbon_第7张图片

 Ribbon:负载均衡及Ribbon_第8张图片

 得出来一个重大结论

Ribbon和Eureka整合以后,客户端可以直接调用不用关心 ip地址和端口号~

再来总结一下

Eureka :就是注册中心,其实也是一个服务,给服务提供一个注册的容器,让服务可以注册进来供消费者使用,它可以多个注册中心组合在一起,变成一个集群,在每个注册中心上,服务提供者都把自己的服务放到注册中心上,只要还有一个服务器没有瘫痪,它照旧可以运行,它属于AP可用性与容错性一体的架构。

Ribbon:是让多个注册中心,相互调用,相当于一个整体,在每个注册中心上,服务提供者都会注册一个它的服务,服务名称都一样,所以整合以后,只需要调用服务名称,不用关心 ip地址和端口号~ 即可访问服务,会通过负载均衡算法进行选择调用哪个 Eureka。

你可能感兴趣的:(SpringCloud,ribbon,负载均衡,spring,cloud)