【SpringCloud】05—— Ribbon客户端负载均衡

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lnazj/article/details/83794989

1.Ribbon 是什么?
一套客户端负载均衡工具.
举例:窗口点餐,点餐时会分好几个窗口,就是为了让人员分摊到不同的窗口,来避免人员堆积,我们点餐的时候,作为客户消费者会主动地选择人员最少的窗口的去点餐.和客户端结合实现负载均衡。

2.能做什么?
负载均衡的工具,将用户的请求分摊到多个服务器上,从而达到高可用.,负载均衡算法可以自定义.
LB集成到消费方,消费方通过Ribbon,从服务注册中获知哪些服务可用,然后根据算法从这些可用的地址中选择一台合适的服务器.

3.配置
1.新建consumer消费者项目
2.pom文件添加Ribbon坐标

<!--Ribbon 相关需要与eureka整合-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

2.配置consumer的yml文件,追加Eureka的服务器注册地址

server:
  port: 8085

spring:
  application:
    name: client-consumer

#告诉consumer不要直接去找8001端口了,有个eureka集群
eureka:
  client:
    register-with-eureka: false  #不向注册中心注册自己
    fetch-registry: false  #false 表示自己就是注册中心,我的职责就是维护服务实例,并不需
    server-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

  instance:
      #注册到eureka后,status的名字(服务在eureka的唯一标志)
      instance-id: ${spring.application.name}:${server.port}
      #访问路径可以显示IP地址
      prefer-ip-address: true

3.consumer通过RestTemplate访问服务端,要求RestTemplate访问服务端的时自带负载均衡。
3.1添加@LoadBalanced负载均衡 注解(LoadBalance默认算法是轮询算法),在获得Rest时加入Ribbon的配置

@Configuration   //相当于applicationContext.xml
public class ConfigBean {
    @Bean
    @LoadBalanced    //开启负载均衡
    public RestTemplate getRestTemplate(){
         return new RestTemplate();
    }
}

3.2将访问后端provider的地址信息改为服务器名称
provider集群对外暴漏的服务名称是相同的,provider和consumer都注册进入Eureka,consumer根据算法 通过微服务服务的名称从Eureka 上找到provider并对其进行访问。

@RestController
@Api(tags = {"部门表接口"})
@RequestMapping(value="/Dept")
public class DeptController_Consumer {

    //单机版
    // private static final String REST_URL_PREFIX="http://localhost:8001";

    //通过微服务名称访问微服务
    private static final String REST_URL_PREFIX="http://MICROSERVICECLOUD-DEPT8001";
    @Autowired
    private RestTemplate restTemplate;

    @PostMapping(value="/dept/add")
    public  boolean addDept(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

    @GetMapping(value="/dept/findById/{id}")
    public Dept findById(Long id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/findById/id",Dept.class);
        }

    @GetMapping(value="/findAll")
    public List<Dept> findAll(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/findAll",List.class);
    }
}

多个Eureka集群,多个微服务集群负载均衡架构图:
在这里插入图片描述

Ribbon是怎么实现负载均衡的?
1.先选择EurekaServer,优先选择在同一个区域内负载较少的server.
2.根据用户指定的策略(Ribbon算法,如轮询,随机等),再从server中取到的服务注册列表中选择一个地址。

下图是一个Eureka集群,7001,7002,7003
Consumer消费端
Microservicecloud-dept8001微服务集群,后面的8001,8003是集群的结点.为了测试负载均衡,我们给8001设置的数据库是clouddb01,8003设置的数据库是clouddb03.
在这里插入图片描述

在consumer 配置swagger,访问consumer可以直接实现对Microservicecloud-dept8001微服务的访问,结果如下每进行一次都会进行轮训访问不同的结点
在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lnazj/article/details/83794989