之前文章已介绍了注册中心(Eureka-Server)和基于Feign使服务消费者(mall-admin)调用服务提供者(user-service),本篇在介绍Spring Cloud家族的另外一个成员Ribbon(负载均衡器)
Ribbon与负载均衡
负载均衡(Load Balance)是利用特定方式将流量分摊到多个操作单元上的一种手段,它对系统吞吐量与系统处理能力有着质的提升。业界对负载均衡有不少分类,最常见的有软负载和硬负载,代表产品是Nginx与F5。还有一组主要是根据架构应用进行分类,服务端负载均衡和客户端负载均衡,Ribbon就是客户端负载均衡。Spring Cloud官方是这样描述Ribbon的:
Ribbon is a Client-side load balancer that gives you a lot of control over the behavior of HTTP and TCP Clients.
项目实战
为了测试Ribbon的负载均衡功能,必须要有一个源服务,并且它需要开启多个实例,在每个实例中需要有一个标识来识别每次调用是请求到了不同服务器。可以使用一份代码,通过以不同端口号(--server.port)启动的方式来实现。
本文中使用之前的服务提供者user-service作为源服务,并且按下列命令分别按不同的端口号启动,为了便于观察,在Controller的输出中携带了当前实例的端口号,
java -jar user-service/target/user-service-1.0-SNAPSHOT.jar --server.port=8091
java -jar user-service/target/user-service-1.0-SNAPSHOT.jar --server.port=8099
Ribbon客户端代码及配置
使用Ribbon需要引入spring-cloud-starter-netflix-ribbon,另外作为Eureka client,需要引入spring-cloud-starter-netflix-eureka-client
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
parent pom.xml
为了简化管理和配置,在父工程里配置好依赖管理,让子工程配置文件变得简洁,详细pom文件可参考git代码。
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class MallApiApplication {
public static void main(String[] args) {
SpringApplication.run(MallApiApplication.class, args);
}
}
mall-api作为Ribbon cleint需要创建一个API来调用user-service源服务暴露的API,需要使用RestTemplate来调用,RestTemplate的一种简易使用方式如下,为了方便在不同环境下测试,以及测试不同的服务,将服务提供者的applicat name、ip、port等配置在了配置文件中
RestTemplage Bean
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
配置文件 application.yml
server:
port: 8093
spring:
application:
name: mall-api # 在注册中心中显示和调用的名称
eureka:
client:
service-url:
defaultZone: http://localhost:8090/eureka/ # 将自己注册到该地址的Eureka上面去
instance:
prefer-ip-address: true
service:
user:
name: http://user-service # 源服务 application name
api:
info: /user/info # 服务提供者的具体接口名
测试
注册中心、源服务、负载均衡客户端均已开发、配置完成,可以进行简要测试
依次启动eureka-server、user-service和mall-api服务,其中user-service已不同的端口号8091和8099至少启动两个实例
启动界面
访问http://localhost:8090/,如下图所示,可以看到已经启动了两个名为user-service的服务实例
![](https://img.haomeiwen.com/i21532542/987d8694d47b8e53.png)
测试
访问http://192.168.31.174:8093/user/api/info?userName=Jack&age=18 会有两种结果,如下图所示
![](https://img.haomeiwen.com/i21532542/dd64eba9890d9853.png)
![](https://img.haomeiwen.com/i21532542/15cf95c4ee1c7e24.png)
从上图中可以明显看出,Ribbon默认使用轮询的方式访问源服务,此外Ribbon对服务实例节点的增减也能动态感知
网友评论