需要的依赖
<!-- 服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 远程调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
方法一
discoveryClient.getInstances("service-product")
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
public Product getProductFromRemote(Integer productId) {
// : 调用商品服务所在的所有机器的ip端口 service-product 是对应的服务名
List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
//这里选择的是第一个instances.get(0)
ServiceInstance serviceInstance = instances.get(0);
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
String url = "http://" + host + ":" + port + "/getProduct/" + productId;
log.info("发送请求,请求地址:{}", url);
Product product = restTemplate.getForObject(url, Product.class);
return product;
}
方法二
loadBalancerClient.choose("service-product");
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
// 使用负载均衡发送
public Product getProductFromRemoteWithLoadBalancer(Integer productId) {
ServiceInstance choose = loadBalancerClient.choose("service-product");
String host = choose.getHost();
int port = choose.getPort();
String url = "http://" + host + ":" + port + "/getProduct/" + productId;
// TODO: 发送请求
log.info("发送请求,请求地址:{}", url);
Product product = restTemplate.getForObject(url, Product.class);
return product;
}
方法三基于注解
@Configuration
public class OrderServiceConfig {
@LoadBalanced //仅仅通过一个注解开启负载均衡
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// 基于注解的方式实现负载均衡
public Product getProductAnnocation(Integer productId) {
String url = "http://service-product/getProduct/" + productId;
// service-product 是服务名,会自动去注册中心获取服务的ip和端口
log.info("基于注解,请求地址:{}", url);
Product product = restTemplate.getForObject(url, Product.class);
return product;
}