一、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的时候所写,仅供参考,大家一起学习,共同进步!