springBoot+springCloud学习笔记
尊重原创:https://www.jianshu.com/p/492dfefa2735
SpringBoot
配置优先级
- 在命令行中传入的参数 如:java -jar storeMs.jar --server.port=8888
- spring_application_json的属性
- java:comp/env中的jndi属性
- Java的系统属性,可以通过System.getProperties()获得的内容。
- 操作系统的环境变量
- 通过random.*配置的随机属性
- 位于当前Jar包之外的 application-{profile}.properties文件
- 位于当前Jar包之内的 application-{profile}.properties文件
- 位于当前Jar包之外的 application.properties文件
- 位于当前Jar包之内的 application.properties文件
- 在@Configuration注解修改的类中,通过@PropertySource注解定义的属性。
- 应用默认属性 使用SpringApplication.setDefaultProperties定义的内容。
了解springboot的配置加载顺序,有助于理解springCloud的远程配置中心实现的原理。
监控功能
- 引入actuator依赖
- 使用相关的端点接口,查看监控的信息
- 监控的三种类:启动时系统配置相关、运行时个项功能的性能监控、系统的操作控制。
SpringCloud
Eureka注册服务中心 三个重要的角色:服务注册中心、服务提供者、服务消费者。
- 单点模式 注册服务中心只有一个。
#指定端口号
server.port=1111
#是否优先使用IP地址作为主机名的标识 默认为false
eureka.instance.preferIpAddress=true
#是否注册到eureka
eureka.client.register-with-eureka=false
#是否从eureka获取注册信息
eureka.client.fetch-registry=false
#eureka服务器的地址(注意:地址最后面的 /eureka/ 这个是固定值)
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
- 高可用模式 服务中心可用将自己作为服务提供者,注册到相关的服务中心去。服务中心可以有多个,集群的方式。
#application-peer1.properties
spring.application.name=eureka-server
server.port=1111
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka/
#application-peer2.properties
spring.application.name=eureka-server
server.port=1112
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
- 在有多个eureka注册服务的情况下,服务提供者需要配置所有的eureka中心
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/
- 服务提供者 可以有多个服务提供者 eureka会将所有的相同名称的服务,做成一个列表的形式,ribbon可以实现负载均衡 获取服务。
spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
server.port=8082[8081]
- 服务消费者 通过@LoadBalanced来负载均衡
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return RestTemplateMgr.getInstance().init().getTemplate();
}
- 服务续约
#发送心跳个server的频率 默认30秒
eureka.instance.lease-renewal-interval-in-seconds=30
#两个心跳之间的时间间隔 超过则将服务摘除。 默认90秒
eureka.instance.lease-expiration-duration-in-seconds=90
- 其他的一些配置 如:服务失效剔除、eureka的自我保护、服务下线等。
# 单机调试的时候 可以关闭保护机制
eureka.server.enable-self-preservation=false
- eureka服务的具体配置信息 可以查看:com.netflix.eureka.EurekaServerConfig 都是以eureka.server开头。
- eureka客户端的具体配置信息 可以查看:org.springframework.cloud.netflix.eureka.EurekaClientConfigBean 都是以eureka.client开头。
- 服务实例类配置信息 可以查看:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 都是以eureka.instance开头。
springCloud Ribbon 客户端负载均衡
- RibbonEurekaAutoConfiguration 自动配置类
- 开启负载均衡的步骤:
- 多个服务提供者,注册到服务中心
- 服务消费者通过调用被@LoadBalanced注解修饰过的restTemplate
- RestTemplate 与 Ribbon整合使用 详解
- RestTemplate 基本使用 GET POST PUT DELETE
- RestTemplate 与 Ribbon 整合
- 重点源码:LoadBalancerClient LoadBalancerAutoConfiguration
springCloud Hystrix 服务容错保护
- HystrixCommand:用在依赖的服务返回单个操作结果的时候
- HystrixObservableCommand:用在依赖的服务返回多个操作结果的时候
- 通过几个注解的方式可以简单使用断路器的功能
#程序启动的地方
@EnableCircuitBreaker
#具体需要断路器的服务方法上
@HystrixCommand(fallbackMethod = "helloFallback", commandKey = "helloKey")
#断路器被触发熔断的回调方法
public String helloFallback() {}
springCloud Feign 声明是服务调用
- 尚未仔细看
springCloud Zuul API网关服务
- Zuul的使用
#在pom.xml引入spring-cloud-starter-zuul
#在application.properties配置
spring.application.name=api-gateway
server.port=5555
#在启动类使用@EnableZuulProxy
- Zuul的主要功能有:
- 请求转发,即路由的功能;与服务治理框架结合,实现自动化的服务实例维护以及负载均衡的路由转发。
- 请求过滤,即可以当做是权限验证。权限校验与微服务业务逻辑解耦。
- 它作为系统的统一入口,屏蔽了系统内部各个服务的细节。
- 传统路由方式
zuul.routes.api-a-url.path=/api-a-url/**
zuul.routes.api-a-url.url=http://localhost:8001/
- 面向服务的路由 使用eureka服务
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=hello-service
zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.serviceId=hello-service
zuul.routes.api-c.path=/ddd/**
zuul.routes.api-c.serviceId=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
- 使用服务名称的方式 不用eureka服务治理
zuul.routes.api-d.path=/ddd/**
zuul.routes.api-d.serviceId=hello
ribbon.eureka.enabled=false
hello.ribbon.listOfServers=http://localhost:8001/,http://localhost:8002/
- Cookie与头信息 为保证请求经过zuul转发后,还保留有Cookie Heads等信息,需要做一些配置:
#通过设置全局参数为空来覆盖默认值
zuul.senstitiveHeaders=
#通过制定路由的参数来配置 有如下两种配置
zuul.routes.<router>.customSensitiveHeaders=true
zuul.routes.<router>.senstiveHeaders=
- 重定向问题 spring security 和 shiro
zuul.addHostHeader=true
SpringCloud 的 Brixton会有重定向问题 Camden Dalston 则没有
- Hystrix和Ribbon支持 尽量使用 path与serviceId对应 即使用面向服务的路由。
- 动态加载/动态路由:原理 将配置放置在git远程仓库,更新仓库的配置文件,调用refresh接口,加载新的配置信息。
#
- 动态过滤器:使用groovy实现。
springCloud Sleuth 分布式服务跟踪
- 整合使用
- 添加pom.xml的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
- 启动eureka服务
- 访问 查看日志 分析日志即可看出链路调用的规则。 [trace-1,7cbdce82c9447510,7667724d864b3ec,false]
trace-1:应用名称 即application.properties中的spring.application.name的值
7cbdce82c9447510:springCloud Sleuth生成的一个ID 称为TraceID 用来标识一条请求链路
7667724d864b3ec:springCloud Sleuth生成的另外一个ID 称为SpanID 表示一个基本的工作单元 比如发送一个HTTP请求。
false:代表该信息是否要被后续的跟踪信息收集器获取和存储。
一条请求链路中 只能包含一个TraceID 可以有多SpanID
- 服务跟踪的实现原理
1.服务框架为每个请求创建唯一的跟踪标识。 一般是在httpHeader里标识
2.统计各个处理单元的时间耗时。 下一个单元开始 上一个单元结束。
3.源码跟踪:org.springframework.cloud.sleuth.Span
public static final String SAMPLED_NAME = "X-B3-Sampled";
public static final String PROCESS_ID_NAME = "X-Process-Id";
public static final String PARENT_ID_NAME = "X-B3-ParentSpanId";
public static final String TRACE_ID_NAME = "X-B3-TraceId";
public static final String SPAN_NAME_NAME = "X-Span-Name";
public static final String SPAN_ID_NAME = "X-B3-SpanId";
public static final String SPAN_EXPORT_NAME = "X-Span-Export";
- Sleuth抽样收集策略
1. 通过Sampler接口实现 默认使用PercentageBasedSampler
@Bean
public AlwaysSampler defaultSampler() {
return new AlwaysSampler();
}
2. 通过配置文件配置
spring.sleuth.sampler.percentage=0.1 #代表获取10%的样例 1代表100%
- 与Logstash整合 收集日志分析
- ELK平台 ElasticSearch/Logstash/Kibana这三个工具。
- 配置logstash对JSON格式日志的支持
- 与Zipkin整合 生产开发中,应该使用这个 附带有图形界面查看链路调用的服务。
- 四大核心组件:
1. Collector:收集器组件,主要处理从外部系统发送过来的信息,将这些信息转换成Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。
2. Storage:存储组件,主要处理收集器收到的信息,默认会将这些信息存储在内存中。可以修改存储的策略,通过使用其他存储组件,将跟踪信息存储到数据库中。
3. Restful API:API组件,童工外部访问接口。
4. WEB UI:UI组件,基于API组件实现的上层应用。方便用户查询、分析跟踪信息。
- Sleuth与Zipkin整合 HTTP方式。
1. 搭建ZipKinServer 服务
<dependencies>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
</dependencies>
2. 为应用引入和配置ZipKin服务
spring.zipkin.base-url=http://localhost:9411
- Sleuth与Zipkin整合 消息中间件收集
1. 为具体应用添加pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2. 配置rabbitmq服务:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=springcloud
spring.rabbitmq.password=123456
3. 修改zipkin-server的pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
- API接口
springboot + elasticsearch全文检索
- Elasticsearch与关系型数据库的比对
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Elasticsearch集群可以包含多个索引(indices)(数据库) ,每一个索引可以包含多个类型(types)(表) ,每一个类型包含多个文档(documents)(行) ,然后每个文档包含多个字段(Fields)(列) 。
- DSL查询(Query DSL) DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现
- 高亮(highlight)匹配
- 短语搜索
- 全文搜索
- 分析 聚合 在数据上生成复杂的分析统计
自动配置类
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties
框架整合
- POM.xml的配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<!-- 添加 spring-data-elasticsearch的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
- application.properties
spring.data.elasticsearch.repositories.enabled=true
spring.data.elasticsearch.properties.path.logs=./elasticsearch/logs
spring.data.elasticsearch.properties.path.data=./elasticsearch/data
#独立服务或者是es集群的时候打开配置 cluster-name 必须与es配置的name一致
#spring.data.elasticsearch.cluster-name: #默认为elasticsearch
#spring.data.elasticsearch.cluster-nodes: IP:port #配置es节点信息,多个用逗号分隔
- 注解说明
- @Document
@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
String indexName();//索引库的名称,一般用项目的名称命名
String type() default "";////类型,一般用实体的名称命名
boolean useServerConfiguration() default false;
short shards() default 5;//默认分区数
short replicas() default 1;//每个分区默认的备份数
String refreshInterval() default "1s";//刷新间隔
String indexStoreType() default "fs";//索引文件存储类型
boolean createIndex() default true;
}
- @Field
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {
FieldType type() default FieldType.Auto;//自动检测属性的类型
FieldIndex index() default FieldIndex.analyzed;//默认情况下分词
DateFormat format() default DateFormat.none;
String pattern() default "";
boolean store() default false;//默认情况下不存储原文
String searchAnalyzer() default "";//指定字段搜索时使用的分词器
String analyzer() default "";//指定字段建立索引时指定的分词器
String[] ignoreFields() default {};//指定需要忽略的字段
boolean includeInParent() default false;
}
springCloud 与 springBoot问题汇总
- zuul 与 eureka 使用的springCloud版本需要对应上,否则容易引起Ribbon的hystrix熔断机制。
作者:IT笨男孩
链接:https://www.jianshu.com/p/492dfefa2735
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
springBoot+springCloud学习笔记的更多相关文章
- SpringCloud学习笔记(2):使用Ribbon负载均衡
简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...
- SpringCloud学习笔记(3):使用Feign实现声明式服务调用
简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...
- SpringCloud学习笔记(4):Hystrix容错机制
简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...
- SpringCloud学习笔记(5):Hystrix Dashboard可视化监控数据
简介 上篇文章中讲了使用Hystrix实现容错,除此之外,Hystrix还提供了近乎实时的监控.本文将介绍如何进行服务监控以及使用Hystrix Dashboard来让监控数据图形化. 项目介绍 sc ...
- SpringCloud学习笔记(6):使用Zuul构建服务网关
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...
- SpringCloud学习笔记(7):使用Spring Cloud Config配置中心
简介 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持,服务器端统一管理所有配置文件,客户端在启动时从服务端获取配置信息.服务器端有多种配置方式,如将配置文件 ...
- SpringCloud学习笔记:服务支撑组件
SpringCloud学习笔记:服务支撑组件 服务支撑组件 在微服务的演进过程中,为了最大化利用微服务的优势,保障系统的高可用性,需要通过一些服务支撑组件来协助服务间有效的协作.各个服务支撑组件的原理 ...
- SpringBoot + Security学习笔记
SpringSecurity学习笔记 本以为是总结,最后写成了笔记,所以还是需要更加的努力啊. 开始的时候看了一遍官方文档,然后只看懂了加密器. 然后又学了一个尚硅谷的视频,虽然这个教程是在讲一个项目 ...
- SpringBoot 完整学习笔记免费分享
从0到进阶,完全系统性的学习笔记 每次我都会反复拿来观看,因为我们总会有遗漏忘记的地方,但是笔记不会. 希望大家能好好利用它,以下是笔记截图! 以上只是其中的一项部分,这份笔记可以说含金量超高,绝对会 ...
随机推荐
- React+dva.js+typescript实现百度贴吧移动web端
个人练习作品,有bug欢迎在github上提:) github地址:https://github.com/axel10/react-tieba 整个项目中实现起来最麻烦的应该算是滚动位置记忆和路由动画 ...
- servlet方法
1.每一个Servlet都必须要实现Servlet接口,GenericServlet是个通用的.不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于Generi ...
- POJ 1274 The Perfect Stall (二分图匹配)
[题目链接] http://poj.org/problem?id=1274 [题目大意] 给出一些奶牛和他们喜欢的草棚,一个草棚只能待一只奶牛, 问最多可以满足几头奶牛 [题解] 奶牛和喜欢的草棚连线 ...
- [CP1804]组合数问题2
题目大意: 给定两个数$n(n\le10^6)$和$k(k\le10^5)$,找到$k$个不同的满足$0\le b\le a\le n$的组合数$\binom a b$,求这$k$个组合数的最大值. ...
- [51Nod1487]占领资源
题目大意: 有一个$n\times m(x,m\leq 100)$的网格图,每个格子有一个权值$w_{i,j}(1\leq w_{i,j}\leq 9)$.你可以在图中选两个格子,每个格子$(x,y ...
- MSSQL收缩事务日志&日志文件过大无法收缩
原文:MSSQL收缩事务日志&日志文件过大无法收缩 一.MS SQL SERVER 2005 --1.清空日志 exec('DUMP TRANSACTION 数据库名 WITH NO_LOG' ...
- linux命令行翻页
在linux上面执行命令,若命令太多屏幕显示不完,通过Shift+pageup/pageDown来查看. putty连接linux后执行就不存在这个问题.
- 在React组件unmounted之后setState的报错处理
最近在做项目的时候遇到一个问题,在 react 组件 unmounted 之后 setState 会报错.我们先来看个例子, 重现一下问题: class Welcome extends Compone ...
- tiny4412 串口驱动分析五 --- LDD3上TTY驱动程序源码
关于tty这部分请参考: <Linux设备驱动开发详解 第二版>第14章 Linux终端设备驱动 <精通Linux设备驱动程序开发>第6章 串行设备驱动程序 <Linux ...
- 【Maven】1.使用myecplise配置自己的Maven配置,不使用默认的maven
[好文章]参考地址: http://www.cnblogs.com/luotaoyeah/p/3764533.html ---------------------------------------- ...