本节代码:https://github.com/aeolusway/aeolusway.git
如报错,把本地maven库清空,重新拉取资源。本节文末有操作方法:springCloud(一)eureka 注册中心
一、什么是ribbon?
一个基于http和tcp的客户端负载均衡工具。
二、负载均衡
在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会由他先接收,然后再根据每台服务器的负载情况将请求分配到不同的服务器去处理。而如何合理分配请求,保证服务器将性能充分发挥,这就是负载均衡策略问题。
负载均衡的几种实现方式:
(1)http重定向
用户向服务器发起请求,请求首先会被集群调度者拦截,调度这根据某种分配策略,选择一台服务器,并将选中的服务器ip封装在http响应消息头部的Location字段中,并将响应消息的状态码设为302,最后将这个响应信息返回给浏览器,浏览器受到响应信息后,解析location字段,并向改url发起请求,然后指定的服务器处理该用户请求,最后将结果返回给用户。
(2)DNS
DNS是域名解析器,将请求的域名解析成ip地址。如果一个域名指向了多个ip地址,那么在进行域名解析时,DNS只需要选择一个ip返回给用户。
(3)反向代理
所有用户发来的请求都首先要经过反向代理服务器,更具用户的请求,反向代理服务器要么直接将结果返回给用户,要么将请求交给后端服务器处理,再返回给用户。
会产生粘滞会话的问题:某个服务器处理了用户的请求,保存了该用户的session或缓存,下一次该用户再次发送请求时,无法保证请求的仍然是保存了其session或缓存的服务器处理。
解决办法:1、以用户ip作为标识,相同ip的用户交由同一服务器处理。2、可以在cookie中标注请求的服务器id。
参考文章:https://blog.csdn.net/github_37515779/article/details/79953788
(四)ribbon负载均衡实现策略
1、随机
2、轮询
3、一致性哈希
4、哈希
5、加权
三、实现思路
一个eureka注册中心,一个服务发现者,注册到eureka中的两个同名的服务提供者。
注册中心代码:springCloud(一)eureka 注册中心
一个服务发现者,一个服务提供者:springCloud(二)服务提供和服务发现
还需要一个同名(service-member)的服务提供者,实现在文后列出:
通过服务发现者SpringCloud-OrderService 去调用service-member(这个名字的服务有两个实现ip),@LoadBalanced 注解过的restRemplate就会开启负载均衡的功能,使用轮询策略依次调用两个同名但不同的服务。
四、开启ribbon
@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。
这个注解在这一章中有使用——> springCloud(二)服务提供和服务发现,SpringCloud-OrderService 项目下:
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
五、名为service-member的服务提供者
与上一个服务提供者除开application.yml中设置的端口不同外,其他都一样。
包结构
MemberServices2App
package com.aeolusway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class MemberServices2App {
public static void main(String args[]){
SpringApplication.run(MemberServices2App.class,args);
}
}
MemberServices2Controller:为了显示分别,返回的字符串不一样
package com.aeolusway.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MemberServices2Controller {
@RequestMapping("/getUsername")
public String getUsername(){
return "this is 8891 port service";
}
}
application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
server:
port: 8763
spring:
application:
name: service-member
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.aeolusway</groupId>
<artifactId>SpringCloud-MemberServices2</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
六、分析
首先启动eureka注册中心,然后以此启动两个服务提供和一个服务发现,访问注册中心:http://127.0.0.1:8888/
就会看到如下:
service-member 下有两个端口不同的ip, 服务发现者便是通过负载均衡策略去分别调用这两个ip。
我们访问服务调用者:http://localhost:8764/getMember 就会发现,采用的是轮询策略调用这两个ip。