Spring Cloud Ribbon客户端负载均衡(学习总结)

一、Ribbon介绍

Ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。在实际项目中,我们可以通过Ribbon实现对服务的均衡调用,以防止某个服务实例出现突发问题的时候服务调用出现问题。

二、准备工作

本章主要涉及三个项目模块,分别是

SpringCloudEurekaServer服务注册中心,端口号为1111;

SpringCloudRibbonService提供具体服务的Eureka客户端,端口号为2222;

SpringCloudRibbonClient为Ribbon客户端,具体实现Ribbon负载均衡的作用,端口号为3333。

对于eureka服务注册中心的搭建以及RibbonService服务消费者的搭建本文不做详细介绍,需要注意的是,在SpringCloudRibbonService项目中,RibbonServiceController.java需要提供一个用于被Ribbon调用的方法,具体如下:

/**
 * Ribbon 服务提供者测试Controller
 *
 * @author weishihuai
 * @date 2018/9/9
 */
@RestController
public class RibbonServiceController {
    private static Logger logger = LoggerFactory.getLogger(RibbonServiceController.class);

//    @Value("${server.port}")
//    private String port;
//
//    @Value("${eureka.instance.hostname}")
//    private String hostname;

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/testRibbonService")
    public String test(@RequestParam String name) {
        //获取当前服务实例
        ServiceInstance serviceInstance = discoveryClient.getLocalServiceInstance();
        String host = serviceInstance.getHost();
        Integer port = serviceInstance.getPort();
        logger.info("name: " + name + ", port:" + port + " host: " + host);
        return "name: " + name + ", port:" + port + " host: " + host;
    }
}

三、Ribbon Client项目搭建

本文主要讲解如何搭建Ribbon负载均衡客户端,首先引入pom依赖:
 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.springcloud.wsh</groupId>
	<artifactId>springcloud_ribbon_client</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springcloud_ribbon_client</name>
	<description>SpringCloudRibbon负载均衡客户端</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Camden.SR6</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

四、启动类加上@EnableDiscoveryClient注解,并且向ioc容器注入RestTemplate用于实现负载均衡

注意:必须注入restTemplate,并且加上@Bean注解(spring容器bean注入)以及@LoadBalanced注解(开启负载均衡功能)。

/**
 * Ribbon负载均衡客户端需向spring ioc容器注入RestTemplate
 * Spring Cloud服务调用主要有两种:(Ribbon + RestTemplate) / Feign远程服务调用
 * Ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。
 * @author weishihuai
 * @date 2018/09/09 21:34
 */
@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudRibbonClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudRibbonClientApplication.class, args);
    }

    /**
     * 说明: @LoadBalanced注解主要是开启RestTemplate负载均衡的功能
     * 注入ioc容器
     */
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

五、新建application.yml文件,指定服务注册的地址、端口号,服务名称等

server:
  port: 3333
spring:
  application:
    name: eureka-ribbon-client
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1111/eureka/

六、新建RibbonClientService.java

注入RestTemplate用于实现负载均衡,主要利用restTemplate中一些常用的方法如getForObject/getForEntity/postForObject/postForEntity等实现。

/**
 * Created by weishihuai on 2018/9/9.
 * 使用ribbon + restTemplate调用ribbon-service提供的服务
 * 测试负载均衡的时候需要启动多个服务提供者实例,确认各个实例是否均衡调用。
 *
 * @author weishihuai
 * @date 2018/09/09 21:37
 */
@Service
public class RibbonClientService {

    /**
     * 注入restTemplate
     * restTemplate主要有getForObject/getForEntity/postForObject/postForEntity等常用方法
     */
    @Autowired
    RestTemplate restTemplate;

    public String testRibbonService(String name) {
        //eureka-ribbon-service对应 ribbon-service的applicaton name
        //使用应用名称替代具体的url地址,在ribbon中会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名
        //restTemplate.getForObject("http://eureka-ribbon-service/testRibbonService?name={name}", String.class, name);
        return restTemplate.getForObject("http://eureka-ribbon-service/testRibbonService?name=" + name, String.class);
    }

}
注意:restTemplate调用的url为:http://eureka-ribbon-service/testRibbonService?name=,其中我们使用应用名称代替了具体的url调用ribbonService,因为ribbonSerivce以及RibbonClient都注册到Eureka,在实际请求的时候会将服务名称替换回url进行访问。

七、新建RibbonClientController.java

主要进行负载均衡的测试:

/**
 * Created by weishihuai on 2018/9/9.
 * 用于测试Ribbon客户端负载均衡
 *
 * @author weishihuai
 * @date 2018/09/09 21:37
 */
@RestController
public class RibbonClientController {
    private static Logger logger = LoggerFactory.getLogger(RibbonClientController.class);

    @Autowired
    private RibbonClientService ribbonClientService;

    @RequestMapping("/testRibbonService")
    public String testRibbonService(@RequestParam String name) {
        String result = ribbonClientService.testRibbonService(name);
        //通过打印日志可用看到RibbonService负载均衡调用的效果
        logger.info(result);
        return result;
    }

}

八、测试

首先,启动eureka-server服务注册中心,接着,启动两个RibbonSerivce实例,对于怎么启动两个实例,一种方法是通过java -jar启动的时候添加一些配置参数,本文讲解第二种方式,使用idea启动多个实例 ,具体步骤如下:

a. 点击run/debug configuration:取消勾选单个实例启动single instance only.

b.修改application.yml文件,通过修改端口号实现启动多个实例:

可以看到,我首先启动了2222端口,启动完成后修改端口为2223.再次启动项目,这样就会启动两个端口为2222和2223的服务实例。访问http://localhost:1111/可以看到已经注册了两个端口为2222以及2223的eureka-ribbon-service:

接下来,启动ribbon-client负载均衡客户端服务,浏览器访问http://localhost:1111/可以看到ribbon-client也已经注册成功。

然后,浏览器访问http://localhost:3333/testRibbonService?name=weixiaohuai,运行结果如下:

通过后台打印的日志可以看到ribbon已经实现了对ribbon-service(端口2222和2223)的均衡调用(轮询方式):

九、总结

通过以上方式可以实现ribbon对服务的负载均衡调用,简图如下:

  • eureka服务注册中心,端口为1111
  • ribbon-service启动两个个实例,端口分别为2222和2223,分别向Eureka注册
  • ribbon-client端口为3333,向Eureka注册
  • 当ribbon-client通过restTemplate调用ribbon-service的testRibbonService接口时,由于使用了ribbon负载均衡,轮询调用ribbon-service(2222/2223)的两个服务实例。

至此,通过Ribbon实现服务负载均衡调用已经实现,本文是笔者在复习SpringCloud的时候所写,仅供参考,大家一起学习,共同进步!

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/82588510