目录
一、什么是负载均衡?
二、认识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是Netflix公司的一款用于客户端负载均衡的开源软件工具。它在集群中为各个客户端的通信提供了支持,有助于控制HTTP和TCP客户端的行为,提供了很多负载均衡的算法,例如轮询,随机算法等,同时也是可以实现自定义的算法,
在Springcloud构建的微服务框架中,Ribbon作为服务消费者的负载均衡器,有两种使用方式,一种是与Rest Template相结合的,另一种是与Feign相结合,Feign已经默认集成了Ribbon
Ribbon包含很多子模块,但很多子模块没有用于生产环境。目前用于生产的Riibion的子模块具体如下:
在Spring Cloud中,当Ribbon和Eureka配合使用的时候,ribbon可从Eureka Server中获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。Ribbon整合Eureka的结构图如下:
Nginx是服务器的负载均衡,客户端所有的请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用服务接口的时候,会在注册中心上获取注册信息服务列表之后缓冲到JVM本地,从而在本地实现RPC远程服务调用技术.
上一篇我们已经实现了Eureka的高可用集群,理论上使得微服务架构已经很完美了。但是,考虑到机器自身的硬件条件的限制,面对流量高峰,系统可能会出现宕机的情况。此时,如果使用Ribbon整合Eureka实现负载均衡,将用户请求分摊到多个服务上,就能幅度减轻访问服务压力,使系统达到更好的负载能力
我们在上篇搭建Eureka集群的基础上进行加工改造:
在项目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;
}
}
使用Spring Initializr方式创建一个名称为demo-ribbon-client的Spring Boot的项目。添加Eureka-Client,Spring web和Ribbon依赖。
在这里说明一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
spring:
application:
name: service-ribbon
server:
port: 8764
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7000/eureka/
在项目启动类中添加@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);
}
}
在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();
}
}
在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);
}
}
在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();
}
}
启动服务器demo-server和demo-server-another,服务提供者demo-provider和demo-provider-another,服务消费者demo-ribbon-client,在浏览器上访问http://server1:7000与http://server2:7009,无论访问哪个server的注册实例都是一样的,界面显示如下:
从上面两张图片中可以看出,两个服务器提供者和一个服务消费者已经全部注册到Eureka上,实现了高可用为了掩饰含有ribbon的服务消费者负载均衡的效果
在浏览器上多次访问http://localhost:8764/hi?name=forezp,浏览器交替显示:
Hello World,I'm from port7000
Hello World,I'm from port7009
说明负载均衡起了效果,负载均衡器会轮流请求两个服务提供者的”/hi“接口。