一、Ribbon单独使用,配置自动重试,实现负载均衡和高可用
1.spring-cloud-starter-netflix-ribbon 包引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--单独使用Ribbon单独使用,不配合注册中心使用-->
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>-->
<!--单独使用Ribbon单独使用,不配合注册中心使用-->
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>-->
spring-cloud-starter-netflix-eureka-client 中使用包含的有spring-cloud-starter-netflix-ribbon的依赖,所以在单独使用spring-cloud-starter-netflix-ribbon 时候的使用需要排除掉spring-cloud-starter-netflix-eureka-client包。
2. 配置调用的被调用的服务amaster-work-server服务的,服务列表、超时时间、重试机制
spring:
application:
name: amaster-report-server
cloud:
load-balancer:
# ribbon:
# eager-load:
# enabled: true # 开启饥饿加载,这里为配合注册中心使用,因此关闭掉懒加载
# clients: # 指定饥饿加载的服务名称
# - amaster-work-server # 用户服务
# - amaster-config-env # 仓库服务
#开启重试机制
retry:
enabled: true
amaster-work-server:
ribbon:
#请求连接的超时时间
ConnectTimeout: 250
#请求处理的超时时间
ReadTimeout: 1000
#对所有操作请求都进行重试,默认false,只有GET请求会重试;这是防止POST等对数据有影响的请求在重试后因为接口未做幂等性导致数据异常,影响较大
OkToRetryOnAllOperations: true
#切换实例的重试次数
MaxAutoRetriesNextServer: 2
#对当前实例的重试次数
MaxAutoRetries: 1
listOfServers: localhost:9005,localhost:9015
server:
port: 9007
servlet:
context-path: /amaster-report-server
amaster-work-server 是服务名,ribbon属性下的其余属性是ribbon的属性配置
3.配置RestTemplate的负载均衡策略
package com.zhang.buiness.amaster.reportserver.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
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 RestTempletConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule randomRule() {
//随机选取一个可用服务器
return new RandomRule();
}
}
4.配置调用
@RequestMapping("/env")
public class ReoportWebController {
@Autowired
private ReportServiceImpl reportService;
@RequestMapping("/get/report/ribbion/alone/use/v1")
private List<String> getEnvConfig(){
return reportService.ribbionAloneUse("amaster-work-server","/amaster-work-server/env/get/env/all/v1");
}
}
@Service
public class ReportServiceImpl {
@Autowired
private RestTemplate restTemplate;
public List<String> ribbionAloneUse(String clientMark, String path) {
String url = String.format("http://%s%s",clientMark,path);
ResponseEntity<List> entity = restTemplate.getForEntity(url, List.class);
return entity.getBody();
}
}
在调用的amaster-work-server 是配置文件中服务的列表名,/amaster-work-server/env/get/env/all/v1 是接口的path 路径了
5.测试
1.启动两个服务 amaster-work-server 9015 和 amaster-work-server 9005
启动 amaster-work-server 9015
启动 amaster-work-server 9005
java -jar -Dspring.config.location=./application-test.yml,./bootstrap.yml ./amaster-work-server.jar
java 的启动命令
调用接口 http://127.0.0.1:9007/amaster-report-server/env/get/report/ribbion/alone/use/v1
多次调用 调用结果显示调用成功
调用到work 服务,随机调用的amaster-work-server的 9005 和9015 服务