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    



-总结


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

 

posted @ 2018-07-26 14:46  Bk小凯笔记  阅读(515)  评论(0编辑  收藏  举报