SpringCloud之客户端负载均衡Spring Cloud Ribbon实例

一、简介

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。 通过 Spring Cloud 的封装, 可以让我们轻松地将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用。 
Spring Cloud Ribbon 虽然只是一个工具类框架,它不像服务注册中心、 配置中心、 API 网关那样需要独立部署, 但是它几乎存在于每一个Spring Cloud 构建的微服务和基础设施中。 因为微服务间的调用,API 网关的请求转发等内容实际上都是通过Ribbon 来实现的,包括后续我们将要介绍的 Feign, 它也是基于 Ribbon实现的工具。 所以, 对 Spring Cloud Ribbon 的理解和使用, 对于我们使用 Spring Cloud 来构建微服务非常重要。

二、负载均衡

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容。 因为负载均衡是对系统的高可用、 网络压力的缓解和处理能力扩容的重要手段之一。 我们通常所说的负载均衡都指的是服务端负载均衡, 其中分为硬件负载均衡和软件负载均衡。 硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,比如 F5 等;而软件负载均衡则是通过在服务器上安装一些具有均衡负载功能或模块的软件来完成请求分发工作, 比如Nginx 等。 不论采用硬件负载均衡还是软件负载均衡,只要是服务端负载均衡都能以类似下图的架构方式构建起来:

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第1张图片

通过Spring Cloud Ribbon的封装, 我们在微服务架构中使用客户端负载均衡调用非常简单, 只需要如下两步:

  • 服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
  • 服务消费者直接通过调用被@LoadBalanced 注解修饰过的 RestTemplate 来实现面向服务的接口调用。

三、准备工作

在上一篇中,我们启动eurekaserver,端口5555,和helloserver端口:5556后,现在停止helloserver,并将helloserver的端口改为5557,再次启动。会发现在eurekaserver下有二个实例,这就相当于一个小集群了。访问:http://127.0.0.1:5555/

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第2张图片

  • 启动eurekaserver,端口5555。
  • helloserver中启动类中return "Hello SpringCloud~"改为:
@EnableEurekaServer
@SpringBootApplication
@RestController
public class HelloserverApplication {
    private final Logger log = (Logger) LoggerFactory.getLogger(HelloserverApplication.class);
    @Autowired
    private DiscoveryClient client;

    @Value("${server.port}")
    String port;

    @RequestMapping(name = "/hello", method = RequestMethod.GET)
    public String index() {
        ServiceInstance instance = client.getLocalServiceInstance();
        log.info("/hello, host:" + instance.getHost() + ",service_id:" + instance.getServiceId());
        return "Hello SpringCloud~HOST:" + instance.getHost() + ",PORT:" + port + ",service_id:" + instance.getServiceId();
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloserverApplication.class, args);
    }
}
  • helloserver打包,然后用java -jar helloserver-0.0.1-SNAPSHOT.jar --server.port=5556/5557,分别启动。
SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第3张图片
SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第4张图片

四、新建springcloud ribbon工程

(1)pom.xml(依赖spring-boot-starter-web、spring-cloud-starter-eureka、spring-cloud-starter-ribbon)

	
		org.springframework.cloud
		spring-cloud-starter-eureka-server
	
	
		org.springframework.cloud
		spring-cloud-starter-ribbon
	
	
		org.springframework.boot
		spring-boot-starter-web
	
(2)application.yml

server:
  port: 5560

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:5555/eureka/

spring:
  application:
    name: service-ribbon
  • 指定服务的注册中心地址为http://localhost:5555/eureka/,程序名称为 service-ribbon,程序端口为5560。
(3)启动类

@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudribbonApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
(4)HelloService
@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    public String helloService() {
        return restTemplate.getForObject("http://HELLOSERVER/hello", String.class);
    }
}
  • 这里的http://HELLOSERVER/hello,HELLOSERVER就是第三步中启动的helloserver名称,也就是http://127.0.0.1:5555/中Application的名称。

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第5张图片

(5)HelloController

@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    @RequestMapping("/hello")
    public String hello() {
        return helloService.helloService();
    }
}
(6)测试

访问:http://127.0.0.1:5560/hello。

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第6张图片

刷新:

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第7张图片

(7)增加helloserver的服务实例

命令:java -jar helloserver-0.0.1-SNAPSHOT.jar --server.port=5558

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第8张图片

(8)再次刷新测试,访问:http://127.0.0.1:5560/hello。

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第9张图片

  • 就相当于在nginx下做的负载均衡配置。

(9)访问服务中心eurekaserver:http://127.0.0.1:5555/

SpringCloud之客户端负载均衡Spring Cloud Ribbon实例_第10张图片

五、此时的架构

  1. 一个服务注册中心,eurekaserver,端口为5555;
  2. helloservice工程跑了三个实例,端口分别为5556、5557、5558,分别向服务注册中心注册
  3. sercvice-ribbon端口为5560,向服务注册中心注册
  4. 当sercvice-ribbon通过restTemplate调用helloservice的hello接口时,因为用ribbon进行了负载均衡,会轮流的调用helloservice:5556、5557和5558端口的hello接口;
  5. 服务注册中心也会显示sercvice-ribbon信息。


新手一枚,欢迎拍砖~ ~ ~


你可能感兴趣的:(springcloud)