欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ribbon实现服务器的负载均衡

程序员文章站 2024-01-23 14:08:04
...

实现负载均衡只需要在RestTempate的bean上面加上@LoadBalanced的注解

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

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

原理:

    Ribbon实现服务器的负载均衡

工作:

    分为两步: 可以在服务器端搭建Nginx,通过反向代理来实现负载均衡,另一种方式就在客户端实现

    1,第一步有限选择Eureka Server ,。它优先选择在同一个Zone且负载较少的Server

     2,第二步在根据用户指定的策略,在从server取到服务注册列表中选择的一个地址,其中Ribbon提供了多种策略,例如轮训 Rround robin、随机Random、根据相应时间的加权等

Ribbon实现服务器的负载均衡

下面代码是用于指定Ribbon的负载方式:  特别注意的是该类不能放在启动类的目录中或者子目录下

package comcs.ribbon;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 该类是用于指定Ribbon使用负载均衡的方式,是轮询还是随机
 */
@Configuration
public class ribbon {
    @Bean
    public RandomRule ribbonRule() {
        System.out.println("---->>ribbon in ---");
        return new RandomRule();
    }
}

在启动类中设置@RibbonClient注解里面设置

     name:为链接的注册中心的地址

      configuration:表示的是 负载均衡的方式,是轮询还是随机

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "server-user", configuration = ribbon.class )
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }

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

具体的测试

package com.springcolud.user.user;


import com.springcolud.user.user.user.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.client.RestTemplate;

/**
 * 测试类,用于测试调用微服务的数据
 */
public class MovieController {
//    具体的方法的调用
    @Autowired
    private RestTemplate   restTemplate;

//    用于获取服务中最小的负载权衡的server
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/hello")
    public User findByid(@PathVariable Long id){
//        进行方法的具体的调用
         return  restTemplate.getForObject("server-user/hello"+id,User.class);
    }

    @GetMapping("test")
    public void test(){

        ServiceInstance choose = loadBalancerClient.choose("server-user");
        System.out.println(choose.getHost()+".." +choose.getPort() +"'.."+choose.getUri());
    }

}

特别注意:进行设置负载均衡的方法的类不能在启动类的目录下或者是子目录下。如果非要放在启动类的目录下或者是子目录下需要以下的设置

  创建一个注解,该注解中没有任何的内容

package com.springcolud.user.user;

public @interface ExcludeFromComponentScan {

}

在启动类上进行设置  加上@ComponentScan进行设置

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "server-user", configuration = ribbon.class )
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,value = ExcludeFromComponentScan.class ))
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }

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

然后在策略类上进行设置刚才的注解

     


@Configuration
@ExcludeFromComponentScan
public class ribbon {

    @Bean
    public RandomRule ribbonRule() {
        System.out.println("---->>ribbon in ---");
        return new RandomRule();
    }
}