【SpringCloud微服务笔记08】客户端与负载均衡服务器Ribbon

目录

一、什么是负载均衡?

二、认识Ribbon

2.1 什么是Ribbon

2.2 Ribbon本地负载均衡与Nginx服务端负载均衡的区别?

三、Ribbon实例

3.1 改造服务提供者:

3.2 创建一个含有Ribbon的服务消费者

3.3 修改全局配置文件applcation.yml

3.4 在项目的启动类中激活Eureka Client的相关配置。

3.5 创建配置类

3.6 创建配置类。

3.7 创建controller类。

3.8 测试运行


一、什么是负载均衡?

        负载均衡,英文名称为Load Balance,是高可用网络基础架构的一个关键组成部分,有了负载均衡,我们通常可以部署多台应用服务器,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站,应用,数据库,或其它服务的性能以及可靠性。

关于具体什么是负载均衡,大家可以看我的另外一篇文章:负载均衡透析

二、认识Ribbon

2.1 什么是Ribbon

        Ribbon是Netflix公司的一款用于客户端负载均衡的开源软件工具。它在集群中为各个客户端的通信提供了支持,有助于控制HTTP和TCP客户端的行为,提供了很多负载均衡的算法,例如轮询,随机算法等,同时也是可以实现自定义的算法,

        在Springcloud构建的微服务框架中,Ribbon作为服务消费者的负载均衡器,有两种使用方式,一种是与Rest Template相结合的,另一种是与Feign相结合,Feign已经默认集成了Ribbon

        Ribbon包含很多子模块,但很多子模块没有用于生产环境。目前用于生产的Riibion的子模块具体如下:

  1. ribbon-core:包括定义负载均衡接口,客户端接口,内置的负载均衡实现接口等的API
  2. ribbon-eureka :提供Eureka客户端实现负载均衡的API
  3. ribbon-httpclient:对apache的HTTP client进行封装。该模块提供了含有负载均衡功能的REST客户端

在Spring Cloud中,当Ribbon和Eureka配合使用的时候,ribbon可从Eureka Server中获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。Ribbon整合Eureka的结构图如下:

【SpringCloud微服务笔记08】客户端与负载均衡服务器Ribbon_第1张图片

2.2 Ribbon本地负载均衡与Nginx服务端负载均衡的区别?

        Nginx是服务器的负载均衡,客户端所有的请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。
        Ribbon本地负载均衡,在调用服务接口的时候,会在注册中心上获取注册信息服务列表之后缓冲到JVM本地,从而在本地实现RPC远程服务调用技术.

三、Ribbon实例

上一篇我们已经实现了Eureka的高可用集群,理论上使得微服务架构已经很完美了。但是,考虑到机器自身的硬件条件的限制,面对流量高峰,系统可能会出现宕机的情况。此时,如果使用Ribbon整合Eureka实现负载均衡,将用户请求分摊到多个服务上,就能幅度减轻访问服务压力,使系统达到更好的负载能力

 我们在上篇搭建Eureka集群的基础上进行加工改造:

3.1 改造服务提供者:

在项目eureka-provider和eureka-provider-another中新建controller包,并创建Portcontroller类,该类能够来返回当前项目的端口号,Portcontroller类中的代码如下:

package com.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController/*该注解标注在PortController类上,
其效果等同于@Controller和@RestpionseBody*/

/**
 * @Title: PortController
 * @Description:
 * @Auther:
 * @Version: 1.0
 * @create 2023/4/26 11:30
 */
public class PortController {
    @Value("${server.port}")//用于将配置文件中的server.port属性的值注入port
    String port;
    @RequestMapping("port")//用于指定getPort()方法处理路径为/port的请求
    public String getPort(){
        return "Hello World,I'm from port:"+port;
    }
}

3.2 创建一个含有Ribbon的服务消费者

使用Spring Initializr方式创建一个名称为demo-ribbon-client的Spring Boot的项目。添加Eureka-Client,Spring web和Ribbon依赖。

