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

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