《SpringCloud docker》读书笔记

yml配置意义

image.png
image.png

  • 当Ribbon和Eureka配合使用时,会自动将虚拟主机名映射成微服务的网络地址。
  • yml中info可以展示一些信息
server:
  port: 8000 # 指定端口
spring:
  datasource:                         # 指定数据源
    driver-class-name:  com.mysql.jdbc.Driver    
    url: #数据库路径
    username: #用户名
    password: #密码
logging:                                # 配置日志级别,让hibernate打印出执行的SQL
  level:
    root: INFO

## INFO
info: #配置项目信息,有的文章里不带'',不成功的就带上''
  app: 
    name: '@project.artifactId@'
    encoding: '@project.build.sourceEncoding@'
    java:
      source: '@java.version@'
      target: '@java.version@'
management:
  security:
    basic:
      enabled: true#true开启基于HTTP basic的认证
    user:
        name: user
        password: password

mybatis:
  type-aliases-package: com.itmuck.cloud.study.entity #mybatis别名配置

Eureka

Eureka架构图

Application Service 相当于本书中的服务提供者,Application Client相当于本书中的服务消费者;
Make Remote Call,可以简单理解为调用RESTful API;
us-east-1c、us-east-1d等都是zone,它们都属于us-east-1这个region;来源
Region和Zone

  • Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
  • Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
  • 微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒);
  • 每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;
    Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。

Eureka集群

为保证高可用,部署Eureka集群,yml配置文件可配置如下:

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer2:8762/eureka/,http://peer1:8761/eureka/
---
spring:
  profiles: peer1
server:
  port: 8761
eureka:
  instance:
    hostname: peer1
---
spring:
  profiles: peer2
server:
  port: 8762
eureka:
  instance:
    hostname: peer2

启动Eureka集群的命令
将应用注册到集群上,就是要改defaultZone,用逗号分隔即可,例如:

eureka:
    client:
      serviceUrl:
        defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

注册到需要认证的Eureka Server:defaultZone修改为:http://{user}:{password}@EUREKA_HOST:PORT/eureka/

Eureka自我保护模式

image.png

Ribbon

可以通过Java @Configuration和指定@RibbonClient来配置负载均衡策略,也可以通过yml
负载均衡项目名.ribbon.NFLoadBalancerRuleClassName来指定

Feign-声明式REST调用

为了解决上述使用RestTemplate调用参数过长难以维护的问题,关于RestTemplate,请参考RestTemplate

整合Feign

  1. 创建FeignClient
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  public User findById(@PathVariable("id") Long id);
}
  1. 启动类添加@EnableFeignClients
  2. 修改Controller调用方式
@RestController
public class MovieController {
  @Autowired
  private UserFeignClient userFeignClient;

  @GetMapping("/user/{id}")
  public User findById(@PathVariable Long id) {
    return this.userFeignClient.findById(id);
  }
}

实现REST调用的同时还实现了客户端侧的负载均衡

支持压缩

feign.compression.request.enabled=true
feign.compression.response.enabled=true
其他详细配置自己搜索

Feign日志

只对DEBUG级别做出响应。

logging:
  level:
    com.itmuch.cloud.study.user.feign.UserFeignClient: DEBUG # 将Feign接口的日志级别设置成DEBUG,因为Feign的Logger.Level只对DEBUG作出响应。

使用Feign构造多参数请求

POST:按照SpringMVC POST+JSON请求方式书写即可。
GET:用Map接收或者按照普通的SpringMVC多参数接收方式即可。

个人标注:使用Feign解决了使用RestTemplate时的硬编码问题,根据服务名称自动发现服务,实现调用。而RestTemplate则比起HTTPClient调用服务要更为简单方便一些。

Hystrix 豪猪——容错处理

依赖的服务不可用时,服务本身会不会被拖垮?这是我们要考虑的问题。

实现容错的手段

雪崩效应

“基础服务故障”导致“级联故障”的现象称为雪崩效应。

如何容错

