文章目录
SpringCloud
1 服务容错保护SpringCloudHystrix
一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是 Hystrix 需要做的事情。
Hystrix 提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
加入熔断器
ribbon中加入依赖:spring-cloud-starter-netflix-hystrix
启动类中加入注解:@EnableCircuitBreaker和@SpringCloudApplication选一个就可。这样就开启了断路器功能。
新增service层,RibbonService.java
@Service
public class RibbonService {
@Autowired
private RestTemplate restTemplate;
/**
* 获取用户数据
*/
@HystrixCommand(fallbackMethod = "fallBack")
public JsonResult getUser(User user){
String url = "http://MY-SERVICE/service/user";
return restTemplate.postForObject(url,user,JsonResult.class);
}
/**
* 回调的方法
*/
private JsonResult fallBack(User user) {
return Response.error(1001,"你的网络有问题!");
}
}
改变RibbonController.java
@Autowired
private RibbonService ribbonService;
@PostMapping("/ribbon/user")
public JsonResult helloUser(@RequestBody User user) {
return ribbonService.getUser(user);
}
2 申明式服务调用SpringCloudFeign
Feign 包含了 Ribbon(负载均衡) 和 Hystrix(熔断器)两种功能。
2.1 Feign 使用
创建一个新的模块:feign-consumer
修改feign的pom文件,父工程的pom添加子模块。启动类添加注解:@EnableDiscoveryClient,@EnableFeignClients
配置文件:
spring:
application:
name: consumer-feign
server:
port: 7501
eureka:
client:
service-url:
defaultZone: http://eureka1:1111/eureka/,http://eureka2:1112/eureka/
新增service接口
新增controller层:
其他复杂参数类型方法也可以直接从service模块中复制过来。(注意在当前pom中添加pojo的依赖)
这样就不用RestTemplate,方便一点,还自带负载均衡,个人喜欢feign,比ribbon方便,就是多写个interface,里面没有任何业务逻辑。
2.2 复杂参数传递
2.3 Ribbon配置
配置再feign的配置文件中:
my-service:
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则响应时间权重
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
ConnectTimeout: 500 #请求连接超时时间
ReadTimeout: 1000 #请求处理的超时时间
OkToRetryOnAllOperations: true #对所有请求都进行重试
MaxAutoRetriesNextServer: 2 #切换实例的重试次数
MaxAutoRetries: 1 #对当前实例的重试次数
请求压缩
feign:
compression:
request:
#开启请求压缩
enabled: true
#请求压缩类型
mime-types: text/xml,application/xml,application/json
#请求压缩下限,超过这个值才会被压缩
min-request-size: 2048
response:
#开启响应压缩
enabled: true
2.4 Hystrix配置
feign模块中添加依赖:
<!--熔断器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
启动类上加注解:@EnableHystrix
配置文件中开启hystrix支持,默认是false
实现FallBackFactory接口
在@FeignClient中设置fallback
3 API网关服务SpringCloudZuul
zuul 主要作用就是路由转发和过滤,主要用于对外开放的接口统一管理,权限认证过滤等。
3.1 使用zuul
路由转发
创建新的模块
像往常那样修改pom文件,在启动类上添加注解@EnableDiscoveryClient,@EnableZuulProxy
配置文件
spring:
application:
name: api-zuul # 网关服务名
server:
port: 9888 # 端口号
eureka:
client:
service-url:
defaultZone: http://eureka1:1111/eureka/,http://eureka2:1112/eureka/
# 配置网关路由转发规则
zuul:
routes:
ribbon:
path: /ribbon/** # 转发的规则
serviceId: CONSUMER-RIBBON # 对应转发服务的名字
feign:
path: /feign/**
serviceId: CONSUMER-FEIGN
注意:path和serviceId组成一组映射
3.2 请求过滤
要想再 zuul 中实现请求过滤就必须添加过滤器。Filter 的生命周期有四个:pre, routing, post, error
要创建一个 filter 去继承 ZuulFilter 抽象类并实现里面的filterType(), filterOrder(), shouldFilter(), run()方法