前文地址:
001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控
文章目录
8.Feign远程调用、loadbalancer负载均衡整合
1.OpenFeign整合
1.引入依赖
注意:由于openfeign高版本使用loadbalancer负载均衡而不是ribbon,所以需要引入loadbalancer依赖排除ribbon,否则会报错
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
2.启动类添加@EnableFeignClients
注解
3.yml配置
yaml
#由于feign高版本使用loadbalancer负载均衡,排除了ribbon,所以超时时间不能使用ribbon配置
feign:
#开启feign对sentinel支持
sentinel:
enabled: true
#feign gzip压缩配置
compression:
request:
enabled: true
# 配置压缩的类型
mime-types: text/xml,application/xml,application/json
# 最小压缩值
min-request-size: 2048
response:
enabled: true
client:
config:
#服务名称
cloud-production:
# 连接超时时间
connectTimeout: 90000
# 请求处理超时时间
readTimeout: 90000
# default 全局配置,可以用服务名配置单个服务
default:
#日志级别,BASIC就是最基本的请求和响应信息
loggerLevel: BASIC
springboot全局压缩配置
yaml
server:
# gzip压缩配置
compression:
min-response-size: 512
mime-types: application/json,application/xml,text/html,text/xml,text/plain
excluded-user-agents: gozilla,traviata
enabled: true
4.日志配置
方式一
yaml
#日志收集
logging:
#feign日志配置
level:
com.moshangshang.cloud.clean.feign.ProductionFeign: debug #扫描的是你那个service的类全类名,也可扫包
方式二
yaml
feign:
client:
config:
default:
#日志级别,BASIC就是最基本的请求和响应信息
loggerLevel: BASIC
方式三
java
@Configuration
public class FeignConfig {
/**
* feign日志配置
*/
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // 日志级别为BASIC
}
}
单个远程调用使用
java
@FeignClient(value = "cloud-production",configuration = FeignConfig.class)
全局使用
java
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
5.远程调用测试
1.fegin调用接口
java
@FeignClient(value = "cloud-production",configuration = FeignConfig.class)
public interface ProductionFeign {
@GetMapping("/cloud-production/test1")
String test1();
}
2.调用方法
java
@RestController
@RequestMapping("/cloud-clean")
public class CleanController {
@Autowired
private ProductionFeign productionFeign;
@GetMapping("/test1")
public void test1(){
String s = productionFeign.test1();
System.out.println("远程调用接收到的数据"+s);
}
}
3.被调用服务方法
java
@RestController
@RequestMapping("/cloud-production")
public class ProductionController {
@GetMapping("/test1")
public String test1(){
System.out.println("test1 被调用了");
return "111";
}
}
4.测试结果


6.服务降级
1.编写降级工厂类
java
/**
* 服务降级
*/
@Slf4j
@Component
public class ProductionFallbackFactory implements FallbackFactory<ProductionFeign> {
@Override
public ProductionFeign create(Throwable cause) {
log.error("服务异常。。。。。。。。。。。。。。。。。。。" + cause);
return new ProductionFeign() {
@Override
public String test1() {
return "Fallback回滚";
}
};
}
}
2.使用
java
@FeignClient(value = "cloud-production",fallbackFactory = ProductionFallbackFactory.class)
7.重试配置,服务端异常捕获
java
@Slf4j
@Configuration
public class FeignConfiguration {
/**
* 自定义重试机制
*/
@Bean
public Retryer feignRetryer() {
//最大请求次数为5,初始间隔时间为100ms,下次间隔时间1.5倍递增,重试间最大间隔时间为1s,
return new Retryer.Default();
}
/**
* 客户端捕获服务端异常
*/
@Bean
public ErrorDecoder feignError() {
return (key, response) -> {
if (response.status() == 400) {
log.error("请求xxx服务400参数错误,返回:{}", response.body());
}
if (response.status() == 409) {
log.error("请求xxx服务409异常,返回:{}", response.body());
}
if (response.status() == 404) {
log.error("请求xxx服务404异常,返回:{}", response.body());
}
// 其他异常交给Default去解码处理
// 这里使用单例即可,Default不用每次都去new
return new ErrorDecoder.Default().decode(key, response);
};
}
}
java
@FeignClient(value = "cloud-production",fallbackFactory = ProductionFallbackFactory.class,configuration = MyConfiguration.class)

8.连接池配置
xml
<!--使用连接池-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
yaml
feign:
httpclient:
# 支持httpClient的开关
enabled: true
#最大连接数
max-connections: 200
# 单个路径的最大连接数
max-connections-per-route: 50
2.Loadbalancer负载均衡测试
1.复制客户端

2.修改端口启动

3.测试


默认 轮询方式
调用
4.修改负载均衡算法
1.创建核心配置类
java
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
// 获取负载均衡器的名称
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
// 创建并返回一个随机负载均衡器实例
return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}
2.使用
java
@LoadBalancerClient(value = "cloud-production", configuration = RestTemplateConfig.class)
自带三个算法,轮询,随机和nacos