需要实现以下两点:

  • 为网络请求设置超时。(这一点同JCIP《并发编程实战》中在指定时间内获取对应的返回数据一例大概符合)
  • 使用断路器模式
    断路器实现Fast-Fail,如果服务已经不可用,则强迫对该服务的调用快速失败。同时,可以自动诊断依赖的服务是否恢复正常。
    注意:断路器打开一段时间后,会自动进入“半开”状态。允许一个请求访问依赖的服务,如果请求调用成功,关闭断路器,否则继续保持打开状态。

个人标注:断路器主要是为了提升可用性,房子雪崩效应。这一点类似集群,对应分布式中CAP(一致性,可用性,分区)中的A(availability)

使用Hystrix实现容错

简介

Hystrix是一个实现了超时机制和断路器模式的工具类库,防止级联失败,提升系统可用性和容错性。
通过一下几点实现延迟和容错:

  • 包裹请求
  • 跳闸机制
  • 资源隔离:为每个依赖都维护了一个小型的线程池(或者信号量Semaphore)(PS:这一点可能跟Executor那几种静态ExecutorService方法有相似之处,现在还没看过,暂且猜测一下)
  • 监控
  • 回退机制
  • 自我修复

整合Hystrix

启动类添加注解@EnableCircuitBreaker或@EnableHystrix
Controller里面在方法上写@HystrixCommand,指定属性fallbackMethod,指定回退方法;还可以配置利用@HystrixCoProperty commandProperties
执行回退逻辑,并不一定代表断路器处于打开状态。请求失败、超市、被拒绝以及断路器打开时都会执行回退逻辑。
失败率达到20次失败/5s这个阈值才会打开。

线程隔离策略与传播上下文

隔离策略有两种:

  1. 线程隔离:HystrixCommand会在单独的线程上执行,并发请求受线程池中的线程数量的限制
  2. 信号量隔离:HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受到信号量个数的限制
    可使用execution.isolation.strategy属性指定隔离策略。默认是Thread隔离策略。

Feign整合Hystrix

如下:

package com.itmuch.cloud.study.user.feign;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.itmuch.cloud.study.user.entity.User;

/**
 * Feign的fallback测试
 * 使用@FeignClient的fallback属性指定回退类
 * @author 周立
 */
@FeignClient(name = "microservice-provider-user", fallback = FeignClientFallback.class)
public interface UserFeignClient {
  @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  public User findById(@PathVariable("id") Long id);

}

/**
 * 回退类FeignClientFallback需实现Feign Client接口
 * FeignClientFallback也可以是public class,没有区别
 * @author 周立
 */
@Component
class FeignClientFallback implements UserFeignClient {
  @Override
  public User findById(Long id) {
    User user = new User();
    user.setId(-1L);
    user.setUsername("默认用户");
    return user;
  }
}

结合FallbackFactory重写create()方法打印失败原因。
为Feign禁用Hystrix:
配置@Configuration,在FeignClient引用该配置类即可。
全局禁用:yml文件配置feign.hystrix.enabled=false

Hystrix的监控

一般项目:引入Hystrix-metrics-event-stream,访问ip:port/hystrix.stream即可
Feign项目:引入spring-cloud-starter-hystrix依赖,启动类加上@EnableCircuitBreaker,访问/hystrix.stream监控Hystrix

使用Hystrix Dashboard可视化监控数据

添加hystrix-dashboard依赖,启动类添加@EnableHystrixDashboard
监控的是单个微服务。

使用Turbine聚合监控数据

使用消息中间件收集数据

使用Zuul构建微服务网关

电影买票,可能会调用多个微服务的接口(例如库存微服务、用户微服务、支付微服务等),才能完成一次购票的业务流程。客户端直接和各个微服务通信可能存在一些问题:

  • 客户端多次请求不同微服务,增加了客户端的复杂性
  • 存在跨域请求,在一定场景下处理相对复杂
  • 认证复杂,每个微服务都需要独立认证
  • 难以重构
  • 直接访问可能会有一定困难
    以上问题可借助微服务网关解决。
    使用微服务网关优点:
  • 易于监控
  • 易于认证
  • 减少客户端与各个微服务直接的交互次数。