【SpringCloud微服务笔记08】客户端与负载均衡服务器Ribbon_第2张图片

在这里说明一i下:老版本的web依赖中有内置的ribbon依赖,但现在需要自己手动进行添加,ribbon依赖代码如下:


            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
            2.2.8.RELEASE

创建好的项目pom.xml文件如下:



	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		2.7.11
		 
	
	com.example
	demo-ribbon-client
	0.0.1-SNAPSHOT
	demo-ribbon-client
	Demo project for Spring Boot
	
		1.8
		2021.0.6
	
	
		
			org.springframework.boot
			spring-boot-starter-web
		
		
			org.springframework.cloud
			spring-cloud-starter-netflix-eureka-client
		
        
		    org.springframework.cloud
		    spring-cloud-starter-netflix-ribbon
		    2.2.8.RELEASE
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	
	
		
			
				org.springframework.cloud
				spring-cloud-dependencies
				${spring-cloud.version}
				pom
				import
			
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

3.3 修改全局配置文件applcation.yml

spring:
  application:
    name: service-ribbon
server:
  port: 8764
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7000/eureka/


3.4 在项目的启动类中激活Eureka Client的相关配置。

在项目启动类中添加@EnableEurekaClient注解,开启EurekaClient功能

具体实现如下:

package com.example.demoribbonclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class DemoRibbonClientApplication {

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

}

3.5 创建配置类

在demoribbonclient下新建config包,并在该包下创建Ribbon Config类。在类中注入restTemplate的bean对象。并在Bean对象中加上@Load Balaned注解,具体如下:

package com.example.demoribbonclient.config;

import jdk.nashorn.internal.runtime.logging.Logger;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Title: RibbonConfig
 * @Description:
 * @Auther:
 * @Version: 1.0
 * @create 2023/4/27 20:48
 */
public class RibbonConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }
}

3.6 创建配置类。

在demoribbonclient下新建service包,并在该包下创建一个RibbonService类。在类的hi()方法中使用restTemplate调用eurekaclient的API.

package com.example.demoribbonclient.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @Title: RibbonService
 * @Description:
 * @Auther:
 * @Version: 1.0
 * @create 2023/4/29 22:23
 */
@Service
public class RibbonService {
    @Autowired
    RestTemplate restTemplate;
    public String hi(){
        return restTemplate.getForObject("http://demo-provider/port",String.class);
    }
}

3.7 创建controller类。

在demoribbonclient下新建controller包,在该包下新建一个RibbonController的类。在该类上添加@RibbonController注解,将RibbonController类标注为一个Controller类。写一个hi()方法,调用RibbonService的hi()方法,具体实例如下:

package com.example.demoribbonclient.Controller;

import com.example.demoribbonclient.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Title: RibbonController
 * @Description:
 * @Auther:
 * @Version: 1.0
 * @create 2023/4/29 22:28
 */
@RestController
public class RibbonController {
    @Autowired
    RibbonService ribbonService;
        @RequestMapping("/hi")
        public String hi(){
            return ribbonService.hi();
        }
}

3.8 测试运行

启动服务器demo-server和demo-server-another,服务提供者demo-provider和demo-provider-another,服务消费者demo-ribbon-client,在浏览器上访问http://server1:7000与http://server2:7009,无论访问哪个server的注册实例都是一样的,界面显示如下:

【SpringCloud微服务笔记08】客户端与负载均衡服务器Ribbon_第3张图片

【SpringCloud微服务笔记08】客户端与负载均衡服务器Ribbon_第4张图片

 从上面两张图片中可以看出,两个服务器提供者和一个服务消费者已经全部注册到Eureka上,实现了高可用为了掩饰含有ribbon的服务消费者负载均衡的效果

在浏览器上多次访问http://localhost:8764/hi?name=forezp,浏览器交替显示:

Hello World,I'm from port7000

Hello World,I'm from port7009

说明负载均衡起了效果,负载均衡器会轮流请求两个服务提供者的”/hi“接口。 

你可能感兴趣的:(服务器,spring,cloud,负载均衡)