负载均衡
负载均衡是高可用网络基础架构的关键组成部分,有了负载均衡,我们可以部署多带服务器,然后通过负载均衡将用户的请求分发到不同服务器用来提高网站,应用,数据库或者其他服务的性能以及可靠性。
硬件负载均衡
在服务器和网络间安装负载均衡设备;负载均衡器独立于操作系统之外,整体性能大幅提高。加之多样的负载均衡策略,智能的流量统计,硬件负载均衡的解决方案可达到最佳的负载均衡效果。
软件负载均衡
在一台或者多台服务器相应的操作系统上安装一个或者多个附加软件实现负载均衡;他的优点是基于特定环境,简单配置,使用灵活,成本低廉。
一般负载均衡器会维护一个可用的服务清单,通过心跳检测来剔除故障节点以保障服务清单都是可以正常访问的服务器。当网络请求发送请求到负载均衡器时,负载均衡器会根据某种算法,从服务清单中选择一个服务器,从而提高系统的可用性和稳定性。
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单地说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单地说,就是在配置文件中列出Load Balancer(简称LB)后面所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
RestTemplate是Spring提供的一个HTTP客户端,封装了常见的HTTP操作,比如GET、POST、PUT、DELETE等。它建立在HTTP客户端库之上,可以帮助开发人员直接使用HTTP请求进行Web服务调用,并通过自定义转换器将响应转换为需要的数据结构。
使用RestTemplate可以更方便地进行HTTP通信,而无需手动创建HTTP连接,处理请求和响应等操作,提高了开发效率和代码可维护性。RestTemplate可以使用多种HTTP客户端库进行请求,如JDK自带的URLConnection、Apache HttpComponents、Netty等,也提供了多种解析响应的方式,如默认的字符串转换器、XML转换器、JSON转换器等。
在Spring Boot中,RestTemplate已经预置,并通过自动配置的方式来使用。开发人员只需要在代码中注入RestTemplate,配置请求URL和参数,然后调用相关方法即可进行HTTP通信。
@LoadBalanced是Spring Cloud Ribbon提供的一个注解,用于在RestTemplate或其他HTTP客户端中进行负载均衡。通过@LoadBalanced注解,可以让RestTemplate具备负载均衡的能力,让RestTemplate请求的服务实例之间分布均匀,实现高可用和负载均衡的需求。
在使用@LoadBalanced注解时,需要先构建一个带有@LoadBalanced注解的RestTemplate Bean。在Spring Boot应用程序中,可以在配置类中使用@Bean注解创建并配置它:
@Configuration
public class MyConfiguration {
@Bean //将此方法声明成一个Bean,提供Spirng应用上下文中
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
这里只搭建含有Ribbon的服务消费者
说明:此实验是在高可用集群的基础上开始的,高可用集群可参考:
Eureka——服务注册与发现框架_杜小白也想的美的博客-CSDN博客
1、创建一个SpringBoot的项目,添加Eureka Client,Ribbon(注意:Eureka client内置了此依赖,此依赖在高版本的Eureka Clinet中可能会引发错误,比如服务调用不成功),Web依赖。
2、配置application.yml文件
配置文件如下:
spring:
application:
name: eureka-ribbon-client
server:
port: 8764
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7000/eureka
3、创建配置类
在类中创建RestTemplate对象的Bean,并通过@LoadBalance开启负载均衡,如下:
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate rt(RestTemplateBuilder rtb){
return rtb.build();
}
}
3、创建RibbonService类,注入RestTemplate对象,并调用提供者服务
如下:
@Service
public class RibbonService {
@Autowired
RestTemplate rt ;
public String hi() {
return rt.getForObject(
"http://eureka-provider/port",String.class);//由于使用了@LoadBalanced注解,此处URI形式为http://应用名/API接口
}
}
4、创建RibbonController类
@RestController
public class RibbonController {
@Autowired
RibbonService ribbonService;
@RequestMapping("/hi")
public String gethi() {
return ribbonService.hi();
}
}
5、在启动类中添加@SpringBootApplication @EnableEurekaClient
6、启动测试(两个提供者的端口分别是7002,7007)