Zuul简介

其核心是一系列的过滤器。

Zuul的路由端点

路由配置

Zuul安全与Header

Zuul文件上传

小文件上传(1M以内),无需任何处理,即可正常上传。对于大文件(10M以上)上传,需要为上传路径添加/zuul前缀

Zuul的过滤器

Zuul中定义了4种标准过滤器类型:

  • PRE
  • ROUTING
  • POST
  • ERROR
    编写过滤器,继承ZuulFilter覆写方法,启动类添加filter对应的@Bean即可

禁用Zuul过滤器

zuul...disable=true

Zuul的容错与回退

实现ZuulFallbackProvider接口

Zuul的高可用

分两种情况:Zuul客户端注册和未注册到Eureka Server上

使用Sidecar整合非JVM微服务

非JVM微服务需要实现监控检查,status状态常见取值有:UP/DOWN/OUT_OF_SERVICE/UNKNOWN等。

Spring Cloud Config

维护的配置管护理一般有以下需求:

  • 集中管理配置。
  • 不同环境不同配置。
  • 运行期间可动态调整。
  • 配置修改后可自动更新。

简介

Config为分布式系统外部化配置提供了服务器端和客户端的支持,它包括Config Server和Config Client两部分。默认使用Git存储配置内容。
启动类@EnableConfigServer
Actuator提供的/refresh可以实现手动刷新配置,在Controller上添加注解@RefreshScope

使用Spring Cloud Bus自动刷新配置

使用Spring Cloud Sleuth实现微服务跟踪

使用Actuator监控微服务实例,使用Hystrix监控Hystrix Command,使用Sleuth实现微服务“跟踪”
分布式计算的八大误区:

  • 网络可靠
  • 延迟为零
  • 带宽无限
  • 网络绝对安全
  • 网络拓扑不会改变
  • 必须有一名管理员
  • 传输成本为零
  • 网络同质化
    基本在描述同一个问题——网络问题。微服务之间通过网络进行通信,如果跟踪请求可以了解经过哪些微服务、请求耗时、网络延迟等指标,就可以更好的分析系统瓶颈。

简介

一些术语:

  • span(跨度):基本工作单元。用一个64位的id唯一标识。
  • trace(跟踪):一组共享“root span”的span组成的树状结构成为trace。
  • annotation(标注):annotation用来记录事件的存在。其中,核心annotation用来定义请求的开始和结束。
  • CS(client Sent客户端发送)
  • SR(Server Received服务器端接收)
  • SS(Server Send服务器端发送)
  • CR(client Received客户端接收)

Spring Cloud Sleuth与ELK配合使用

与Zipkin配合使用

编写Zipkin Server:添加以来,启动类使用@EnableZipkinServer注解
可以查看详细信息,还可以分析微服务之间的依赖。
image.png

Docker

Docker是一个开源的容器引擎,它有助于更快的交付应用。好处:可更快的打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。

注解

@EnableDiscoveryClient:声明这是一个Eureka的Client,在启动类上加
@SpringBootApplication:启动类注解
Feign注解:
@RequestLine("GET /{id}")
public User findById(@Param("id") Long id);

Actuator

提供了很多监控端点,可使用http://{ip}:{port}/{endpoint}的形式访问这些端点。
image.png

其他小知识

  • RestTemplate可以请求微服务,例如:restTemplate对象.getForObject(地址,类.class)
  • 服务发现组件:Eureka,Zookeeper,Consul
  • 启动同一个微服务的多个实例:
  1. 打包
  2. java -jar jar包名 --server.port=8001更改port启动即可
  • 负载均衡器:Nginx、HAProxy、F5等
  • JCE(Java Cryptography Extension)

看完这本书后,可以了解一下拜托!面试请不要再问我Spring Cloud底层原理

当你准备好了,机会来临的时候,你才能抓住
原文地址:https://www.cnblogs.com/studentytj/p/10428595.html