客户端负载均衡器
在SpringCloud中Ribbon负载均衡客户端,会从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地。然后在本地实现轮训负载均衡策略。
Ribbon与Nginx区别
服务器端负载均衡Nginx
nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。
既请求有nginx服务器端进行转发。
客户端负载均衡Ribbon
Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,让后在本地实现轮训负载均衡策略。
既在客户端实现负载均衡
应用场景的区别:
Nginx适合于服务器端实现负载均衡 比如Tomcat ,Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud中都是采用本地负载均衡。
环境搭建
1、搭建eureka集群略,详情见Eureka高可用注册中心搭建
2、两个服务生产者
(1)memberProvider1
application.yml
#启动服务端口
server:
port: 8001
#服务名称(服务注册到Eureka注册中心)
spring:
application:
name: zxf-lancoo-member
#服务注册到Eureka地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8100/eureka,http://127.0.0.1:8200/eureka
#因为是注册中心,不会自己注册
register-with-eureka: true
#是否需要从eureka上获取注册信息
fetch-registry: true
pom.xml 主要部分
<!-- springCloud管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
memberController1
@RequestMapping("/discover")
public String discover() {
return "this is discover-----1";
}
启动
@SpringBootApplication
@EnableEurekaClient
public class AppMember {
public static void main(String[] args) {
SpringApplication.run(AppMember.class, args);
}
}
(2)memberProvider2
application.yml
###服务启动端口号
server:
port: 8000
###服务名称(服务注册到eureka名称)
spring:
application:
name: zxf-lancoo-member
###服务注册到eureka地址 单机
#eureka:
# client:
# service-url:
# defaultZone: http://localhost:8100/eureka
###集群地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8100/eureka,http://127.0.0.1:8200/eureka
###因为该应用为注册中心,不会注册自己
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true
pom.xml
同memberProvider2的pom.xml一样 略
memberController2
@RequestMapping("/discover")
public String discover() {
return "this is discover-----2";
}
启动
@SpringBootApplication
@EnableEurekaClient
public class ApplicationProvider {
public static void main(String[] args) {
SpringApplication.run(ApplicationProvider.class, args);
}
3、消费者
application.yml
#启动服务端口
server:
port: 8021
#服务名称(服务注册到Eureka注册中心)
spring:
application:
name: zxf-lancoo-order
#服务注册到Eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
#因为是注册中心,不会自己注册
register-with-eureka: true
#是否需要从eureka上获取注册信息
fetch-registry: true
pom.xml 同上面的生产者的一样 这儿略过
controller
@Autowired
private LoadBalancerClient loadBalancerClient;
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
/**
* 使用负载均衡轮训访问
*
*/
@RequestMapping("/call")
public Object call() {
ServiceInstance serviceInstance = loadBalancerClient.choose("zxf-lancoo-member");
RestTemplate restTemplate = getRestTemplate();
String result = restTemplate.getForObject(serviceInstance.getUri()+"/discover" , String.class);
return result;
}
启动
@SpringBootApplication
@EnableEurekaClient
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class, args);
}
}
注册中心,访问127.0.0.1:8100
浏览器访问消费者:http://127.0.0.1:8021/call
多刷新几次发现 this is discover-----1 和this is discover-----1 一直交替出现
致次Eureak中客户端的负载均衡已经实现,
注:这种负载均衡是Eureak默认的轮训发,Eureka中还有其让的负载均衡,这里不一一做演示,感兴趣的可以自己去了解!