Skip to content

quick start

liubao edited this page Aug 17, 2022 · 9 revisions

快速开始

微服务架构的好处之一就是开发新的应用变得更加快速和简单。达成这个目标的主要原因是微服务 基础设施已经由微服务平台和微服务框架实现了,从开发者而言,微服务的应用架构、使用的技术栈 都变得更加简单。

Spring Cloud Huawei Basic Samples 提供了一个典型的微服务架构应用, 它包括微服务网关、微服务提供者和微服务消费者三个微服务。通过下载该项目,就实现了快速搭建 具备简单功能的微服务应用。

微服务网关

微服务网关是请求的入口,也是实现弹性架构最常用的组件。引入微服务网关,既可以通过限制请求的入口 达到提升应用安全的目的,也可以通过屏蔽内部微服务应用的架构细节,实现微服务的持续重构(拆分和合并等)。 微服务网关在解决跨子系统访问等其他应用场景也有非常重要的作用。

微服务网关开发最重要的步骤是配置路由规则和启用服务治理。本示例的路由规则如下:

spring:
  cloud:
    gateway:
      routes:
        - id: consumer
          uri: lb://basic-consumer
          predicates:
            - Path=/**

该路由规则将所有请求 /** 转发到 basic-consumer 微服务。

微服务提供者

微服务提供者实现了一个REST服务,

@RestController
public class ProviderController {
  // a very simple service to echo the request parameter
  @GetMapping("/sayHello")
  public String sayHello(@RequestParam("name") String name) {
    return "Hello " + name;
  }
  @GetMapping("/sayHelloFeign")
  public String sayHelloFeign(@RequestParam("name") String name) {
    return "Hello " + name;
  }
}

该服务实现了两个简单的接口 /sayHello/sayHelloFeign

微服务消费者

微服务消费者演示了通过 RestTemplateFeign 两种方式访问微服务提供者,

@RestController
public class ConsumerController {
  @Autowired
  private RestTemplate restTemplate;

  @Autowired
  private FeignConsumerService feignConsumerService;

  private ConfigListen configListen;

  @Autowired
  public ConsumerController(ConfigListen configListen) {
    this.configListen = configListen;
  }

  // consumer service which delegate the implementation to provider service.
  @GetMapping("/sayHello")
  public String sayHello(@RequestParam("name") String name) {
    return restTemplate.getForObject("http://basic-provider/sayHello?name={1}", String.class, name);
  }

  @GetMapping("/sayHelloFeign")
  public String sayHelloFeign(@RequestParam("name") String name) {
    return feignConsumerService.sayHelloFeign(name);
  }
}

服务治理

服务治理通常应对如下一些场景:

场景一:微服务A调用微服务B,其中B有B1、B2、B3…多个实例,其中B1由于节点性能原因,响应比较慢。如果B业务访问非常频繁,系统总体表现出断断续续,用户体验非常差。
场景二:微服务A调用微服务B,其中B有B1、B2、B3…多个实例,其中B1由于业务代码错误,产生OOM,被管理面杀死并重启。由于B1被杀死的时候,没有执行优雅停机,微服务A还缓存了B1的地址,访问B1会导致超时。在高并发情况下,访问B1的请求会快速占满线程池里面的所有线程,系统表现为整体不可用。
场景三:微服务A调用微服务B,其中B有B1、B2、B3…多个实例,现在扩容一个实例Bi,由于Bi刚刚启动,需要初始化连接、数据库等资源,处理请求较慢,不能够像其他实例一样处理同等流量的请求。需要给Bi分配少量的流量,给其他实例分配更多的流量。

为了应对这些场景,在微服务网关启用了服务端流控、客户端熔断、客户端隔离仓等治理手段;

## 服务治理配置
servicecomb:
  matchGroup:
    allOperation: |
      matches:
        - apiPath:
            prefix: "/"
  rateLimiting:
    ## 限流器每10毫秒允许通过100个请求,如果一个请求超过1000毫秒没有获取到
    ## 许可,将被拒绝
    allOperation: |
      rate: 100
      limitRefreshPeriod: 10
      timeoutDuration: 1000
  instanceIsolation:
    ## 熔断器错误率达到50%或者耗时请求达到100%,将开启。
    ## 开启时间为5000毫秒,然后会放通10个请求。
    allOperation: |
      minimumNumberOfCalls: 10
      slidingWindowSize: 20
      slidingWindowType: COUNT_BASED
      failureRateThreshold: 50
      slowCallRateThreshold: 100
      slowCallDurationThreshold: 1000
      waitDurationInOpenState: 5000
      permittedNumberOfCallsInHalfOpenState: 10
  instanceBulkhead:
    ## 隔离仓限制正在处理的请求数为20个,新来的请求等待1000毫秒没有获取到
    ## 许可,将被拒绝。
    allOperation: |
      maxConcurrentCalls: 20
      maxWaitDuration: 1000

在微服务启用了客户端容错、客户端熔断、客户端隔离仓等治理手段。

## 服务治理配置
servicecomb:
  matchGroup:
    allOperation: |
      matches:
        - apiPath:
            prefix: "/"
  retry:
    ## 重试器最多重试2次,并且尽可能选择不同于失败的实例进行重试。
    allOperation: |
      maxAttempts: 2
      retryOnSame: 0
  instanceIsolation:
    ## 熔断器错误率达到50%或者耗时请求达到100%,将开启。
    ## 开启时间为5000毫秒,然后会放通10个请求。
    allOperation: |
      minimumNumberOfCalls: 10
      slidingWindowSize: 20
      slidingWindowType: COUNT_BASED
      failureRateThreshold: 50
      slowCallRateThreshold: 100
      slowCallDurationThreshold: 1000
      waitDurationInOpenState: 5000
      permittedNumberOfCallsInHalfOpenState: 10
  instanceBulkhead:
    ## 隔离仓限制正在处理的请求数为20个,新来的请求等待1000毫秒没有获取到
    ## 许可,将被拒绝。
    allOperation: |
      maxConcurrentCalls: 20
      maxWaitDuration: 1000

在特殊的复杂场景服务端隔离仓等治理手段也会被使用并且需要结合实际业务运营情况动态调整。

请求过程

启动上面的三个微服务,用户通过浏览器访问 http://localhost:9090/sayHellofeign?name=World, 请求处理的过程如下:

请求:    浏览器 ----> 微服务网关 ----> 微服务消费者  ---> 微服务提供者
响应:    浏览器 <---- 微服务网关 <---- 微服务消费者  <--- 微服务提供者
Clone this wiki locally