关键要点
-
引入相关依赖
-
在restTemplate 添加@LoadBalanced//开启负载均衡注解
入门使用方式
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
在restTemplate 添加@LoadBalanced//开启负载均衡注解
package com.caicai;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient//开启eureka服务端的调用
@SpringBootApplication
public class ConsumerServiceApplication {
//Spring boot 调用的接口都是rest风格的接口,这里我们使用,Spring 自带的resTemplate 去调用,它包含了:http,post 等等
@Bean
@LoadBalanced//开启负载均衡注解
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication.class);
}
}
客户端根据服务名称进行调用
以下代码包含了多种方式,由繁琐到简单。ribbon有多种负载均衡算法,默认的是轮询
package com.caicai.Consumer.Control;
import com.caicai.Consumer.po.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
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
@RequestMapping("consumer")
public class ConsumerControl {
@Autowired
private RestTemplate restTemplate;
// @Autowired
// private DiscoveryClient discoveryClient; //这里的discoverclient 是Spring下面的discovercliet
//写死调用方式
// @GetMapping("{id}")
// public User queryById(@PathVariable("id") Long id)
// {
// String url = "http://localhost:8081/user/"+id;
// User user = restTemplate.getForObject(url,User.class);
// return user;
//
// }
//动态调用方式 五负载均衡的方式运行,比较low
// @GetMapping("{id}")
// public User queryById(@PathVariable("id") Long id)
// {
// //根据服务ID 获取实例
// List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
// //从实例种获取相关信息
// ServiceInstance instance = instances.get(0);
// String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;
// System.out.println(url);
// User user = restTemplate.getForObject(url,User.class);
// return user;
//
// }
//带有负载均衡,调用方式
//第一种方式,还是太麻烦
// @Autowired
// private RibbonLoadBalancerClient loadBalancerClient; //这里的discoverclient 是Spring下面的discovercliet
//
// @GetMapping("{id}")
// public User queryById(@PathVariable("id") Long id)
// {
// //从实例种获取相关信息
// //这里已经做了负载均衡
// ServiceInstance instance = loadBalancerClient.choose("user-service");
// //获取实例,进行拆分
// String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;
//
// System.out.println(url);
// User user = restTemplate.getForObject(url,User.class);
// return user;
//
// }
//通俗易懂的方式
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id)
{
//更具服务直接写url,原因是ribbon有一个拦截器,拦截一切rest请求方式,它会根据你请求的地址,获取服务名,然后根据服务名获取hostname、port,轮询之后,返回给你使用。
String url = "http://user-service/user/"+id;
User user = restTemplate.getForObject(url,User.class);
return user;
}
}
ribbon 也提供可以修改轮询的方式,这个可以在官网上面能查的到
SpringBoot也帮我们提供了修改负载均衡规则的配置入口:
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
格式是:{服务名称}.ribbon.NFLoadBalancerRuleClassName
,值就是IRule的实现类。