SpringCloud.xmind
Eureka
Eureka服务
@EnableEurekaServer 声明当前应用是Eureka服务
服务注册与发现
服务注册
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置启动引导类
修改配置文件
spring:
application:
# 服务名称
name: consumer-demo
eureka:
client:
service-url:
# eureka服务地址,集群可配置多个
defaultZone: http://127.0.0.1:10086/eureka
服务消费
1.2.3步骤同注册服务
改造controller
Hystrix
功能了解
作用 : 假如请求R 会用到A,B,C,D 四个服务,当D服务失败,请求就会阻塞,用户请求就不会得到响应,tomcat的这个线程不会释放,于是越来越多的线程就会阻塞;然而服务器的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,
从而导致其他的服务都不可用,形成雪崩效应
Hystrix解决雪崩问题的手段主要是服务降级,包括:
- 线程隔离 : 用户请求不直接访问访问,而是使用线程池中空闲线程访问,加速失败判断时间
- 服务熔断 : 及时返回服务调用失败的结果,让线程不因为等待服务而阻塞
Hystrix是一个延迟和容错库,用于隔离访问远程服务,防止出现级联失败
触发Hystrix服务降级的情况
- 线程池已满
- 请求超时
具体实现
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
引导类加注解
- 编写降级逻辑
- 方式一
添加注解@HystrixCommand 该方法如果响应失败,则需要进行降级处理,调用queryByIdFallback方法进行降级处理
把当前方法的返回值写成跟降级逻辑方法一样的返回值String
编写降级逻辑方法
@GetMapping("/{id}")
//HystrixCommand 该方法如果响应失败,则需要进行降级处理,调用queryByIdFallback方法进行降级处理
@HystrixCommand(fallbackMethod = "queryByIdFallback")
//@HystrixCommand
public String queryById(@PathVariable Long id){
String url = "http://user-service/user/" + id;
return restTemplate.getForObject(url, String.class);
}
#降级逻辑方法,返回值为String
public String queryByIdFallback(Long id){
log.error("查询用户信息失败。id:{}", id);
return "对不起,网络太拥挤了!";
}
- 方式二(全局降级的方式)
controller类加注解@DefaultProperties(defaultFallback = “defaultFallback”)
创建defaultFallback方法
@GetMapping("/{id}")
@HystrixCommand
public String queryById(@PathVariable Long id) {
String url = "http://user-service/user/" + id;
return restTemplate.getForObject(url, String.class);
}
public String defaultFallback(){
return "默认提示:对不起,网络太拥挤了!";
}
超时时间
默认请求超时为1秒
修改超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
#请求超时时间,默认为1秒
timeoutInMilliseconds: 2000
Hystrix原理(待补充)
Feign
功能了解
可以理解为Fegin就是一个controller,只不过里面的方法没有实现,而提供了url,在调用时会真正的去调用目标controller中能够匹配该url的方法【动态代理】
隐藏Rest请求,伪装成controller去实现自动拼接服务地址
可以理解为使用Fegin来代替RestTemplate实现http调用服务接口【在这里相当于通过Feign调用user-service的controller】
具体实现
- 引入依赖
创建Feign接口
@FeignClient(value = "user-service")
public interface UserClient {
//http://user-service/user/123
@GetMapping("/user/{id}")
User queryById(@PathVariable Long id);
}
创建ConsumerFeignController 注入UserClient,通过UserClient的代理对象实现http调用 ```java @RestController @RequestMapping(“/cf”) public class ConsumerFeignController { @Autowired private UserClient userClient; @GetMapping(“/{id}”) public User queryById(@PathVariable Long id){
return userClient.queryById(id);
}
}
4. 引导类标记 @EnableFeignClients 开启Feign
<a name="UBRP9"></a>
### 集成ribbon
本身已经集成,直接使用即可<br />配置参数
```yaml
ribbon:
# 连接超时时长
ConnectTimeout: 1000
# 数据通信超时时长
ReadTimeout: 2000
# 当前服务器的重试次数
MaxAutoRetries: 0
# 重试多少次服务
MaxAutoRetriesNextServer: 0
# 是否对所有的请求方式都重试
OkToRetryOnAllOperations: false
集成Hystrix
具体实现
开启Hystrix
feign:
hystrix:
# 开启Feign的熔断功能
enabled: true
编写熔断的处理类 当Feign调用http失败时,会进行降级逻辑