发布时间:2022-09-01 12:00
ribbon是netflix开发的一套负载均衡的工具,只要为ribbon提供应用程序名,就可以实现负债均衡。ribbon提供了很多负载均衡算法。也就是com.netflix.loadbalancer.IRule接口的实现类。我们也可以自己定义负载均衡算法。
1.首先我们需要一个eureka注册中心,最少两个服务提供者,一个服务消费方。
项目结构:
2.客户端我们需要导入eureka客户端的pom文件,因为eureka-client已经包含了ribbon的包了,所以不用重复导入。
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
可以看到包含关系
3.在往spring容器里面注入RestTemplate的时候,加上注解LoadBalanced可以通过服务名访问服务提供者,并支持负载均衡。
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 ApplicationConfig {
@Bean
@LoadBalanced // 多个服务提供者可以轮询调用
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4.有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。 比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。
import com.xx.job.common.CommonResult;
import com.xx.job.entity.Payment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
// 有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。
// 比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。
public static final String URI = "http://SPRING-CLOUD-PAYMENT";
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/selectById/{id}")
public CommonResult selectById(@PathVariable Long id){
ResponseEntity forEntity = restTemplate.getForEntity(URI + "/payment/selectById/" + id, CommonResult.class);
CommonResult body = forEntity.getBody();
return body;
}
@GetMapping("/insert")
public CommonResult insert( Payment payment){
ResponseEntity forEntity = restTemplate.postForEntity(URI + "/payment/insert", payment, CommonResult.class);
return forEntity.getBody();
}
@GetMapping("/discovery")
public Object discoveryClient(){
List services = discoveryClient.getServices();
services.forEach(x->{
System.out.println(x);
});
List instances = discoveryClient.getInstances("SPRING-CLOUD-PAYMENT");
instances.forEach(x->{
System.out.println(x.getHost());
System.out.println(x.getInstanceId());
System.out.println(x.getPort());
System.out.println(x.getServiceId());
System.out.println(x.getUri());
System.out.println(x.getMetadata());
System.out.println(x.getScheme());
System.out.println("------------------------");
});
return discoveryClient;
}
}
5.Ribbon更换默认负载均衡算法 RandomRule(随机)
注意:默认算法配置类不能放到@ComponentScan注解同级或者子级。
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRandomRule {
@Bean
public RandomRule randomRule(){
return new RandomRule();
}
}
负载均衡算法有哪些
启动类配置RibbonClient注解,name要调用的服务提供者,configuration负载配置类
import com.xx.MyRule.MyRandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "SPRING-CLOUD-PAYMENT",configuration = MyRandomRule.class)
public class OrderConsumer80 {
public static void main(String[] args) {
SpringApplication.run(OrderConsumer80.class,args);
}
}
6.完成,测试
git地址:spring-cloud-demo: spring-cloud-demo试例