zoukankan      html  css  js  c++  java
  • SpringBoot-SpringCloud

    -----------------------------------------------------------------------------

    spring boot 1.我理解就是把 spring spring mvc spring data jpa 等等的一些常用的常用的基础框架组合起来,
    提供默认的配置,然后提供可插拔的设计,就是各种 starter ,来方便开发者使用这一系列的技术。

    2.以前需要关注版本兼容和一堆配置整合文件,
    现在可以先不关心如何配置,可以快速的启动开发,进行业务逻辑编写,
    各种需要的技术,加入 starter 就配置好了,直接使用,可以说追求开箱即用的效果吧。

    3.对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,
    另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。

    4.4.0版本是Spring框架最新发布的主版本,并且首次完全支持Java8的功能。你依然可以使用较早的Java版本,但是现在所需的最小的版本已经被提升的Java SE6。
    同时还利用主版本发布的机会删除了很多废弃的类和方法。
    5.Spring 是一个“引擎”;
    Spring MVC 是基于Spring的一个 MVC 框架;
    Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
    Spring Boot:
    SpringBoot四大神器之Starter

    Spring Boot中Starter是什么
    比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,
    而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依赖。

    经过研究,Starter主要用来简化依赖用的。比如我们之前做MVC时要引入日志组件,那么需要去找到log4j的版本,然后引入,
    现在有了Starter之后,直接用这个之后,log4j就自动引入了,也不用关心版本这些问题。

    较新版的Spring Boot取消了@SpringApplicationConfiguration这个注解,用@SpringBootTest就可以了

    1、@SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置。;
    2、@Configuration:这是一个配置Spring的配置类;
    3、@Controller:标明这是一个SpringMVC的Controller控制器;
    4、main方法:在main方法中启动一个应用,即:这个应用的入口;
    Spring Boot项目中,启动的方式有两种,
    一种是直接run Java Application
    另外一种是通过Spring Boot的Maven插件运行。在Spring Boot项目中推荐使用@ SpringBootConfiguration替代@Configuration
    @EnableAutoConfiguration:启用自动配置,该注解会使Spring Boot根据项目中依赖的jar包自动配置项目的配置项:
    @ComponentScan:默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。

    关闭自动配置
    比如:不想自动配置Redis,想手动配置
    @SpringBootApplication(exclude={RedisAutoConfiguration.class})
    该网站可配置Spring Boot运行字体样式:http://patorjk.com/software/taag/#p=display&h=3&v=3&f=4Max&t=itcast%20Spring%20Boot

    全局配置文件
    SpringBoot使用一个全局的配置文件,application.properties或者是application.yml

    pom文件的引用
    Sprint-boot-starter-securityd
    sprint-boot-starter-social-facebook
    sprint-boot-starter-social-linkedin
    sprint-boot-starter-social-twitter

    sprint-boot-starter-test 常用的测试框架:Junit,Hamcrest,Mockito,包含Sprint-test模块
    sprint-boot-starter-thymeleaf 对Thymeleaf模板引擎的支持,包含Spring整合的配置    (tomcat-embed-jasper对jsp的支持的依赖)
    sprint-boot-starter-velocity 对Velocity模板引擎的支持
    spring-boot-starter-freemarker对Freemarker模板引擎的支持
    sprint-boot-starter-web 对Web项目开发的支持,包含Tomcat和Spring-MVC
    sprint-boot-starter-Tomcat SprintBoot默认的Servlet容器Tomcat,使用外置tomcat时使用:https://blog.csdn.net/wangshuaiwsws95/article/details/80575742#commentBox
    sprint-boot-starter-Jetty 使用Jetty作为Servlet容器,替换Tomcat
    sprint-boot-starter-undertow 使用Undertow作为Servlet容器,替换Tomcat
    sprint-boot-starter-logging SprintBoot默认的日志框架logging
    sprint-boot-starter-log4j 支持使用Log4j日志框架
    sprint-boot-starter-websocket 支持WebSocket开发
    sprint-boot-starter-ws 支持WebService开发

    spring-boot-starter-data-mongodb:   Spring-boot中使用MongoTemplate API访问MongoDB数据库中的数据,对于MongoDB,我们也可以使用mLab,它提供了MongoDB数据库即服务平台,因此您甚至不必在计算机上安装MongoDB数据库。mLab:使用方式https://www.jianshu.com/p/b633545862e7

    spring-restdocs-mockmvc:   spring官方推荐的restdoc去生成api文档。本文创建一个简单的springboot工程,将http接口通过Api文档暴露出来。只需要通过 JUnit单元测试和Spring的MockMVC就可以生成文档。使用方式:https://www.jianshu.com/p/4759723754d4

    SpringBoot2基于Swagger2生成离线Api文档:https://www.jianshu.com/p/033d650164c4

    Spring Boot中使用Swagger2构建强大的RESTful API在线文档:http://blog.didispace.com/springbootswagger2/

    Spring Boot中使用Swagger2构建强大的RESTful API离线文档:https://www.jianshu.com/p/af7a6f29bf4f

     

    spring-boot-starter-actuator健康检查、监控


    Xml配置文件
    SprintBoot提出0配置XML文件,但在实际项目中可能有一些特殊要求必须使用Xml配置
    这时可以通过Spring提供的@ImportResource来加载Xml配置
    例如:@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"})

    日志
    SpringBoot可以通过配置来修改默认的日志的配置:
    设置日志级别:logging.level.org.springframework=DEBUG
    格式:logging.level.*=

    SprintBoot的自动配置原理
    SpringBoot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件
    将该配置文件中的配置载入到Spring容器。

    Maven下载源码
    通过dependency:sources该命令可以下载该项目所有的依赖的包和源码。

    举例Redis的自动配置
    //这是条件注解,当存在配置的类的情况下,才会实例化该类
    @ConditionalOnClass({JedisConnection.class,RedisOperations.class,Jedis.class})
    //Redis的配置类
    private final RedisProperties properties
    //配置项的前缀
    @ConfigurationProperties(prefix="spring.redis")

    条件注解
    @ConditionalOnBean 当容器里有指定的Bean的条件下
    @ConditionalOnClass 当类路径下有指定的类的条件下。
    @ConditionalOnExpression 基于SpEl表达式作为判断条件。
    @ConditionalOnJava 基于JVM版本作为判断条件
    @ConditionalOnJndi 在JNDI存在的条件下查找指定的位置。
    @ConditionalOnMissingBean 当容器里没有指定Bean的情况下。
    @ConditionalOnMissingClass 当类路径下没有指定的类的条件下。
    @ConditionalOnNotWebApplication 当前项目不是Web项目的的条件下。
    @ConditionalOnProperty 指定的属性是否有指定的值。
    @ConditionalOnResource 类路径是否有指定的值。
    @ConditionalOnSingleCandidate 当指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
    @ConditionalOnWebApplication 当前项目是Web项目的条件下。

    SpringBoot的Web开发
    org.springframework.autoconfigure.web.WebMvcAutoConfiguration:web开发的自动配置类
    1.自动配置的ViewResolver
    2.自动配置静态资源
    如果进入SpringMVC的规则为/时,
    SpringBoot的默认静态资源的路径为:spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public
    将静态资源放置到webapp下的static目录中即可通过地址访问


    自定义消息转化器
    只需要在@Configuration的类中添加消息转化器的@bean加入到spring容器,
    就会被SpringBoot自动加入到容器中。


    自定义SpringMVC的配置
    有时候我们需要自己配置SpringMVC而不是采用默认,
    比如说增加一个拦截器就的继承WebMvcConfigurerAdapter然后重写父类中的方法进行扩展


    ----.13
    controlle要和启动入口main、是同级别目录
    @EnableAutoConfiguration 开启自动配置 诶内薄凹凸康菲格瑞神
    @AutoConfigurationPackage自动配置包
    @import 导入自动配置类
    将主配置类(@SpringBootApplication标注的类)的所在包 及 下面所有子包里面的所有组件扫描到Spring容器!!!

    部署时:不是生成war包,而是通过Maven Probject中 Deom->Lifecycle->Package运行,jar包生成后在target文件夹

    application.yml:修改SpringBoot项目中的默认配置项,如端口、等等

    @PropertySource(value = {"classpath:person.properties"}) 加载指定的配置文件、因为yml/properties默认是全局配置
    @ImportResource(locations = {"classpath:beans.xml"})导入Spring的配置文件
    SprintBoot推荐的 ‘导入Spring的配置文件’ 为 通过‘全注解配置类’而不是像之前通过<bean></bean>
    @Configuration和(@Bean) 指明当前类是配置类,来替代Spring配置文件/替代ImportResource()

    配置文件的随机数和占位符

    SpringBoot默认使用slf4j-api.jar(日志门面)和logback-core.jar/classic.jar(日志实现框架:在log4j基础上升级)
    slf4j-api.jar + slf4j-log412.jar + log4j.jar


    Web
    xxxxAutoConfiguration:帮我们给容器中自动配置组件
    xxxxProperties:配置类来封装配置文件的内容
    xxxxConfigurer:帮助我们进行扩展配置
    @ConditionalOnxxx:一般都是判断条件、条件注解
    @Enablexxx:一般是开启某项注解支持或服务

    SprintBoot对静态资源的默认设置、:webjars/public/resources/static:首页、图标、css/js/img文件。以上都是默认查找位置:一般也可在yml/properties中定义


    Thymeleaf使用(森么莱夫(坦普雷斯)模板引擎解析)
    五中表达式:
    ${}、变量表达式
    *{}、选择变量表达式
    #{}、消息文字表达式
    @{}、链接url表达式
    ~{}、片段表达式

    操作:

    引入js和css:

          1、<th:block th:include="include :: datetimepicker-css" />
          2、<th:block th:include="include :: datetimepicker-js" />

    th:insert/th:replace、 jsp:include (与之前JSP对比)
    th:each c:forEach
    th:if c:if
    th:object 声明变量
    th:attr 任意属性修改
    th:value 修改指定属性默认值
    th:text 修改标签体内容
    th:fragment 声明片段
    th:remove
    行内写法:<div>[[${user}]] / [(${user})]</div>

    SprintBoot对SpringMvc的默认配置:
    视图解析器,组合所有的视图解析器,'我们可以自己给"容器"中添加一个视图解析器,自动的将其组合进来'
    静态首页
    静态资源文件夹
    图标
    自动注册了'转换器','格式化器',我们只需要放在"容器"中即可
    自己给容器添加HttpMessageConverter,只需要将自己的组件注册到"容器"中(@Bean,@Component)
    定义错误代码生成规则

    @EnableWebMvc:全面接管SpringMVC、SpringBoot的SpringMvc自动配置将全部失效
    原因为:
    //容器中没有这个组件的时候,这个自动配置类才会生效
    @EnableWebMvc将WebMvcConfigrationSupport组件导入进了
    Restfui-crud
    区域信息解析器:
    设置login.html中英文显示
    链接上的区域信息:点击链接切换国际化/中英文
    登录


    SpringBoot默认配置如不满意,也可自定义config->配置类更改配置

    SpringBoot内置Servlet容器Tomcat不支持JSP,
    如需SpringBoot支持JSP需要使用外部Tomcat、war包方式。
    服务器为什么能启动SpringBoot:是因必须继承'SpringBootServletInitializer'

    ---.27
    SpringBoot的数据访问:JDBC/Mybatis/SpringDataJPA/Mongdb/redis/...
    引入了各种xxxTemplate、xxxRepository,来简化对数据访问层的操作

    SpringBoot与缓存
    缓存注解和概念
    Cache 缓存接口
    CacheManager 缓存管理器,管理多个Cache,(cacheName/value缓存名字,key缓存使用的key)
    @Cacheable 方法可被缓存
    @CacheEvict 清空缓存 (如delete时)
    @CachePut 更新缓存 (如update时)
    @EnableCaching 开启缓存
    keyGenerator 缓存数据时key生成策略 key
    serialize 缓存数据时value序列化策略

    unless:否定缓存
    sync:是否使用异步模式

    缓存体验步骤:
    1.引入spring-boot-starter-cache
    2.@EnableCaching开启缓存
    3.@Cacheeable(cacheName={"emp"},key="#id",condition="#id>0")
    4.@CachePut()
    缓存中间件:redis memcached/ehcache
    整合redis作为缓存:
    1.引入spring-boot-start-data-redis
    2.application.yml配置Redis连接地址
    3.使用RestTemplate操作redis (RedisTemplate)
    redisTemplate.opsForValue();操作字符串
    redisTemplate.opsForHash();操作hash
    redisTemplate.opsForList();操作list
    redisTemplate.opsForSet();操作set
    redisTemplate.opsForZset();操作有序set
    4.配置缓存、CacheManagerCustomizers
    5.测试使用缓存、切换缓存、CompositeCacheManager

    与消息
    整合RabbitMQ
    1.引入spring-boot-starter-amqp
    2.application.xml
    3.测试RabbitMQ
    AmqpAdmin:管理组件
    RabbitTemplate:消息发送处理组件

    1.开启监听或接受的注解支持:@EnableRabbit(AMQP)、@EnableJms(JMS)
    2.监听或接受:@RabbitListener(AMQP)、@JmsListener(JMS)

    核心概念
    Message(消息):消息头和消息体组成。
    Publisher(消息生产者):向交换器发送消息。
    Exchange(交换器):接受消息生产者发送的消息,
    点对点:direct(默认)
    发布订阅:fanout/topic/headers
    Queue(消息队列):保存消息发送给消费者
    Binding(绑定):用于消息队列和交换器之间的关联
    Connection:网络连接,比如一个TCP
    Channel:信道,多路复用连接中的一条独立的双向数据流通道,复用一条TCP连接。
    Consumer(消费者):从消息队列中取消息的客户端。
    Virtual Host(虚拟主机):独立运行,迷你版RabbitMQ,连接RabbitMQ必须连接虚拟主机。
    Broker:消息代理(服务器)

    与检索
    ElasticSearch可以快速的存储、搜索和分析好了数据

    安装启动:
    docker run -e ES_JAVA_OPTS="-Xms26m -Xms256m" -d -p 9200:9200 -p 9300:9300 --name ES02 容器DI编号

    Elasticsearch:使用JSON数据格式

    一个Elasticsearch集群可以包含多个索引,相应的每个索引可以包含多个类型,
    这些不同的类型存储着多个文档,每个文档又有多个属性

    整合ElasticSearch
    1.引入Spring-boot-starter-data-elasticsearch
    2.安装Spring-Data对应版本的ElasticSearch
    3.application.yml
    4.Spring Boot自动配置的:ElasticsearchRepository、ElasticsearchTemplate、Client
    5.测试ElasticSearch
    与任务
    异步任务/定时任务/邮件任务

    异步任务:@EnableAysnc、@Aysnc,

    定时任务:@EnableScheduling、@Scheduling,
    TaskExecutor,TaskScheduler 接口

    邮件任务:1.引入Spring-boot-starter-mail
    2.SpringBoot自动配置MailSenderAutoConfiguration
    3.定义MailProperties内容,配置在application.yml中
    4.自动装配JavaMailSender
    5.测试邮件发送
    与安全
    1.引入spring-boot-starter-security
    2.编写配置SpringSecurity的配置类
    3.控制请求的访问权限
    4...

    与分布式
    SpringBoot和Zookeeper和Dubbo整合
    1.安装Zookeeper并启动

    2.将服务提供者注册到注册中心
    1.引入dubbo-spring-boot-starter和zookerpee客户端工具zkclient
    2.application.yml:配置dubbo扫描包和注册中心地址
    3.@Service(duboo的@Service):发布服务 @Component加入到容器

    3.服务消费者
    1.引入dubbo-spring-boot-starter和zookerpee客户端工具zkclient
    2.application.yml:配置注册中心地址
    3.@Service(Spring的@Service)@Reference:远程引用服务,调用提供者中的@Service的方法
    4.测试 调用当前消费者中的@Service的方法

    与监控管理
    提供了生成环境下的应用监控和管理功能,通过HTTP/JMX/SSH协议操作
    1.引入Spring-boot-starter-actuator
    2.通过http方式访问监控端点
    3.可进行shutdown(Post提交,此端点默认关闭)

    监控管理端点:
    autoconfig 所有自动配置信息
    auditevents 审计时间
    beans 所有Bean的信息
    configprops 所有配置属性
    dump 线程状态信息
    env 当前环境信息
    health 应用健康状况
    info 当前应用信息
    metrics 应用的各项指标
    mappings 应用@RequestMapping映射路径
    shutdown 关闭当前应用
    trace 追踪信息

    与部署

    热部署:引入spring-boot-devtools
    -----------------------------------------------------------------------------


    SpringCloud微服务
    无分布!不开发
    知识只有质量,没有重量

    -从面试题开始
    什么是微服务?
    微服务之间是如何独立通讯的?
    SpringCloud和Dubbo有哪些区别?
    Restfui API,RPC远程固态调用
    SpringBoot和SpringCloud,谈谈你对他们的理解?
    什么是服务熔断?什么是服务降级
    微服务的优缺点分别是什么?说下你在项目开发中碰到的坑
    你所知道的微服务技术栈有哪些?请举例一二
    eureka和zookeeper都可以提供服务注册于发现的功能,请说说两个的区别?
    ......

    -微服务概述
    微服务-微服务架构-SpringCloud
    耦合度更低,职责更佳明确
    单体应用:牵一发而动全身

    提倡将单一应用程序划分成一组小的服务,每个服务运行在自己独立的进程中。
    服务之间相互配合,服务之间采用通信机制互相沟通(使用HTTP的Restfui API)。
    每个服务都围绕着具体业务构建,并能够被独立部署到生产环境。
    应尽量避免统一的,集中式的服务管理机制,对一个服务而言:可根据业务、适合语言、工具对其构建。
    可以有个轻量级的集中式管理来协调这些服务,可以使用不同语言编写服务,也可以使用不同的数据存储

    将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去耦合。
    从技术角度看就是一种小而独立的处理过程,类似进程观念,能够自行单独启动或销毁,拥有自己独立的数据库,一个业务可以连接一个数据库、也可以多个业务连接一个服务库。


    微服务架构:
    eclipse里面用maven开发的一个一个独立的小moudle,具体使用Springboot开发一个小的模块
    一个一个的服务组装拼接起来,对外提供服务暴露接口

    微服务优缺点:
    能使用不同语言开发,
    松耦合,易于维护
    部署灵活,开发效率高
    微服务只是业务逻辑的代码,不会和HTML,CSS或其他界面组件混合

    开发要处理分布式系统的复杂性
    所服务运维难度、随着服务的增加、运维的压力也增大
    系统部署依赖、服务间通信成本
    数据一致性、系统集成测试、性能监控......

    分布式微服务技术栈:
    微服务条目↓ 落地技术↓
    服务开发 SpringBoot Spring SpringMVC
    服务配置与管理 Archaius Diamond
    服务注册与发现 Eureka Consul Zookeeper
    服务调用 Rest RPC gRPC
    服务熔断器 Hystrix Envoy
    负载均衡 Ribbon Nginx
    服务接口调用(客户端工具)Feign
    消息队列 kafka RabbitMQ ActiveMQ
    服务配置中心管理 SpringCloudConfig Chef
    服务路由(API网关) Zuul
    服务监控 Zabbix Nagios Metrics Spectator
    全链路追踪 Zipkin Brave Dapper
    服务部署 Docker OpenStack Kubernetes
    数据流操作开发包 SpringCloud Stream(封装与Redis,Rabbit,KafKa等发送接收消息)
    事件消息总线 SpringCloud Bus
    ...

    Dubbo5年不再维护、2017年重新维护、使得SpringCloud义军崛起
    就目前而言软件开发、无论前段和后端、都提倡组件化或模块化开发方式、应深入理解组件化和模块化。

    -SpringCloud入门概述
    是什么
    SpringCloud分布式微服务下的一战式解决方案,是各个落地技术的集合体,俗称微服务全家桶
    SpringCloud和SpringBoot是什么关系
    1.SpringCloud宏观、SpringBoot微观关注的以一个一个的微服务。医院科室举例依赖关系。
    2.SpringCloud关注全局的微服务协调整理治理框架,他将SpringBoot开发的一个个单体微服务整合并管理起来,
    为各个微服务之间提供:配置管理、服务发现、断路器路由、微代理、事件总线、全局锁、决策精选、分布式会话等等集成服务。
    3.SpringBoot可以离开SpringCloud独立使用,但SpringCloud离不开SpringBoot,属于依赖关系。
    4.SpringBoot专注快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
    Dubbo与SpringCloud的对比
    Dubbo SpringCloud
    服务注册中心 Zookeeper Spring Cloud Netflix Eureka
    服务调用方式 RPC Restfui API
    服务监控 Dubbo-monitor StringBoot Admin
    断路器 不完善 Spring Cloud Netflix Hystrix
    服务网关 无 Spring Cloud Netflix Zuul
    分布式配置 无 Spring Cloud Config  (类比Apollo携程分布式配置阿波罗(此菠萝非彼菠萝百度):https://www.cnblogs.com/xiaohouzai/p/9231925.html)
    服务链路跟踪 无 Spring Cloud Sleuth
    消息总线 无 Spring Cloud Bus
    数据流(消息驱动、服务之间消息通信)  无 Spring Cloud Stream
    批量任务 无 Spring Cloud Task

    共同抽象层Spring Cloud Commons

    统一安全认证安全工具包Spring Cloud Security 

    共同抽象层Spring Cloud Commons

    Spring Cloud分布式微服务利用redssion实现分布式锁

    Spring Cloud分布式微服务事务ByteTCC、LCN

    Spring Cloud Zookeeper 用于使用zookeeper方式的服务发现和配置管理。

    Spring Cloud CLI  可以命令行方式快速建立云组件

    Spring Cloud Netflix Turbine 聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况

    Spring Cloud Netflix Archaius 配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能


    ......
    Dubbo好比是组装机,而SpringCloud是一体机
    阿里:刘军
    Dubbo之后会积极寻求适配到SpringCloud生态,
    比如作为SpringCloud的二进制通信方案发挥Dubbo性能优势,
    或Dubbo通过模块化以及对http的支持适配到SpringCloud。

    能干嘛
    分布式版本控制配置
    服务注册与发现
    路由
    服务到服务的调用
    负载均衡配置
    断路器
    分布式消息管理
    ......
    去哪下
    SpringCloud官网
    怎么玩
    https://springcloud.cc/SpringCloud中文网
    SpringCloud国内使用情况
    阿里云

    -Rest微服务构建案例工程模块
    创建项目:MavevObject 后续新建都是Maven Modle(这才是真正干活的微服务),这都是分布式项目的套路
    Elicpse调成逻辑视图
    引入lombok创建entity实体类序列化,并使用注解方式替代get、set


    -Eureka服务注册与发现
    是什么
    NetFlix在设计Eureka时准守的就是AP原则
    Eureka是一个基于REST的服务,只需要使用服务的标识符,就可以访问到服务
    功能类似于dubbo的注册中心,如Zookeeper
    Eureka采用了C-S的设计架构,Eureka Server作为服务注册功能的服务器,是服务注册中心。
    Eureka包含两个组件,Eureka Server和Eureka Client
    三大角色
    Eureka Server提供服务注册和发现
    Service Provider服务提供方将自身服务注册到Eureka,使服务消费方能找到
    Service Consumer服务消费方从Eureka获取注册服务列表,消费提供方所提供的服务

    构建步骤



    集群配置


    作为服务注册中心,Eureka比Zookeeper好在哪里?
    CAP:C一致性、A可用性、P分区容错性
    ACID:A原子性、C一致性、I独立性、D持久性

    Zookeeper保证(CP)原则 (MongoDb/HBase/Redis)
    Eureka保证(AP)原则 (CA原则是MySQL/Oracle/SqlServer)
    Eureka自我保护机制
    如果在15分钟内超过服务节点没有正常的心跳,会认为出现网络故障。
    不会移除因为长时间没收到心跳的服务
    仍然可以接受新服务的注册和查询请求,但不会被同步到其他节点上(既保证当前节点依然可用)
    当网络稳定时,当前实例新的注册信息会被同步到其他节点中
    因此,Eureka可以很好的对应因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个服务注册中心瘫痪。

    -Ribbon负载均衡(理论懂了、实际操作才会很轻松)
    是什么:
    是一套基于Netflix Ribbon的客户端(服务消费者)、负载均衡工具
    我们也很容易使用Ribbon实现自定义的负载均衡算法
    能干吗:
    LB(负载均衡),在微服务或分布式集群中经常用。
    dubbo和springcloud均给提供了负载均衡,
    分为:集中式LB和进程内LB

    初步配置
    Ribbon需要和Eureka整合,所以pom需要引入Eureka
    @LoadBalanced:(默认是轮训算法)//客户端(服务消费者)、负载均衡工具

    负载均衡
    Ribbon在工作时分成两步
    第一步 先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.
    第二步 再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
    其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。


    总结
    Ribbon其实就是一个软负载均衡的客户端组件
    他可以和其他所需请求的客户端结合使用,和eureka结合只是其中一个实例

    核心组件IRule
    Ribbon默认提供了7中算法,如果不满足需求可以自定义算法;

    IRule:根据特定算法中从服务列表中选取一个要访问的服务
    RoundRobinRule轮询
    RandomRule随机
    AvailabilityFilteringRule
    WeightedResponseTimeRule
    ...

    自定义(技术含量高:github改动源码)
    //在启动该微服务的时候就去加载我们的自定义Ribbon配置,是配置生效
    @RibbonClient(name="MICROSERVICECLOUD_DEPT",configuration=MySelfRule.class)
    注意配置细节,创建的MySelfRule文件不能放在主启动类同包下
    定义条件轮询每次调用5次

    -Feign负载均衡
    是什么
    Feign是一个声明式WebService客户端,也支持可插拔式的编码器和解码器,
    Fegign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易
    SpringCloud对Feign进行封装,使其支持SpringMVC注解和HttpMessageConverters
    Feign可以与Eureka和Ribbon组合使用以支持负载均衡

    只需要创建一个借口,然后在上面添加注解即可

    Feign面向接口调用服务,而另一种还是RestTemplate调用方式
    Feign集成了Ribbon
    利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,
    并通过轮询实现客户端的负载均衡,而与Ribbon不同的是,通过feign只需要定义服务绑定接口以声明式的方法更简洁的实现了服务调用


    -Hystrix熔断器/断路器(类似保险丝、微服务系统保护机制)
    服务雪崩,多个微服务之间调用的时候,如果扇出的链路上某个微服务调用时间过长或不可用
    用于对故障延迟和容错进行隔离和管理,以便单个依赖关系失败,不会影响整个应用程序。
    是什么
    Hystrix是一个用于处理分布式系统的延迟和容错的开源库,
    分布式系统中,许多依赖会不可避免的调用失败,如超时或异常,
    Hystrix能够保证在一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统弹性

    “断路器”本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控,
    "向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,"
    这样就保证了服务调用方的线程不会被长时间的占用,使其避免系统故障、雪崩。
    服务熔断
    当某个微服务调用故障或延迟时,会进行服务降级,"进而熔断该节点服务的调用,快速返回错误的响应信息"。
    Hytrix会监控微服务间的调用情况,当失败的调用到一阈值,缺省是5秒内20次调用失败就会启动熔断机制,
    熔断机制的注解是@HystrixCommand。

    熔断是在服务提供方,保障服务安全
    @HystrixCommand(fallbackMethod="processHystrix_Get")报异常后如何处理

    public Dept processHystrix_Get(@PathVariable("id") Long id){
    return new Dept().setDepton(id).setDname("该ID:"+id+"没有对应信息,null-@HystrixCommand")
    .setDb_source("no this database in Mysql");
    }

    @EnableCircuitBreaker//对熔断器的支持

    服务降级
    面向AOP切面、解耦、避免熔断时方法多导致膨胀,直接编写类实现接口
    整体资源快不够了,忍痛将某些服务先关掉,带渡过难关,再开启回来。

    服务降级是在客户端也就是服务消费方

    @HystrixCommand(fallbackMethod="processHystrix_Get")业务和异常解耦、不在一块
    直接对接口实现Hystrix,而不在Controller中添加那么多异常方法
    DpetClientServer接口在注解@FeignClient中添加fallbackFactory属性值

    总结:服务熔断:一般是服务故障或异常引起,当某个异常条件被处罚,直接熔断整个服务,而不是一直等到服务超时。
    服务降级:一般是从整体负荷烤炉,就是某个服务熔断后,服务将不再被调用,
    此时客户端可以自己准备一个本地fallback回调,返回一个缺省值。
    服务监控hystrixDashboard(中文:黑丝锤斯 得是薄得)
    Hystrix提供了“准实时的调用监控ystrixDashboard”可视化监控展示的组件,记录请求信息、
    hystrixDashboard是在客户端:监控服务端的Hystrix

    -zuul路由网关(组务)
    是什么
    Zuul包含请求的路由和过滤两个主要功能。
    路由是实现外部访问的统一入口,将请求转发到具体的微服务上。
    过滤器功能负责对请求效验、服务聚合等。

    Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,也就以后的访问微服务都是通过Zuul跳转后获得。
    Zuul服务最终还是会注册金Eureka

    路由基本配置
    参考脑图!

    路由访问映射规则

    -SpringCloud Config分布式配置中心
    问题
    一套集中式的、动态的配置管理、SpringCloud提供了ConfigServer
    每一个微服务自己带着一个application.yml,上百个配置文件的管理o(╥﹏╥)o。。。
    是什么
    (ConfigServer/ConfigClient)
    服务端:也称为分布式配置中心,"他是一个独立的微服务应用",
    用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息,等访问接口。

    客户端:指定配置中心来管理应用资源,以及与业务相关的配置内容,
    可以通过"Git客户端工具"来管理访问配置内容。

    等干嘛
    集中管理配置文件
    不同环境不同配置,动态化的配置更新,分环境部署
    .....
    .....
    将配置信息以Rest接口的形式暴露

    SpringCloud Config默认使用Git来存储配置文件,而且使用http/https访问形式。

    SpringCloud Config服务端配置与Github通信

    本地创建yml文件git客户端推送到github
    configServer微服务远程连接到github的yml文件

    SpringCloud Config服务端配置与测试

    客户端通过服务端从GitHub中拿数据
    @Configtration

    -总结


    将经验、总结、传授、讲课通俗易懂、授课引导思路

    --------------------------------------------------

    Spring Cloud Alibaba生态及框架核心组件作用:

    服务注册与发现+配置管理-Nacos             (好比Consul/Eureks/zookeeper),实际生产场景一般为:为防止注册中心频繁被请求而宕机,微服务会创建定时任务和创建本地缓存,

    负载均衡-Ribbon

    声明式HTTP客户端-Feign

    服务容错/熔断-Sentinel               (好比Hystrix)

    消息中间件-RocketMQ:服务之间通过异步消息通信实现,(好比Stream)

    API网关-Gateway

    调用链监控(服务链路跟踪)-Sleuth/Zipkin

    分布式事务-Seata

    SpringCloud和SpringCloud Alibaba常用子项目

    Spring Cloud提供查询''服务注册中心注册的所有实例信息''的接口 priavte DiscoveryClient discoveryClient;

    常用有getInstances(name)查询指定微服务的信息/getServices()查询注册了那些微服务

    spring-boot-starter-data-mongodb

    SpringBoot2基于Swagger2生成离线Api文档

    -----------------------------------------------------------------------------
    
    spring boot 1.我理解就是把 spring spring mvc spring data jpa 等等的一些常用的常用的基础框架组合起来,
                  提供默认的配置,然后提供可插拔的设计,就是各种 starter ,来方便开发者使用这一系列的技术。
    
            2.以前需要关注版本兼容和一堆配置整合文件,
              现在可以先不关心如何配置,可以快速的启动开发,进行业务逻辑编写,
                  各种需要的技术,加入 starter 就配置好了,直接使用,可以说追求开箱即用的效果吧。
    
            3.对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,
              另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。
                      
            4.4.0版本是Spring框架最新发布的主版本,并且首次完全支持Java8的功能。你依然可以使用较早的Java版本,但是现在所需的最小的版本已经被提升的Java SE6。
                  同时还利用主版本发布的机会删除了很多废弃的类和方法。
            5.Spring 是一个“引擎”;
              Spring MVC 是基于Spring的一个 MVC 框架;
              Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
    Spring Boot:                
    SpringBoot四大神器之Starter
    
    Spring Boot中Starter是什么
    比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,
    而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依赖。
    
    经过研究,Starter主要用来简化依赖用的。比如我们之前做MVC时要引入日志组件,那么需要去找到log4j的版本,然后引入,
    现在有了Starter之后,直接用这个之后,log4j就自动引入了,也不用关心版本这些问题。
    
    
    
    较新版的Spring Boot取消了@SpringApplicationConfiguration这个注解,用@SpringBootTest就可以了
    
    1、@SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置。;
    2、@Configuration:这是一个配置Spring的配置类;
    3、@Controller:标明这是一个SpringMVC的Controller控制器;
    4、main方法:在main方法中启动一个应用,即:这个应用的入口;
    Spring Boot项目中,启动的方式有两种,
    一种是直接run Java Application
    另外一种是通过Spring Boot的Maven插件运行。在Spring Boot项目中推荐使用@ SpringBootConfiguration替代@Configuration
    @EnableAutoConfiguration:启用自动配置,该注解会使Spring Boot根据项目中依赖的jar包自动配置项目的配置项:
    @ComponentScan:默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。
    
    关闭自动配置
    比如:不想自动配置Redis,想手动配置
    @SpringBootApplication(exclude={RedisAutoConfiguration.class})
    该网站可配置Spring Boot运行字体样式:http://patorjk.com/software/taag/#p=display&h=3&v=3&f=4Max&t=itcast%20Spring%20Boot 
    
    全局配置文件
    SpringBoot使用一个全局的配置文件,application.properties或者是application.yml
    
    pom文件的引用
        Sprint-boot-starter-securityd
        sprint-boot-starter-social-facebook
        sprint-boot-starter-social-linkedin
        sprint-boot-starter-social-twitter
    
        sprint-boot-starter-test      常用的测试框架:Junit,Hamcrest,Mockito,包含Sprint-test模块
        sprint-boot-starter-thymeleaf 对Thymeleaf模板引擎的支持,包含Spring整合的配置
        sprint-boot-starter-velocity  对Velocity模板引擎的支持
        spring-boot-starter-freemarker对Freemarker模板引擎的支持
        sprint-boot-starter-web          对Web项目开发的支持,包含Tomcat和Spring-MVC
        sprint-boot-starter-Tomcat    SprintBoot默认的Servlet容器Tomcat
        sprint-boot-starter-Jetty     使用Jetty作为Servlet容器,替换Tomcat
        sprint-boot-starter-undertow  使用Undertow作为Servlet容器,替换Tomcat
        sprint-boot-starter-logging   SprintBoot默认的日志框架logging
        sprint-boot-starter-log4j     支持使用Log4j日志框架
        sprint-boot-starter-websocket 支持WebSocket开发
        sprint-boot-starter-ws        支持WebService开发
    
    
    Xml配置文件
    SprintBoot提出0配置XML文件,但在实际项目中可能有一些特殊要求必须使用Xml配置
    这时可以通过Spring提供的@ImportResource来加载Xml配置
    例如:@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"})
    
    日志
    SpringBoot可以通过配置来修改默认的日志的配置:
    设置日志级别:logging.level.org.springframework=DEBUG
    格式:logging.level.*=
    
    SprintBoot的自动配置原理
    SpringBoot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件
    将该配置文件中的配置载入到Spring容器。
    
    Maven下载源码
    通过dependency:sources该命令可以下载该项目所有的依赖的包和源码。
    
    举例Redis的自动配置
    //这是条件注解,当存在配置的类的情况下,才会实例化该类
    @ConditionalOnClass({JedisConnection.class,RedisOperations.class,Jedis.class})
    //Redis的配置类
    private final RedisProperties properties
    //配置项的前缀
    @ConfigurationProperties(prefix="spring.redis")
    
    条件注解
        @ConditionalOnBean           当容器里有指定的Bean的条件下
        @ConditionalOnClass          当类路径下有指定的类的条件下。
        @ConditionalOnExpression     基于SpEl表达式作为判断条件。
        @ConditionalOnJava         基于JVM版本作为判断条件
        @ConditionalOnJndi         在JNDI存在的条件下查找指定的位置。
        @ConditionalOnMissingBean     当容器里没有指定Bean的情况下。
        @ConditionalOnMissingClass     当类路径下没有指定的类的条件下。
        @ConditionalOnNotWebApplication 当前项目不是Web项目的的条件下。
        @ConditionalOnProperty         指定的属性是否有指定的值。
        @ConditionalOnResource         类路径是否有指定的值。
        @ConditionalOnSingleCandidate     当指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
        @ConditionalOnWebApplication     当前项目是Web项目的条件下。
        
    SpringBoot的Web开发
    org.springframework.autoconfigure.web.WebMvcAutoConfiguration:web开发的自动配置类
    1.自动配置的ViewResolver
    2.自动配置静态资源
      如果进入SpringMVC的规则为/时,
      SpringBoot的默认静态资源的路径为:spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public
      将静态资源放置到webapp下的static目录中即可通过地址访问
    
    
    自定义消息转化器
    只需要在@Configuration的类中添加消息转化器的@bean加入到spring容器,
    就会被SpringBoot自动加入到容器中。
    
    
    自定义SpringMVC的配置
    有时候我们需要自己配置SpringMVC而不是采用默认,
    比如说增加一个拦截器就的继承WebMvcConfigurerAdapter然后重写父类中的方法进行扩展
    
    
    
    
    8-13
    controlle要和启动入口main、是同级别目录
        @EnableAutoConfiguration 开启自动配置    诶内薄凹凸康菲格瑞神
           @AutoConfigurationPackage自动配置包
           @import 导入自动配置类
        将主配置类(@SpringBootApplication标注的类)的所在包 及 下面所有子包里面的所有组件扫描到Spring容器!!!
    
    部署时:不是生成war包,而是通过Maven Probject中 Deom->Lifecycle->Package运行,jar包生成后在target文件夹
    
    application.yml:修改SpringBoot项目中的默认配置项,如端口、等等
    
    @PropertySource(value = {"classpath:person.properties"}) 加载指定的配置文件、因为yml/properties默认是全局配置
    @ImportResource(locations = {"classpath:beans.xml"})导入Spring的配置文件
    SprintBoot推荐的 ‘导入Spring的配置文件’ 为 通过‘全注解配置类’而不是像之前通过<bean></bean>
    @Configuration和(@Bean) 指明当前类是配置类,来替代Spring配置文件/替代ImportResource()
    
    配置文件的随机数和占位符
    
    SpringBoot默认使用slf4j-api.jar(日志门面)和logback-core.jar/classic.jar(日志实现框架:在log4j基础上升级)
          slf4j-api.jar + slf4j-log412.jar + log4j.jar
    
    
    Web
    xxxxAutoConfiguration:帮我们给容器中自动配置组件
    xxxxProperties:配置类来封装配置文件的内容
    xxxxConfigurer:帮助我们进行扩展配置
    @ConditionalOnxxx:一般都是判断条件、条件注解
    @Enablexxx:一般是开启某项注解支持或服务
    
    SprintBoot对静态资源的默认设置、:webjars/public/resources/static:首页、图标、css/js/img文件。以上都是默认查找位置:一般也可在yml/properties中定义
    
    
    Thymeleaf使用(森么莱夫(坦普雷斯)模板引擎解析)
        五中表达式:
        ${}、变量表达式
        *{}、选择变量表达式
        #{}、消息文字表达式
        @{}、链接url表达式
        ~{}、片段表达式
    
        操作:th:insert/th:replace、     jsp:include    (与之前JSP对比)
            th:each            c:forEach
            th:if            c:if
            th:object        声明变量
            th:attr            任意属性修改
            th:value        修改指定属性默认值
            th:text            修改标签体内容
            th:fragment        声明片段
            th:remove
        行内写法:<div>[[${user}]] / [(${user})]</div>
    
    SprintBoot对SpringMvc的默认配置:
        视图解析器,组合所有的视图解析器,'我们可以自己给"容器"中添加一个视图解析器,自动的将其组合进来'
        静态首页
        静态资源文件夹
        图标
        自动注册了'转换器','格式化器',我们只需要放在"容器"中即可
        自己给容器添加HttpMessageConverter,只需要将自己的组件注册到"容器"中(@Bean,@Component)
        定义错误代码生成规则
        
        @EnableWebMvc:全面接管SpringMVC、SpringBoot的SpringMvc自动配置将全部失效
            原因为:
                //容器中没有这个组件的时候,这个自动配置类才会生效
                @EnableWebMvc将WebMvcConfigrationSupport组件导入进了    
    Restfui-crud
    区域信息解析器:
        设置login.html中英文显示
        链接上的区域信息:点击链接切换国际化/中英文
        登录
    
    
    SpringBoot默认配置如不满意,也可自定义config->配置类更改配置
    
    SpringBoot内置Servlet容器Tomcat不支持JSP,
    如需SpringBoot支持JSP需要使用外部Tomcat、war包方式。
    服务器为什么能启动SpringBoot:是因必须继承'SpringBootServletInitializer'
    
    
    
    8-27
    SpringBoot的数据访问:JDBC/Mybatis/SpringDataJPA/Mongdb/redis/...
    引入了各种xxxTemplate、xxxRepository,来简化对数据访问层的操作
    
    
    
    SpringBoot与缓存
         缓存注解和概念
            Cache        缓存接口
            CacheManager    缓存管理器,管理多个Cache,(cacheName/value缓存名字,key缓存使用的key)
            @Cacheable    方法可被缓存    
            @CacheEvict    清空缓存     (如delete时)
            @CachePut    更新缓存    (如update时)
            @EnableCaching    开启缓存
            keyGenerator    缓存数据时key生成策略    key
            serialize    缓存数据时value序列化策略
    
            unless:否定缓存
            sync:是否使用异步模式
    
        缓存体验步骤:
                1.引入spring-boot-starter-cache
                2.@EnableCaching开启缓存
                3.@Cacheeable(cacheName={"emp"},key="#id",condition="#id>0")
                4.@CachePut()
                缓存中间件:redis memcached/ehcache
        整合redis作为缓存:
            1.引入spring-boot-start-data-redis
            2.application.yml配置Redis连接地址
            3.使用RestTemplate操作redis (RedisTemplate)
                redisTemplate.opsForValue();操作字符串
                redisTemplate.opsForHash();操作hash
                redisTemplate.opsForList();操作list
                redisTemplate.opsForSet();操作set
                redisTemplate.opsForZset();操作有序set
            4.配置缓存、CacheManagerCustomizers
            5.测试使用缓存、切换缓存、CompositeCacheManager
        
    与消息
        整合RabbitMQ
            1.引入spring-boot-starter-amqp
            2.application.xml
            3.测试RabbitMQ
                AmqpAdmin:管理组件
                RabbitTemplate:消息发送处理组件
        
        1.开启监听或接受的注解支持:@EnableRabbit(AMQP)、@EnableJms(JMS)
        2.监听或接受:@RabbitListener(AMQP)、@JmsListener(JMS)
        
        核心概念
            Message(消息):消息头和消息体组成。
            Publisher(消息生产者):向交换器发送消息。
            Exchange(交换器):接受消息生产者发送的消息,
                点对点:direct(默认)
                发布订阅:fanout/topic/headers
            Queue(消息队列):保存消息发送给消费者
            Binding(绑定):用于消息队列和交换器之间的关联
            Connection:网络连接,比如一个TCP
            Channel:信道,多路复用连接中的一条独立的双向数据流通道,复用一条TCP连接。
            Consumer(消费者):从消息队列中取消息的客户端。
            Virtual Host(虚拟主机):独立运行,迷你版RabbitMQ,连接RabbitMQ必须连接虚拟主机。
            Broker:消息代理(服务器)
    
    与检索
        ElasticSearch可以快速的存储、搜索和分析好了数据
        
        安装启动:
        docker run -e ES_JAVA_OPTS="-Xms26m -Xms256m" -d -p 9200:9200 -p 9300:9300 --name ES02 容器DI编号
        
        Elasticsearch:使用JSON数据格式
    
        一个Elasticsearch集群可以包含多个索引,相应的每个索引可以包含多个类型,
        这些不同的类型存储着多个文档,每个文档又有多个属性
        
        整合ElasticSearch
            1.引入Spring-boot-starter-data-elasticsearch
            2.安装Spring-Data对应版本的ElasticSearch
            3.application.yml
            4.Spring Boot自动配置的:ElasticsearchRepository、ElasticsearchTemplate、Client
            5.测试ElasticSearch
    与任务
        异步任务/定时任务/邮件任务
    
        异步任务:@EnableAysnc、@Aysnc,
    
        定时任务:@EnableScheduling、@Scheduling,
              TaskExecutor,TaskScheduler 接口
    
        邮件任务:1.引入Spring-boot-starter-mail
              2.SpringBoot自动配置MailSenderAutoConfiguration
              3.定义MailProperties内容,配置在application.yml中
              4.自动装配JavaMailSender
              5.测试邮件发送
    与安全
        1.引入spring-boot-starter-security
        2.编写配置SpringSecurity的配置类
        3.控制请求的访问权限
        4...
    
    与分布式
        SpringBoot和Zookeeper和Dubbo整合
        1.安装Zookeeper并启动
    
        2.将服务提供者注册到注册中心
          1.引入dubbo-spring-boot-starter和zookerpee客户端工具zkclient    
          2.application.yml:配置dubbo扫描包和注册中心地址
          3.@Service(duboo的@Service):发布服务  @Component加入到容器
        
        3.服务消费者
        1.引入dubbo-spring-boot-starter和zookerpee客户端工具zkclient    
        2.application.yml:配置注册中心地址
        3.@Service(Spring的@Service)@Reference:远程引用服务,调用提供者中的@Service的方法
        4.测试 调用当前消费者中的@Service的方法
    
    与监控管理
        提供了生成环境下的应用监控和管理功能,通过HTTP/JMX/SSH协议操作
        1.引入Spring-boot-starter-actuator
        2.通过http方式访问监控端点
        3.可进行shutdown(Post提交,此端点默认关闭)
            
         监控管理端点:
            autoconfig    所有自动配置信息
            auditevents    审计时间
            beans        所有Bean的信息
            configprops    所有配置属性
            dump        线程状态信息
            env     当前环境信息
            health     应用健康状况
            info     当前应用信息
            metrics     应用的各项指标
            mappings 应用@RequestMapping映射路径
            shutdown 关闭当前应用
            trace    追踪信息
    
    与部署
    
        热部署:引入spring-boot-devtools
    -----------------------------------------------------------------------------
    
        
    SpringCloud微服务
        无分布!不开发
        知识只有质量,没有重量    
    
    -从面试题开始
        什么是微服务?
        微服务之间是如何独立通讯的?
        SpringCloud和Dubbo有哪些区别?
            Restfui API,RPC远程固态调用
        SpringBoot和SpringCloud,谈谈你对他们的理解?
        什么是服务熔断?什么是服务降级
        微服务的优缺点分别是什么?说下你在项目开发中碰到的坑
        你所知道的微服务技术栈有哪些?请举例一二
        eureka和zookeeper都可以提供服务注册于发现的功能,请说说两个的区别?
        ......
        
    
    -微服务概述
        微服务-微服务架构-SpringCloud
        耦合度更低,职责更佳明确
        单体应用:牵一发而动全身
    
        提倡将单一应用程序划分成一组小的服务,每个服务运行在自己独立的进程中。
        服务之间相互配合,服务之间采用通信机制互相沟通(使用HTTP的Restfui API)。
        每个服务都围绕着具体业务构建,并能够被独立部署到生产环境。
        应尽量避免统一的,集中式的服务管理机制,对一个服务而言:可根据业务、适合语言、工具对其构建。
        可以有个轻量级的集中式管理来协调这些服务,可以使用不同语言编写服务,也可以使用不同的数据存储
    
        将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去耦合。
        从技术角度看就是一种小而独立的处理过程,类似进程观念,能够自行单独启动或销毁,拥有自己独立的数据库,一个业务可以连接一个数据库、也可以多个业务连接一个服务库。
    
    
       微服务架构:
        eclipse里面用maven开发的一个一个独立的小moudle,具体使用Springboot开发一个小的模块
        一个一个的服务组装拼接起来,对外提供服务暴露接口
    
       微服务优缺点:
        能使用不同语言开发,
        松耦合,易于维护
        部署灵活,开发效率高
        微服务只是业务逻辑的代码,不会和HTML,CSS或其他界面组件混合
    
        开发要处理分布式系统的复杂性
        所服务运维难度、随着服务的增加、运维的压力也增大
        系统部署依赖、服务间通信成本
        数据一致性、系统集成测试、性能监控......
        
       分布式微服务技术栈:
        微服务条目↓        落地技术↓
        服务开发        SpringBoot Spring SpringMVC
        服务配置与管理        Archaius Diamond
        服务注册与发现        Eureka Consul Zookeeper
        服务调用        Rest RPC gRPC
        服务熔断器        Hystrix Envoy
        负载均衡        Ribbon Nginx
        服务接口调用(客户端工具)Feign
        消息队列        kafka RabbitMQ ActiveMQ
        服务配置中心管理    SpringCloudConfig Chef
        服务路由(API网关)    Zuul    
        服务监控        Zabbix Nagios Metrics Spectator
        全链路追踪        Zipkin Brave Dapper
        服务部署        Docker OpenStack Kubernetes
        数据流操作开发包    SpringCloud Stream(封装与Redis,Rabbit,KafKa等发送接收消息)
        事件消息总线        SpringCloud Bus
        ...
            
           Dubbo5年不再维护、2017年重新维护、使得SpringCloud义军崛起
        就目前而言软件开发、无论前段和后端、都提倡组件化或模块化开发方式、应深入理解组件化和模块化。
        
    -SpringCloud入门概述
        是什么
            SpringCloud分布式微服务下的一战式解决方案,是各个落地技术的集合体,俗称微服务全家桶
            SpringCloud和SpringBoot是什么关系
                1.SpringCloud宏观、SpringBoot微观关注的以一个一个的微服务。医院科室举例依赖关系。
                2.SpringCloud关注全局的微服务协调整理治理框架,他将SpringBoot开发的一个个单体微服务整合并管理起来,
                  为各个微服务之间提供:配置管理、服务发现、断路器路由、微代理、事件总线、全局锁、决策精选、分布式会话等等集成服务。
                3.SpringBoot可以离开SpringCloud独立使用,但SpringCloud离不开SpringBoot,属于依赖关系。
                4.SpringBoot专注快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
            Dubbo与SpringCloud的对比
                    Dubbo        SpringCloud
            服务注册中心    Zookeeper    Spring Cloud Netflix Eureka
            服务调用方式    RPC        Restfui API
            服务监控    Dubbo-monitor    StringBoot Admin
            断路器        不完善        Spring Cloud Netflix Hystrix
            服务网关    无        Spring Cloud Netflix Zuul
            分布式配置    无        Spring Cloud Config
            服务跟踪    无        Spring Cloud Sleuth
            消息总线    无        Spring Cloud Bus
            数据流        无        Spring Cloud Stream
            批量任务    无        Spring Cloud Task
            ......
            Dubbo好比是组装机,而SpringCloud是一体机
            阿里:刘军
                Dubbo之后会积极寻求适配到SpringCloud生态,
                比如作为SpringCloud的二进制通信方案发挥Dubbo性能优势,
                或Dubbo通过模块化以及对http的支持适配到SpringCloud。
                
        能干嘛     
            分布式版本控制配置
            服务注册与发现
            路由
            服务到服务的调用
            负载均衡配置
            断路器
            分布式消息管理
            ......
        去哪下
            SpringCloud官网
        怎么玩
            https://springcloud.cc/SpringCloud中文网
        SpringCloud国内使用情况
            阿里云
    
    -Rest微服务构建案例工程模块
        创建项目:MavevObject 后续新建都是Maven Modle(这才是真正干活的微服务),这都是分布式项目的套路
        Elicpse调成逻辑视图
        引入lombok创建entity实体类序列化,并使用注解方式替代get、set
    
    
    -Eureka服务注册与发现
        是什么
          NetFlix在设计Eureka时准守的就是AP原则
          Eureka是一个基于REST的服务,只需要使用服务的标识符,就可以访问到服务 
          功能类似于dubbo的注册中心,如Zookeeper
          Eureka采用了C-S的设计架构,Eureka Server作为服务注册功能的服务器,是服务注册中心。
          Eureka包含两个组件,Eureka Server和Eureka Client
        三大角色
          Eureka Server提供服务注册和发现
          Service Provider服务提供方将自身服务注册到Eureka,使服务消费方能找到
          Service Consumer服务消费方从Eureka获取注册服务列表,消费提供方所提供的服务
    
        构建步骤
        
        
            
        集群配置
    
    
        作为服务注册中心,Eureka比Zookeeper好在哪里?
          CAP:C一致性、A可用性、P分区容错性
          ACID:A原子性、C一致性、I独立性、D持久性
    
          Zookeeper保证(CP)原则    (MongoDb/HBase/Redis)
          Eureka保证(AP)原则     (CA原则是MySQL/Oracle/SqlServer)
          Eureka自我保护机制
            如果在15分钟内超过服务节点没有正常的心跳,会认为出现网络故障。
            不会移除因为长时间没收到心跳的服务
            仍然可以接受新服务的注册和查询请求,但不会被同步到其他节点上(既保证当前节点依然可用)
            当网络稳定时,当前实例新的注册信息会被同步到其他节点中
          因此,Eureka可以很好的对应因网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个服务注册中心瘫痪。
    
    -Ribbon负载均衡(理论懂了、实际操作才会很轻松)
        是什么:
             是一套基于Netflix Ribbon的客户端(服务消费者)、负载均衡工具    
            我们也很容易使用Ribbon实现自定义的负载均衡算法
        能干吗:
            LB(负载均衡),在微服务或分布式集群中经常用。
            dubbo和springcloud均给提供了负载均衡,
            分为:集中式LB和进程内LB
            
        初步配置
            Ribbon需要和Eureka整合,所以pom需要引入Eureka
            @LoadBalanced:(默认是轮训算法)//客户端(服务消费者)、负载均衡工具
    
        负载均衡
            Ribbon在工作时分成两步
                第一步 先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.
                第二步 再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
                其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。
    
            
            总结
              Ribbon其实就是一个软负载均衡的客户端组件
              他可以和其他所需请求的客户端结合使用,和eureka结合只是其中一个实例
        
        核心组件IRule
            Ribbon默认提供了7中算法,如果不满足需求可以自定义算法;
    
            IRule:根据特定算法中从服务列表中选取一个要访问的服务
                RoundRobinRule轮询
                RandomRule随机
                AvailabilityFilteringRule
                WeightedResponseTimeRule
                ...
    
        自定义(技术含量高:github改动源码)
            //在启动该微服务的时候就去加载我们的自定义Ribbon配置,是配置生效
            @RibbonClient(name="MICROSERVICECLOUD_DEPT",configuration=MySelfRule.class)
            注意配置细节,创建的MySelfRule文件不能放在主启动类同包下
            定义条件轮询每次调用5次
            
    -Feign负载均衡    
          是什么
        Feign是一个声明式WebService客户端,也支持可插拔式的编码器和解码器,
        Fegign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易
        SpringCloud对Feign进行封装,使其支持SpringMVC注解和HttpMessageConverters
        Feign可以与Eureka和Ribbon组合使用以支持负载均衡
    
        只需要创建一个借口,然后在上面添加注解即可    
        
        Feign面向接口调用服务,而另一种还是RestTemplate调用方式
        Feign集成了Ribbon
          利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,
          并通过轮询实现客户端的负载均衡,而与Ribbon不同的是,通过feign只需要定义服务绑定接口以声明式的方法更简洁的实现了服务调用
    
    
    -Hystrix熔断器/断路器(类似保险丝、微服务系统保护机制)
        服务雪崩,多个微服务之间调用的时候,如果扇出的链路上某个微服务调用时间过长或不可用
        用于对故障延迟和容错进行隔离和管理,以便单个依赖关系失败,不会影响整个应用程序。
        是什么
            Hystrix是一个用于处理分布式系统的延迟和容错的开源库,
            分布式系统中,许多依赖会不可避免的调用失败,如超时或异常,
            Hystrix能够保证在一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统弹性
        
            “断路器”本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控,
            "向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,"
            这样就保证了服务调用方的线程不会被长时间的占用,使其避免系统故障、雪崩。
        服务熔断    
            当某个微服务调用故障或延迟时,会进行服务降级,"进而熔断该节点服务的调用,快速返回错误的响应信息"。
            Hytrix会监控微服务间的调用情况,当失败的调用到一阈值,缺省是5秒内20次调用失败就会启动熔断机制,
            熔断机制的注解是@HystrixCommand。
    
            熔断是在服务提供方,保障服务安全
            @HystrixCommand(fallbackMethod="processHystrix_Get")报异常后如何处理
    
            public Dept processHystrix_Get(@PathVariable("id") Long id){
                return new Dept().setDepton(id).setDname("该ID:"+id+"没有对应信息,null-@HystrixCommand")
                .setDb_source("no this database in Mysql");
            }
    
            @EnableCircuitBreaker//对熔断器的支持
    
        服务降级
            面向AOP切面、解耦、避免熔断时方法多导致膨胀,直接编写类实现接口
            整体资源快不够了,忍痛将某些服务先关掉,带渡过难关,再开启回来。
    
            服务降级是在客户端也就是服务消费方
            
            @HystrixCommand(fallbackMethod="processHystrix_Get")业务和异常解耦、不在一块
            直接对接口实现Hystrix,而不在Controller中添加那么多异常方法
            DpetClientServer接口在注解@FeignClient中添加fallbackFactory属性值
            
    
            总结:服务熔断:一般是服务故障或异常引起,当某个异常条件被处罚,直接熔断整个服务,而不是一直等到服务超时。
                  服务降级:一般是从整体负荷烤炉,就是某个服务熔断后,服务将不再被调用,
                          此时客户端可以自己准备一个本地fallback回调,返回一个缺省值。
        服务监控hystrixDashboard(中文:黑丝锤斯 得是薄得)
            Hystrix提供了“准实时的调用监控ystrixDashboard”可视化监控展示的组件,记录请求信息、
            hystrixDashboard是在客户端:监控服务端的Hystrix    
    
    -zuul路由网关(组务)
        是什么
           Zuul包含请求的路由和过滤两个主要功能。
           路由是实现外部访问的统一入口,将请求转发到具体的微服务上。
           过滤器功能负责对请求效验、服务聚合等。
           
           Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,也就以后的访问微服务都是通过Zuul跳转后获得。
           Zuul服务最终还是会注册金Eureka
    
        路由基本配置
           参考脑图!
        
        路由访问映射规则
            
    
    -SpringCloud Config分布式配置中心
        问题
          一套集中式的、动态的配置管理、SpringCloud提供了ConfigServer
          每一个微服务自己带着一个application.yml,上百个配置文件的管理o(╥﹏╥)o。。。
        是什么
            (ConfigServer/ConfigClient)
            服务端:也称为分布式配置中心,"他是一个独立的微服务应用",
                   用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息,等访问接口。
            
            客户端:指定配置中心来管理应用资源,以及与业务相关的配置内容,
                可以通过"Git客户端工具"来管理访问配置内容。
        
        等干嘛
            集中管理配置文件
            不同环境不同配置,动态化的配置更新,分环境部署
            .....
            .....    
            将配置信息以Rest接口的形式暴露    
    
            SpringCloud Config默认使用Git来存储配置文件,而且使用http/https访问形式。
        
        SpringCloud Config服务端配置与Github通信
            
            本地创建yml文件git客户端推送到github
            configServer微服务远程连接到github的yml文件
    
        SpringCloud Config服务端配置与测试
        
            客户端通过服务端从GitHub中拿数据
    @Configtration    
    
    
    
    -总结
    
    
    将经验、总结、传授、讲课通俗易懂、授课引导思路
  • 相关阅读:
    IP分类:A,B,C,D,E五类
    Makefile之“=”、":="、“+=”、“?=”
    Makefile之字符串函数
    Makefile之嵌套执行make
    vi中使用“/”查找字符
    Makefile学习之显示命令与出错命令
    【转】Unity中写GLSL(一)—— 简单的diffuse color
    关于编译GITHUB上的工程
    认识了一个新的手机游戏剖析工具- SnapDragon Profiler
    U3D资料收藏
  • 原文地址:https://www.cnblogs.com/Bkxk/p/9371729.html
Copyright © 2011-2022 走看看