Ribbon其实就是平常使用的Nginx差不多的,还有LVS等。负载均衡的也有硬件,比如F5等,但是F5,一个字:贵,动辄就是几十万,一般的中小型公司承受不起,曾经的中国移动就是用的F5
LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
负载均衡有2种:
集中式LB:即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;偏硬件
进程内LB:将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。偏软件,比如Ribbon
Spring Cloud中的负载均衡算法甚至是可以自定义的,意思除了自带的,我们可以自己写负载均衡的算法
接着之前的Eureka集群来:
注意:如果是本机有可能电脑撑不住,CPU会占用很多了。
先看下项目结构:
配置Ribbon:
插播一段很重要的话:Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具
客户端、客户端、客户端,所以我们Ribbon是配置在application80这个消费者微服务客户端的。目前消费者80这个微服务客户端还没有注册到Eureka的
一步一步来:
配置80消费者微服务客户端的负载均衡:
pom.xml改造:
添加依赖:
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--Ribbon需要和eureka整合,依赖不是eureka-server,说明这是Eureka的客户端,即微服务,也是需要注册进Eureka
Server的 -->
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- eureka需要config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
最终的pom.xml:
<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>
<parent>
<groupId>com.ypp.springcloud</groupId>
<artifactId>yppcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>yppcloud-consumer-dept-80</artifactId>
<description>部门微服务消费者</description>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
<dependency>
<groupId>com.ypp.springcloud</groupId>
<artifactId>yppcloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--Ribbon需要和eureka整合,依赖不是eureka-server,说明这是Eureka的客户端,即微服务,也是需要注册进Eureka
Server的 -->
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- eureka需要config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
接着配置application.yml,既然这个80也是Eureka中的一个客户端,那么这个微服务也是需要注册到Eureka Server的
添加配置:
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://eureka2001.com:2001/eureka/,http://eureka2002.com:2002/eureka/,http://eureka2003.com:2003/eureka/
最终80的application.yml:
server:
port: 80
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://eureka2001.com:2001/eureka/,http://eureka2002.com:2002/eureka/,http://eureka2003.com:2003/eureka/
将restTemplate自带负载均衡,添加@LoadBalanced注解:
80远程调用服务端微服务自带负载均衡配置的RestTemplate:
package com.ypp.springcloud.config;
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;
@Configuration
public class ConfigRest {
@Bean(name = "restTemplate")
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
80也是Eureka的服务,在启动类添加@EnableEurekaClient
现在回头来看之前部署的Eureka Server集群:
之前调用的是localhost:xxxxx地址,现在我们要实现真正的微服务,调用微服务的名字:YPPCLOUD-DEPT
启动Eureka集群和服务的提供者8001、服务的消费者/客户端80,然后调用8001服务端微服务,现在是真正的微服务调用
到现在电脑内存越来越高了,注意电脑配置:
本机的话有部分可能会撑到8G左右
下面重点来了,也是验证负载均衡。现在只有一个提供服务的微服务。
那现在我们创建多个能提供服务的微服务,多个8001的这种微服务。每个微服务可以有自己每个独立的数据库,所以再继续创建自己独立的数据库。注意电脑配置
创建多个数据库和创建多个项目略过..配置文件也是一样的。更改端口、数据库和instance-id就行。
启动2001/2002/2003/8001/8002/8003/80
打开Eureka Server页面看节点信息:
一个微服务下面挂了3个实例。测试负载均衡
访问了3次,每个实例都访问了一次,按照默认轮训的算法每个微服务访问一次。用了@LoadBalanced这个东东就带了负载均衡
最终源码地址:https://pan.baidu.com/s/1Vy88GqJhO3KfVX5HgV_m9Q 提取码:z1j6