美文网首页读书笔记
《SpringCloud docker》读书笔记

《SpringCloud docker》读书笔记

作者: ReentrantSucc | 来源:发表于2019-01-04 12:52 被阅读12次

    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.<SimpleClassName>.<filterType>.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底层原理

    相关文章

      网友评论

        本文标题:《SpringCloud docker》读书笔记

        本文链接:https://www.haomeiwen.com/subject/tfphrqtx.html