Spring Cloud Hystrix 的请求缓存

通过方法重载开启缓存

如果我们使用了自定义Hystrix请求命令的方式来使用Hystrix,那么我们只需要重写getCacheKey方法即可实现请求缓存,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class BookCommand extends HystrixCommand<Book> {

private RestTemplate restTemplate;
private Long id;

@Override
protected Book getFallback() {
Throwable executionException = getExecutionException();
System.out.println(executionException.getMessage());
return new Book("宋诗选注", 88, "钱钟书", "三联书店");
}

@Override
protected Book run() throws Exception {
return restTemplate.getForObject("http://HELLO-SERVICE/getbook5/{1}", Book.class,id);
}

public BookCommand(Setter setter, RestTemplate restTemplate,Long id) {
super(setter);
this.restTemplate = restTemplate;
this.id = id;
}

@Override
protected String getCacheKey() {
return String.valueOf(id);
}
}
阅读更多

Spring Cloud Hystrix 的服务降级与异常处理

服务降级

前面两篇文章中,fallbackMethod所描述的函数实际上就是一个备胎,用来实现服务的降级处理,在注解中我们可以通过fallbackMethod属性来指定降级处理的方法名称,在自定义Hystrix请求命令时我们可以通过重写getFallback函数来处理服务降级之后的逻辑。使用注解来定义服务降级逻辑时,服务降级函数和@HystrixCommand注解要处于同一个类中,同时,服务降级函数在执行过程中也有可能发生异常,所以也可以给服务降级函数添加‘备胎’,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
@HystrixCommand(fallbackMethod = "error1")
public Book test2() {
return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
}

@HystrixCommand(fallbackMethod = "error2")
public Book error1() {
//发起某个网络请求(可能失败)
return null;
}
public Book error2() {
return new Book();
}
阅读更多

Spring Cloud 自定义 Hystrix 请求命令

自定义HystrixCommand

我们除了使用@HystrixCommand注解,也可以自定义类继承自HystrixCommand,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BookCommand extends HystrixCommand<Book> {

private RestTemplate restTemplate;

@Override
protected Book getFallback() {
return new Book("宋诗选注", 88, "钱钟书", "三联书店");
}

public BookCommand(Setter setter, RestTemplate restTemplate) {
super(setter);
this.restTemplate = restTemplate;
}

@Override
protected Book run() throws Exception {
return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
}
}
阅读更多

Spring Cloud 负载均衡策略

IRule

这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例。

AbstractLoadBalancerRule

AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,就是负载均衡器。这里定义它的目的主要是辅助负责均衡策略选取合适的服务端实例。

阅读更多

Spring Cloud 断路器 Hystrix

服务消费者中加入断路器

首先我们需要在服务消费者中引入hystrix,如下:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
阅读更多

Spring Cloud 负载均衡器

负载均衡器

首先我们来看一张上篇文章中的旧图:

图片

这是ILoadBalancer接口的一张类关系图,我们就从这张图里看起吧。

AbstractLoadBalancer

AbstractLoadBalancer类的定义如下:

阅读更多

Spring Cloud RestTemplate 负载均衡

开启负载均衡很简单,只需要在RestTemplate的bean上再添加一个@LoadBalanced注解即可,所以本文我们就从这个注解开始我们的分析吧。

首先我们来看看@LoadBalanced注解的源码:

1
2
3
4
5
6
7
8
9
10
11
/**
* Annotation to mark a RestTemplate bean to be configured to use a LoadBalancerClient
* @author Spencer Gibb
*/
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
阅读更多

Spring Cloud 客户端负载均衡

服务端负载均衡

负载均衡是我们处理高并发、缓解网络压力和进行服务端扩容的重要手段之一,但是一般情况下我们所说的负载均衡通常都是指服务端负载均衡,服务端负载均衡又分为两种,一种是硬件负载均衡,还有一种是软件负载均衡。

硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,常见的如F5。

软件负载均衡则主要是在服务器上安装一些具有负载均衡功能的软件来完成请求分发进而实现负载均衡,常见的就是Nginx。

无论是硬件负载均衡还是软件负载均衡,它的工作原理都不外乎下面这张图:

图片

阅读更多

Spring Cloud RestTemplate 中几种常见的请求方式

环境搭建

首先我们要搭建一个测试环境,方便我们一会验证相应的API。
创建好的maven项目如下图所示:

图片

其中commons是一个公共模块,是一个普通的JavaSE工程,我们一会主要将实体类写在这个模块中,provider和consumer是两个spring boot项目,provider将扮演服务提供者的角色,consumer扮演服务消费者的角色。

阅读更多