Java高级教程之SpringCloud-6:微服务客户端负载均衡Ribbon

微服务注册中心使用了多节点的Eureka实现了集群,两个节点还可以扩展至三个或多个。除了注册中心的集群,微服务各个客户端也可以开启多个节点,比如启动多个产品服务product-service,SpringCloud可以用Ribbin来进行多个节点的负载均衡。

 

在order-service中使用product-service,有下面的实现。

 

package com.lpplpp.app.service;

import com.lpplpp.app.model.Order;
import com.lpplpp.app.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;

    public Order getById(Long id) {

        Product product = getProductById(1L);
        Order order = new Order(1L,"mobile order");
        order.setProduct(product);
        return order;
    }

    public Product getProductById(Long id) {

        String itemUrl = "http://product-service/product/{id}";
        Product product = restTemplate.getForObject(itemUrl, Product.class, id);
        return product;
    }


}

 

这里的restRemplate是在ApplicationMain中注入了一个Bean,而且加上了@LoadBalanced,也就是负载均衡。负载均衡可以让微服务按配置的策略选择使用的服务,所以如果开启了多个product-service,这里order-service就只会从中选择一个节点。选择的策略有轮询,随机,也可以自定义。

 

开启多个产品的实例,可以新建工程来实现,也可以打包后再使用命令开启。这里为了节省工程,选择打包方式然后运行jar包。

 

如果直接打包,会把配置文件打在jar包里,可以先使用maven-jar-plugin把配置文件排除在外,只打包.class文件并且添加一个config目录作为classpath。

 

Java高级教程之SpringCloud-6:微服务客户端负载均衡Ribbon

 

同时,运行jar包还需要依赖很多包库,所以再建一个目录存放依赖包,并且用maven-dependence-plugin插件把jar包都打进这个文件夹目录。

 

 

 

另外,还需要把配置文件单独打进一个目录,使用maven-resources-plugin插件复制到config目录。

 

 

运行打包命令man clean package,对pom.xml进行打包后就会生成相应的几个目录。

 

Java高级教程之SpringCloud-6:微服务客户端负载均衡Ribbon

 

现在运行这个micro-service-product.jar包,就可以启动一个实例。

 

java -jar app/micro-service-product.jar

 

复制app目录到app_2,然后把app_2/config里的配置文件改一下,端口为8181,再启动这个实例。

java -jar app_2/micro-service-product.jar

 

 

这样,我们可以看到Eureka里面已经有两个实例了。

 

同样还可以启动第三个实例,只需要端口改为8282,目录为app_3。

java -jar app_3/micro-service-product.jar

 

 

在选择服务时,order-service会从注册中心按配置的负载均衡策略选择一个实例。如果要改变负载均衡策略,可以在application.yml中增加负载均衡的配置。默认为PredictBaseRule,现在改为RandomRule,重新启动order-service。

 

Java高级教程之SpringCloud-6:微服务客户端负载均衡Ribbon