SpringCloud(2)

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()方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了79 篇原创文章 · 获赞 7 · 访问量 1817

猜你喜欢

转载自blog.csdn.net/weixin_45044097/article/details/103887618
今日推荐