一)Ribbon简介
Ribbon是一个客户端负载平衡器,支持对HTTP和TCP客户端的行为进行大量控制。
Ribbon是通过RestTemplate方式实现的。
缺点:微服务之间的交互,会需要把Rest地址写死,维护会稍微麻烦一点。
Ribbon负载均衡模式:
1、RoundRobinRule:默认规则,通过简单的轮询服务列表来选择服务器
2、AvailabilityFilteringRule:可用性筛选规则
3、WeightedResponseTimeRule:为每个服务器赋予一个权重值,服务器的响应时间越长,该权重值就越少,这个规则会随机选择服务器,权重值有可能会决定服务器的选择
4、ZoneAvoidanceRule:该规则以区域、可用服务器为基础进行服务器选择,使用区域(Zone)对服务器进行分类
5、BestAvailableRule:忽略"短路"的服务器,并选择并发数较低的服务器
6、RandomRule:随机选择可用服务器
7、RetryRule:含有重试的选择逻辑,如果使用 RoundRobinRule 选择的服务器无法连接,那么将会重新选择服务器
二)Ribbon案例
第一步:创建一个Eureka注册中心
pom.xml内容:
<!-- 引入springcloud server jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.yml配置:
注:spring.application.name应用名称不能包含下划线。
# 注册中心的默认端口号, 可以随意指定一个未使用的端口
server:
port: 8761
# 应用名称, 如不指定, 会随意默认一个名称
spring:
application:
name: oysept-eureka
# Erueka注册中心配置
eureka:
instance:
# IP地址
hostname: localhost
client:
# 表示是否将自己注册到Eureka Server中,默认为true, 由于当前应用就是 Eureka Server, 故而设置为false
registerWithEureka: false
# 表示是否从 Eureka Server中获取注册信息, 默认为true, 因为这是一个单点的 Eureka Server, 不需要同步其它的 Eureka Server 节点的数据, 故而设置为 false
fetchRegistry: false
serviceUrl:
# 设置与Eureka Server交互的地址, 查询服务和注册服务都需要依赖这个地址. 默认http://localhost:8761/eureka; 多个地址可以使用","分隔
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
Eureka注册中心main方法启动类:
package com.oysept;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Eureka服务注册中心
* 地址: http://localhost:8761/eureka/
* @author ouyangjun
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
启动EurekaApplication中的main方法,然后可在浏览器中输入:http://localhost:8761查看。
注:启动Eureka注册中心之后,不需要把服务停止,后序会使用到注册中心
第二步:创建一个服务提供者
pom.xml内容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入springcloud client jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- hystrix断路器 jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
application.yml配置:
server:
port: 8762
spring:
application:
name: oysept-server
eureka:
instance:
hostname: localhost
client:
serviceUrl:
# 表示需要把服务注册到Eureka注册中心上, 这里是Eureka注册中心的地址
defaultZone: http://localhost:8761/eureka/
服务提供者main方法启动类:
package com.oysept;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
/**
* 服务提供者
* @author ouyangjun
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
可先用8762的端口,启动EurekaApplication中的main方法,应用不要停止。然后在application.yml中修改一下端口为8763,再次启动EurekaApplication中的main方法。这样就相当于有两个服务端了。
在浏览器中输入:http://localhost:8761查看
第三步:Ribbon负载均衡案例实现
在pom.xml中引入jar:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入springcloud client jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- springcloud ribbon jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</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>
<groupId>com.oysept</groupId>
<artifactId>oysept_ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- properties声明一些公共配置,该节点配置了自定义属性即可在任意地方使用,通过${}访问,形式如${java.version} -->
<properties>
<java.version>1.8</java.version>
</properties>
<!-- springboot版本信息 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<!-- dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器 -->
<!--
说明1:如果dependencies里的dependency自己没有声明version元素,那么maven就会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,
如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version
说明2:如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入springcloud client jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- springcloud ribbon jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
<!-- maven打包插件,在cmd命令窗口执行,如: mvn install -U -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml配置:
server:
port: 8764
spring:
application:
name: oysept-ribbon
eureka:
instance:
hostname: localhost
client:
serviceUrl:
# 表示需要把服务注册到Eureka注册中心上, 这里是Eureka注册中心的地址
defaultZone: http://localhost:8761/eureka/
先创建一个RibbonConfig自定义配置类:
package com.oysept.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;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.PingUrl;
@Configuration
public class RibbonConfig {
// 检验url是否畅通
@Bean
public IPing ribbonPing() {
return new PingUrl();
}
// 负载均衡模式, 默认是轮询负载
@Bean
public IRule ribbonRule() {
return new BestAvailableRule();
}
// Rest服务访问方式, 支持http和tcp通信协议
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
创建一个Controller类,测试Ribbon负载均衡:
package com.oysept.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/ribbon")
public class RibbonController {
@Autowired
private RestTemplate restTemplate;
// 访问地址: http://localhost:8764/ribbon/testRibbon
@RequestMapping(value = "/testRibbon")
public String testRibbon() {
String msg = restTemplate.getForObject("http://OYSEPT-SERVER/demo/sendMsg?msg=testRibbon", String.class);
System.out.println("==> testRibbon return msg: " + msg);
return msg;
}
}
Ribbon负载均衡main方法启动类:
package com.oysept;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import com.oysept.config.RibbonConfig;
/**
* @RibbonClient: 负载均衡注解, 表示使用RibbonConfig自定义的配置
* @author ouyangjun
*/
@SpringBootApplication
@EnableDiscoveryClient
@RibbonClient(name="custom", configuration=RibbonConfig.class)
public class RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
}
启动EurekaApplication中的main方法
在浏览器中输入:http://localhost:8764/ribbon/testRibbon查看
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!