Spring Cloud Zuul 中异常处理细节

首先我们来看一张官方给出的Zuul请求的生命周期图,如下:

图片

关于这张图我说如下几点:

1.正常情况下所有的请求都是按照pre、route、post的顺序来执行,然后由post返回response
2.在pre阶段,如果有自定义的过滤器则执行自定义的过滤器
3.pre、routing、post的任意一个阶段如果抛异常了,则执行error过滤器,然后再执行post给出响应

这是这张图给我们的信息,我们再来看看源码com.netflix.zuul.http.ZuulServlet类中的service方法,这是整个调用过程的核心,如下:

阅读更多

Spring Cloud Feign 配置详解

Ribbon配置

ribbon的配置其实非常简单,直接在application.properties中配置即可,如下:

1
2
3
4
5
6
7
8
9
10
# 设置连接超时时间
ribbon.ConnectTimeout=600
# 设置读取超时时间
ribbon.ReadTimeout=6000
# 对所有操作请求都进行重试
ribbon.OkToRetryOnAllOperations=true
# 切换实例的重试次数
ribbon.MaxAutoRetriesNextServer=2
# 对当前实例的重试次数
ribbon.MaxAutoRetries=1
阅读更多

Spring Cloud API 网关服务Zuul

构建网关

网关的构建我们通过下面三个步骤来实现。

1.创建Spring Boot工程并添加依赖

首先我们创建一个普通的Spring Boot工程名为api-gateway,然后添加相关依赖,这里我们主要添加两个依赖spring-cloud-starter-zuul和spring-cloud-starter-eureka,spring-cloud-starter-zuul依赖中则包含了ribbon、hystrix、actuator等,如下:

阅读更多

Spring Cloud 中声明式服务调用 Feign

Spring Cloud Feign入门

环境搭建

OK,首先我们通过下面六步来创建一个Spring Cloud Feign工程,先来体验下Spring Cloud Feign带给我们的便利。

第一步:创建普通Spring Boot工程

首先我们来创建一个普通的Spring Boot工程,取名为feign-consumer。

阅读更多

Spring Cloud Feign 的继承特性

创建公共接口

首先我们来创建一个普通的maven工程,叫做hello-service-api,由于我们要在这一个项目中使用SpringMVC的注解,因此创建成功之后,需要添加spring-boot-starter-web依赖,如下:

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.sang</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
阅读更多

Spring Cloud Hystrix 的请求合并

服务提供者接口

我需在在服务提供者中提供两个接口供服务消费者调用,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RequestMapping("/getbook6")
public List<Book> book6(String ids) {
System.out.println("ids>>>>>>>>>>>>>>>>>>>>>" + ids);
ArrayList<Book> books = new ArrayList<>();
books.add(new Book("《李自成》", 55, "姚雪垠", "人民文学出版社"));
books.add(new Book("中国文学简史", 33, "林庚", "清华大学出版社"));
books.add(new Book("文学改良刍议", 33, "胡适", "无"));
books.add(new Book("ids", 22, "helloworld", "haha"));
return books;
}

@RequestMapping("/getbook6/{id}")
public Book book61(@PathVariable Integer id) {
Book book = new Book("《李自成》2", 55, "姚雪垠2", "人民文学出版社2");
return book;
}
阅读更多

Spring Cloud Hystrix 仪表盘与 Turbine 集群监控

监控单体应用

监控环境搭建

不管是监控单体应用还是Turbine集群监控,我们都需要一个Hystrix Dashboard,当然我们可以在要监控的单体应用上继续添加功能,让它也具备仪表盘的功能,但是这样并不符合我们微服务的思想,所以,Hystrix仪表盘我还是单独创建一个新的工程专门用来做Hystrix Dashboard。OK,在Spring Cloud中创建一个Hystrix Dashboard非常简单,如下:

阅读更多

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);
}
}
阅读更多