0%

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。

Config

SpringCloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。分为服务端客户端两部分。

  • 服务端:也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息、加密/解密信息等访问接口。
  • 客户端:通过指定的配置中心来管理应用资源以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用 git 来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过 git 客户端工具来方便地管理和获取配置内容。

服务端搭建

阅读全文 »

GateWay

基于 WebFlux 框架实现,而 WebFlux 框架底层则使用了高性能的 Reactor 模式通信框架 Netty(非阻塞异步)。提供统一的路由方式且基于 Filter 链的方式提供了网关基本的功能。

三大核心

  • Route(路由):路由是构建网关的基本模块,它由 ID、目标 URI、一系列的断言和过滤器组成。
  • Predicate(断言):开发人员可以匹配 HTTP 请求中的所有内容,如果请求与断言相匹配则进行路由。
  • Filter(过滤):可以在请求被路由之前或者之后对请求进行修改。
阅读全文 »

Hystrix(续二)

服务熔断

添加 Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@GetMapping("/payment/circuit/{id}")
@HystrixCommand(fallbackMethod = "paymentCircuitBreakerHandler", commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //是否启动断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求阈值
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //睡眠窗口
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //错误阀值
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
if (id < 0) {
throw new RuntimeException("id 不能为负数");
}
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName() + "\t" + "调用成功,流水号:" + serialNumber;
}

public String paymentCircuitBreakerHandler(Integer id) {
return "id 不能为负数,请重试。当前 id:" + id;
}

测试

阅读全文 »

Hystrix(续一)

服务降级(服务生产者)

服务生产者超时或宕机了,服务消费者不能一直卡死等待,服务生产者就必须要有服务降级。

Controller 层

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
29
30
31
32
33
34
35
36
37
38
39
40
41
package ml.guest997.Controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
public class PaymentController {
@GetMapping("/payment/ok/{id}")
public String paymentOK(@PathVariable("id") Integer id) {
String s = "当前线程:" + Thread.currentThread().getName() + " paymentOK id:" + id;
log.info("result:" + s);
return s;
}

@GetMapping("/payment/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutHandler", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") //超时2秒将调用 fallbackMethod
})
public String paymentTimeOut(@PathVariable("id") Integer id) {
String s = null;
try {
TimeUnit.MILLISECONDS.sleep(3000);
s = "当前线程:" + Thread.currentThread().getName() + " paymentTimeOut id:" + id + " 耗时3秒";
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("result:" + s);
return s;
}

public String paymentTimeOutHandler(Integer id) { //fallback 方法一定要与原方法参数一致
return "当前线程:" + Thread.currentThread().getName() + " 系统繁忙或者运行报错,请稍后再试。";
}
}
阅读全文 »

Hystrix

一个用于处理分布式系统的延迟容错的开源库。在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix 能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

服务降级

系统将某些不重要的业务或接口的功能降低,可以只提供部分功能,也可以完全停止所有所有不重要的功能。服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示。降级的思想是丢车保帅。

阅读全文 »

OpenFeign

Feign 是 SpringCloud 组件中的一个轻量级 RESTful 的 HTTP 服务客户端。Feign 内置了 Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign 的使用方式是:使用 Feign 的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。

OpenFeign 是 SpringCloud 在 Feign 的基础上支持了 SpringMVC 的注解,如 @RequesMapping。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,在实现类中做负载均衡并调用其它服务。

服务调用

准备工作

阅读全文 »