-
Notifications
You must be signed in to change notification settings - Fork 224
quick start
微服务架构的好处之一就是开发新的应用变得更加快速和简单。达成这个目标的主要原因是微服务 基础设施已经由微服务平台和微服务框架实现了,从开发者而言,微服务的应用架构、使用的技术栈 都变得更加简单。
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
。
微服务消费者演示了通过 RestTemplate
和 Feign
两种方式访问微服务提供者,
@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
, 请求处理的过程如下:
请求: 浏览器 ----> 微服务网关 ----> 微服务消费者 ---> 微服务提供者
响应: 浏览器 <---- 微服务网关 <---- 微服务消费者 <--- 微服务提供者
-
使用Spring Cloud Huawei功能
-
使用服务治理
-
生态集成
-
迁移改造问题
-
配置参考
-
优秀实践
-
常见问题