一 丶 负载均衡
2、Spring Cloud Ribbon
···Spring Cloud Ribbon是基于Http和TCP的客户端负载均衡工具,基于Netflix Ribbon 实现。可以轻松将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。
两种负载均衡方式:
Ø 服务端负载均衡
Ø 客户端负载均衡
2.1Ribbon实现
ribbon 实现负载均衡可以不用注册在Eureka上 使用自己的负载策略
1、客户端依赖:spring-cloud-starter-ribbon
2、new RestTemplate();
3、@LoadBalanced
3. Ribbon 使用(直接让springboot项目是ribbon)
3.1 pom.xml 文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.20.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
3.2 启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class SpringCloudRibbonDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudRibbonDemoApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.3 测试类
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class OrderController {
private static final List<OrderInfo> list = new ArrayList<OrderInfo>();
@Autowired
private RestTemplate restTemplate;
/***
* 下单接口 -- 调用服务提供者provider /updateProduct 接口
* @param productName
* @param num
* @return
*/
@GetMapping("/order/{productName}/{num}")
public String order(@PathVariable("productName") String productName, @PathVariable("num") Integer num){
if(productName != null && !productName.isEmpty()){
list.add(new OrderInfo(productName, num));
// 调用服务提供者
String result = restTemplate.getForObject("http://eureka-provider/updateProduct/" + productName + "/" + num, String.class);
return result;
}
return null;
}
}
3.4 application.properties 配置文件
## Eureka服务消费者实例名
spring.application.name=ribbon-consumer
## Eureka服务消费者端口
server.port=9999
## 关闭Actuator验证开关
management.security.enabled=false
## 局部配置-- 单独制定客户端(eureka-provider客户端)
## eureka-provider 和调用时对应
# listOfServers 默认配置项
#127.0.0.1:8070,127.0.0.1:8073 ribbon 负载均衡的ip:port 只是服务的提供者 注册不注册到 Eureka 没有关系
eureka-provider.ribbon.listOfServers=127.0.0.1:8070,127.0.0.1:8073
#下方是全局配置
#ribbon.listOfServers=127.0.0.1:8070,127.0.0.1:8073
4. Ribbon重试机制
ribbon解析调用地址并负载到ip:port
#指定客户端eureka实例的超时时间
全局配置:
ribbon.connectionTimeout=2000
指定客户端配置:
eurekaServer.ribbon.connectionTimeout=2000
配置格式:<clientName>.<nameSpace>.<propertyName>=<Value>
如果没有配置项<clentName>表示全局配置
详细配置参考:类 com.netflix.client.config.CommonClientConfigKey
重试机制:
## 断路器超时时间 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000 ## 请求连接超时时间 eurekaClient.ribbon.ConnectTimeout=200 ## 请求处理超时时间 eurekaClient.ribbon.ReadTimeout=200 ## 对所有操作请求都进行重试 eurekaClient.ribbon.OkToRetryOnAllOperations=true ## 切换实例的重试次数 eurekaClient.ribbon.MaxAutoRetriesNextServer=2 ## 对当前实例的重试次数 eurekaClient.ribbon.MaxAutoRetries=1