服务发现-Netflix Eureka
客服端负载均衡—Netflix Ribbon
- 核心:服务发现,服务选择规则,服务监听
- 主要组件:ServerList(获取可用地址), ServerListFilter(过滤), IRule(负载均衡规则)
用处
- RestTemplate(@LoadBalanced)
- Feign
- Zuul
- Http和RPC
- SpringCloud中服务间两种restful调用方式
RestTemplate
Feign
- Feign设计原理
- 声明式REST客户端(伪RPC,感觉上是本地调用)
- 采用基于接口的注解
分布式配置——Spring Cloud Config
why
- 方便维护
- 配置内容的安全与权限
- 更新配置项目无需重启
SpringCloud Bus自动刷新配置
- 引入spring-cloud-starter-bus-amqp
- 使用消息队列机制(RabbitMQ)
- github配置webhooks触发(借助natapp将本地地址映射成网络地址)
RabbitMQ
- RabbitMQ教程
- Spring Cloud Stream
- RabbitMQ应用
- 商品 —(库存变换)— 消息队列 —(库存变化)— 订单
product(在减库存的同时将消息写入mq)
- private AmqpTemplate amqpTemplate;
- amqpTemplate.convertAndSend(“productInfo”, JsonUtil.toJson(productInfoOutputList));
order(接收消,存储到redis中)
- @RabbitListener(queuesToDeclare = @Queue(“productInfo”))
- stringRedisTemplate.opsForValue().set(String.format(PRODUCT_STOCK_TEMPLATE,
productInfoOutput.getProductId()),String.valueOf(productInfoOutput.getProductStock()));
同步流程
- 查询商品信息(调用商品服务)
- 计算总价(生成订单详情)
- 商品服务扣库存(调用商品服务)
- 订单入库(生成订单)
异步扣库存
- 库存在redis中保存
- 收到请求后,redis判断是否库存充足,减掉redis中库存
- 订单服务创建订单写入数据库,并发送消息
- 如果商品服务接收消息,扣库存失败,回滚redis数据
服务网关——Netflix Zuul
- 设置cookie sensitiveHeaders:
高可用
- 多个Zuul节点注册到Eurake Server
- Nginx和Zuul混搭
- 应用
典型应用场景
- 前置(Pre):限流; 鉴权; 参数校验调整
- 后置(Post):统计; 日志
应用实例–权限校验(过滤器 )
- /order/create 只能买家访问
- /order/finish 只能卖家访问
- /product/list 都可访问
应用实例–跨域设置
断路器——Netflix Hystrix
- 功能
服务降级(优先核心服务,非核心服务不可用或弱可用)
- 通过HystrixCommand注解指定
- fallbackMethod(回退函数)中具体实现降级逻辑
服务熔断
- @HystrixCommand(commandProperties = {
- @HystrixProperty(name = “circuitBreaker.enabled”, value = “true”), //设置熔断
- @HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”, value = “10”), //请求数达到后才计算
- @HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”, value = “10000”), //休眠时间窗(熔断器open状态与half close状态之间的间隔,此间隔内,降级逻辑为主逻辑,此间隔后,将释放请求到原来的主逻辑上,如果可以通过,关闭熔断)
- @HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”, value = “60”), //错误率(熔断器打开的条件)
- })
依赖隔离
监控(Hystrix Dashboard)