# MicroService **Repository Path**: edf/MicroService ## Basic Information - **Project Name**: MicroService - **Description**: 微服务实践 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2017-03-13 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #MicroService service-monitor 监控 service-authentication 认证 service-gateway 服务发现 * service-registry 服务注册 * service-rpc 远程过程调用 #SpringCloud #服务注册与发现 Eureka: 会默认引入Ribbon依赖包 客户端和服务端都需要,需要再建立一个服务注册发现服务 #负载均衡 Ribbon: 虚拟主机名称不能有"_",否则调用时会报错 Ribbon不同Eureka整合时,采用配置"service.ribbon.listOfServers=ip:prot,ip2:port2..."实现负载均衡 用户客户端 #声明试REST调用 Feign: 支持springmvc注解、整合了eureka和ribbon;springcloud默认整合了hystrix,只要在classpath中可以找到hystrix即可 禁用hystrix可以采用全局通过配置文件经禁用,也可以基于类实现局部禁用 支持自定义认证、压缩等 用户客户端 #容错支持 Hystrix: 实现机制: ·包裹请求 ·跳闸机制 ·资源隔离,通过线程池或信号量,加速失败判定 线程隔离适用于负载低,网络调用,默认线程隔离 信号隔离适用于负载搞,非网络调用 如果发生找不到上下文的运行异常,可以考虑采用信号隔离 ·监控 ·回退机制 ·自我修复 监控: hystrix-dashboard单个监控 turbine将多个聚合监控,可以基于mq 配置详解: Hystrix属性4种优先级 1、内置全局 采用ConcurrentHashMap 有 HystrixCommandProperties HystrixThreadPoolProperties HystrixCollapserProperties 2、动态全局 HystrixDynamicProperty 3、实例 4、动态实例 Hystrix属性 Command Properties 相关类 HystrixCommand 1、执行相关 控制HystrixCommand.run() 执行 1.1执行的隔离策略: execution.isolation.strategy 线程池隔离:THREAD 信号量隔离:SEMAPHORE 默认THREAD 信号量适用于接口并发量高的情况,如每秒数百次调用的情况,导致的线程开销过高,通常只适用于非网络调用,执行速度快 1.2超时时间: execution.isolation.thread.timeoutInMilliseconds 默认1000毫秒 超过该时间会执行回退逻辑 1.3是否启用超时设置 execution.timeout.enabled 默认true 1.4是否超时中断正在执行的run execution.isolation.thread.interruptOnTimeout 默认true 1.5是否执行取消动作时,中断正在执行的run execution.isolation.thread.interruptOnCancel 默认false 1.6设置最大的信号量,只对于使用信号量[SEMAPHORE]策略的生效 execution.isolation.semaphore.maxConcurrentRequests 默认10 如果超出该并发量,则超出的会被拒绝;且该值必需小于容器的线程池大小,否则并不起保护作用,因为其实容器线程池的一小部分而已 2、回退 控制HystrixCommand.getFallback() 执行 对于线程池或者信号量执行策略都生效 2.1最大的并发调用getFallback() fallback.isolation.semaphore.maxConcurrentRequests 默认10 如果超出该数,则后续的会被拒绝,如果没有实现回退逻辑的,则会抛出异常 2.2是否当故障或者拒绝发生后,一个调用尝试调用getFallback()方法 fallback.enabled 默认true 3、断路器 控制HystrixCircuitBreaker 3.1是否开启断路器用于健康监控和短路请求 circuitBreaker.enabled 默认true 3.2设置一个窗口内的请求数,当在该窗口内(即时间内)请求数达到了该值,则断路器会被打开 circuitBreaker.requestVolumeThreshold 默认20 3.3设置在断路打开后,拒绝请求到再次尝试请求并决定断路器是否继续打开的时间 circuitBreaker.sleepWindowInMilliseconds 默认5000毫秒 3.4设置打开断路器并走回退逻辑的错误率 circuitBreaker.errorThresholdPercentage 默认50% 3.5是否强制打开断路器,如果打开则会拒绝左右的请求 circuitBreaker.forceOpen 默认false 优先级比circuitBreaker.forceClosed高 3.6是否强制关闭断路器,则允许所有的请求,无视错误率 circuitBreaker.forceClosed 默认false 4、度量 主要度量HystrixCommand 和 HystrixObservableCommand 的执行情况 4.1设置滚动窗口的统计时间 metrics.rollingStats.timeInMilliseconds 默认10000毫秒 该项不可以动态修改,以防止统计的不正确 4.2设置滚动的统计窗口被分成的桶的数量 metrics.rollingStats.numBuckets 默认10 metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0 这个必须成立,否则会抛异常 4.3是否开启百分数和均值统计 metrics.rollingPercentile.enabled 默认true 如果为false,则值为-1 4.4设置滚动窗口的持续时间,其中执行时间保持在百分位数中 metrics.rollingPercentile.timeInMilliseconds 默认60000 4.5 metrics.rollingPercentile.numBuckets 默认6 4.6 metrics.rollingPercentile.bucketSize 默认100 4.7 metrics.healthSnapshot.intervalInMilliseconds 默认500 5、请求上下文 控制HystrixRequestContext 被HystrixCommand使用 5.1是否启动当HystrixCommand.getCacheKey()调用后,缓存到HystrixRequestCache requestCache.enabled 默认true 5.2是否记录HystrixCommand执行或者事件的日志到HystrixRequestLog requestLog.enabled 默认true Collapser Properties 控制HystrixCollapser 1、设置在批处理请求中,允许的最大请求数 maxRequestsInBatch 默认Integer.MAX_VALUE 2、设置批处理在多少毫秒后出发执行 timerDelayInMilliseconds 默认10毫秒 3、是否缓存HystrixCollapser.execute() 和 HystrixCollapser.queue() requestCache.enabled 默认true Thread Pool Properties 控制执行的线程池 1、执行线程数 coreSize 默认10 2、最大执行线程数 通常同1一样大小 maximumSize 默认10 3、设置使用哪种BlockingQueue,如果-1为SynchronousQueue;其他则为LinkedBlockingQueue maxQueueSize 默认-1 不支持动态调整 4、设置拒绝队列大小,这个属性是因为maxQueueSize无法动态改变,但需要去动态改变队列大小 queueSizeRejectionThreshold 默认5 当maxQueueSize为-1,则该属性不可用 5、设置线程存活多少毫秒 keepAliveTimeMinutes 默认1 6、设置maximumSize启作用 allowMaximumSizeToDivergeFromCoreSize 默认false 7、滚动窗口 metrics.rollingStats.timeInMilliseconds 默认10000毫秒 8、设置桶数 必需metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0 否则抛异常 metrics.rollingStats.numBuckets 默认10 #网关 Zuul: 可以和Eureka、Ribbon、Hystrix等整合,可以实现如下功能: ·身份认证与安全 ·审查与监控 ·动态路由 ·压力测试 ·负载分配 ·静态响应处理 ·多区域弹性 如果依赖了spring security,则默认会忽略:Pragma、Cache-Control、X-Frame-Options、X-Content-Type-Options、X-XSS-Protection、Expires等头信息。 如果代理文件上传,需要注意上传大小、超时时间等 可以自定义实现熔断、回退。 可以实现请求的聚合 #统一配置管理 config: 基于端点发送refresh手动刷新 基于Bus实现自动刷新,轻量级消息代理 #微服务跟踪 sleuth: ·span(跨度):基本工作单元,初始化span被称为"root span" ·trace(跟踪):一组共享"root span"的span组成的树状结构称为trace ·annotation(标注):用来记录事件的存在,核心annotation用来定义请求的开始和结束 ·CS:客户端发送一个请求 ·SR:服务端接收请求并准备处理它,如果SR-CS则为网络延迟 ·SS:服务端发送,表示完成请求处理,SS-SR则为服务端处理请求所需时间 ·CR:客户端接收,span结束的标记,CR-CS则表示客户端发送请求到接收到响应所需时间 同ELK整合日志输出 整合Zipkin,可视化查看追踪日志信息