SpringCloud.xmind

Eureka

Eureka服务

@EnableEurekaServer 声明当前应用是Eureka服务
image.png

服务注册与发现

服务注册

  1. 添加依赖

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    4. </dependency>
  2. 配置启动引导类

image.png

  1. 修改配置文件

    1. spring:
    2. application:
    3. # 服务名称
    4. name: consumer-demo
    5. eureka:
    6. client:
    7. service-url:
    8. # eureka服务地址,集群可配置多个
    9. defaultZone: http://127.0.0.1:10086/eureka

    服务消费

    1.2.3步骤同注册服务

  2. 改造controller

image.png

Hystrix

功能了解

作用 : 假如请求R 会用到A,B,C,D 四个服务,当D服务失败,请求就会阻塞,用户请求就不会得到响应,tomcat的这个线程不会释放,于是越来越多的线程就会阻塞;然而服务器的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,
从而导致其他的服务都不可用,形成雪崩效应
Hystrix解决雪崩问题的手段主要是服务降级,包括:

  • 线程隔离 : 用户请求不直接访问访问,而是使用线程池中空闲线程访问,加速失败判断时间
  • 服务熔断 : 及时返回服务调用失败的结果,让线程不因为等待服务而阻塞

Hystrix是一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败

触发Hystrix服务降级的情况

  • 线程池已满
  • 请求超时

具体实现

  1. 引入依赖

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    4. </dependency>
  2. 引导类加注解

image.png

  1. 编写降级逻辑
  • 方式一

添加注解@HystrixCommand 该方法如果响应失败,则需要进行降级处理,调用queryByIdFallback方法进行降级处理
把当前方法的返回值写成跟降级逻辑方法一样的返回值String
编写降级逻辑方法

  1. @GetMapping("/{id}")
  2. //HystrixCommand 该方法如果响应失败,则需要进行降级处理,调用queryByIdFallback方法进行降级处理
  3. @HystrixCommand(fallbackMethod = "queryByIdFallback")
  4. //@HystrixCommand
  5. public String queryById(@PathVariable Long id){
  6. String url = "http://user-service/user/" + id;
  7. return restTemplate.getForObject(url, String.class);
  8. }
  9. #降级逻辑方法,返回值为String
  10. public String queryByIdFallback(Long id){
  11. log.error("查询用户信息失败。id:{}", id);
  12. return "对不起,网络太拥挤了!";
  13. }
  • 方式二(全局降级的方式)

controller类加注解@DefaultProperties(defaultFallback = “defaultFallback”)
创建defaultFallback方法

  1. @GetMapping("/{id}")
  2. @HystrixCommand
  3. public String queryById(@PathVariable Long id) {
  4. String url = "http://user-service/user/" + id;
  5. return restTemplate.getForObject(url, String.class);
  6. }
  7. public String defaultFallback(){
  8. return "默认提示:对不起,网络太拥挤了!";
  9. }

超时时间

默认请求超时为1秒
修改超时时间

  1. hystrix:
  2. command:
  3. default:
  4. execution:
  5. isolation:
  6. thread:
  7. #请求超时时间,默认为1秒
  8. timeoutInMilliseconds: 2000

Hystrix原理(待补充)

Feign

功能了解

可以理解为Fegin就是一个controller,只不过里面的方法没有实现,而提供了url,在调用时会真正的去调用目标controller中能够匹配该url的方法【动态代理】

隐藏Rest请求,伪装成controller去实现自动拼接服务地址

可以理解为使用Fegin来代替RestTemplate实现http调用服务接口【在这里相当于通过Feign调用user-service的controller】

具体实现

  1. 引入依赖
  2. 创建Feign接口

    1. @FeignClient(value = "user-service")
    2. public interface UserClient {
    3. //http://user-service/user/123
    4. @GetMapping("/user/{id}")
    5. User queryById(@PathVariable Long id);
    6. }
  3. 创建ConsumerFeignController 注入UserClient,通过UserClient的代理对象实现http调用 ```java @RestController @RequestMapping(“/cf”) public class ConsumerFeignController { @Autowired private UserClient userClient; @GetMapping(“/{id}”) public User queryById(@PathVariable Long id){

    1. return userClient.queryById(id);

    }

}

  1. 4. 引导类标记 @EnableFeignClients 开启Feign
  2. <a name="UBRP9"></a>
  3. ### 集成ribbon
  4. 本身已经集成,直接使用即可<br />配置参数
  5. ```yaml
  6. ribbon:
  7. # 连接超时时长
  8. ConnectTimeout: 1000
  9. # 数据通信超时时长
  10. ReadTimeout: 2000
  11. # 当前服务器的重试次数
  12. MaxAutoRetries: 0
  13. # 重试多少次服务
  14. MaxAutoRetriesNextServer: 0
  15. # 是否对所有的请求方式都重试
  16. OkToRetryOnAllOperations: false

集成Hystrix

本身已经集成,默认情况是关闭的

具体实现

  1. 开启Hystrix

    1. feign:
    2. hystrix:
    3. # 开启Feign的熔断功能
    4. enabled: true
  2. 编写熔断的处理类 当Feign调用http失败时,会进行降级逻辑

image.png
image.png