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();
}
}
原理:
工作:
分为两步: 可以在服务器端搭建Nginx,通过反向代理来实现负载均衡,另一种方式就在客户端实现
1,第一步有限选择Eureka Server ,。它优先选择在同一个Zone且负载较少的Server
2,第二步在根据用户指定的策略,在从server取到服务注册列表中选择的一个地址,其中Ribbon提供了多种策略,例如轮训 Rround robin、随机Random、根据相应时间的加权等
下面代码是用于指定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();
}
}