Spring Cloud微服务的客户端负载均衡组件Ribbon
目录
一、背景
上一篇提到eureka服务消费者请求服务使用spring的restTemplate进行分布式系统中的接口访问,实际生产中,提供接口服务的往往是一个eureka服务集群;如何在服务集群选择合适的服务节点访问,这里就涉及到了负载均衡的概念。
负载均衡的作用:
- 提高对系统的高可用,
- 缓解网络压力
- 处理能力扩容
负载均衡算法有:
- 轮询(默认)
- 权重分配
- 流量负载等
负载均衡包括服务端负载均衡和客户端负载均衡,服务端负载均衡又包括硬件负载均衡和软件负载均衡。硬件负载均衡主要是通过在服务器节点之间安装专门用于负载均衡的设备,如F5等;而软件负载均衡则通过在服务器上安装均有负载均衡功能的软件来来完成请求分发工作,如Nginx等。
客户端负载均衡和服务端负载均衡不同在服务清单所存储的位置,客户端负载均衡中客户端维护者自己要访问的服务清单,这些清单来源于注册中心,需要心跳取维护服务端清单的健康性。通过Spring Ribbon的封装,在为微服务中使用客户端负载均衡非常简单。
二、eureka服务消费者搭建
开发工具:idea
1、File---> New ---> Project---->spring Initialzr
2、填写项目包名、项目名,继续NEXT
3、选中Discovery Client和web模块,还有ribbon模块、Next-->(选择项目目录)Finish
4、项目生成后目录结构如下,其中controller、service、api为新建的包,其他文件及目录是默认生成的
5、我们来看看pom.xml
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>org.springframework.cloud</groupId> 7 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 8 </dependency> 9 <dependency> 10 <groupId>org.springframework.cloud</groupId> 11 <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> 12 </dependency>
6、启动类加上EnableDiscoveryClient注解,自动化配置为服务治理的客户端
通过loadBalanced注解来自动化配置restTemple的请求负载均衡,默认轮询。
@EnableDiscoveryClient @SpringBootApplication public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); }
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
7、application.properities配置
server.port=8089 spring.application.name=eureka-ribbon eureka.instance.hostname=localhost eureka.client.serviceUrl.defaultZone=http://admin:123456@localhost:1111/eureka/ #IP进行注册 eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} eureka.instance.preferIpAddress=true ribbon.eureka.enabled=true # 请求连接的超时时间 ribbon.ConnectTimeout=2000 # 请求处理的超时时间 ribbon.ReadTimeout=5000 # 最大连接数 ribbon.MaxTotalConnections=500 # 每个host最大连接数 ribbon.MaxConnectionsPerHost=500
8、Controller提供服务请求入口,处理参数。
1 @RestController
2 public class SysController {
3
4 @Autowired
5 SysService sysService;
6
7 @ResponseBody
8 @RequestMapping("/hi")
9 public String greetService(@RequestParam("service_name")String service_name){
10 return sysService.hiService(service_name);
11 }
12 }
service用于编写业务代码:
eureka-client为服务实例,
@Service
public class SysService {
@Autowired
RestTemplate restTemplate;
public String hiService(String service_name){
return restTemplate.getForObject("http://eureka-client/demo?name="+service_name,String.class);
}
}
9、点击以下图标启动服务
出现以下日志代码启动成功
10、访问注册中心localhost:1111,如图就是我们的实例
三、负载均衡验证
- 启动注册中心集群、
- 启动eureka服务提供者集群(eureka-client和eureka-client2)
- eureka-client节点提供服务如下:
-
@RestController public class DemoController { private static final Logger logger = LoggerFactory.getLogger(DemoController.class); @RequestMapping(value = "/demo") public String index(@RequestParam("name") String demo_name){ return "Hello world|| I'm "+demo_name; } }
- eureka-client2节点提供服务如下:
-
@RestController public class DemoController { private static final Logger logger = LoggerFactory.getLogger(DemoController.class); @RequestMapping(value = "/demo") public String index(@RequestParam("name") String demo_name){ return "Hello world cleint2|I'm "+demo_name; } }
-
-
- eureka-client节点提供服务如下:
- 启动eureka服务消费者
- 访问http://localhost:8089/hi?service_name=%27sdas%27为消费者的入口访问eureka服务方的接口;
- 第一次访问,返回结果
第二次访问返回结果如下:
多尝试几次可以发现使用的是负载均衡的轮询策略。
毛主席告诉我们,实践是检验真理的唯一标准。动动小手试试吧。
我是 啧啧啧花儿不谢呀! ,一只有理想,有故事的程序员,欢迎说出你的故事