尊重原创: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 自动配置类
  • 开启负载均衡的步骤:
  1. 多个服务提供者,注册到服务中心
  2. 服务消费者通过调用被@LoadBalanced注解修饰过的restTemplate
  • RestTemplate 与 Ribbon整合使用 详解
  1. RestTemplate 基本使用 GET POST PUT DELETE
  2. RestTemplate 与 Ribbon 整合
  3. 重点源码: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的主要功能有:
  1. 请求转发,即路由的功能;与服务治理框架结合,实现自动化的服务实例维护以及负载均衡的路由转发。
  2. 请求过滤,即可以当做是权限验证。权限校验与微服务业务逻辑解耦。
  3. 它作为系统的统一入口,屏蔽了系统内部各个服务的细节。
  • 传统路由方式
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 分布式服务跟踪

  • 整合使用
  1. 添加pom.xml的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
  1. 启动eureka服务
  2. 访问 查看日志 分析日志即可看出链路调用的规则。 [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. 服务跟踪的实现原理
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整合 收集日志分析
  1. ELK平台 ElasticSearch/Logstash/Kibana这三个工具。
  2. 配置logstash对JSON格式日志的支持
  • 与Zipkin整合 生产开发中,应该使用这个 附带有图形界面查看链路调用的服务。
  1. 四大核心组件:
1. Collector:收集器组件,主要处理从外部系统发送过来的信息,将这些信息转换成Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。
2. Storage:存储组件,主要处理收集器收到的信息,默认会将这些信息存储在内存中。可以修改存储的策略,通过使用其他存储组件,将跟踪信息存储到数据库中。
3. Restful API:API组件,童工外部访问接口。
4. WEB UI:UI组件,基于API组件实现的上层应用。方便用户查询、分析跟踪信息。
  1. 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
  1. 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节点信息,多个用逗号分隔
  • 注解说明
  1. @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;
}
  1. @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学习笔记的更多相关文章

  1. SpringCloud学习笔记(2):使用Ribbon负载均衡

    简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...

  2. SpringCloud学习笔记(3):使用Feign实现声明式服务调用

    简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...

  3. SpringCloud学习笔记(4):Hystrix容错机制

    简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...

  4. SpringCloud学习笔记(5):Hystrix Dashboard可视化监控数据

    简介 上篇文章中讲了使用Hystrix实现容错,除此之外,Hystrix还提供了近乎实时的监控.本文将介绍如何进行服务监控以及使用Hystrix Dashboard来让监控数据图形化. 项目介绍 sc ...

  5. SpringCloud学习笔记(6):使用Zuul构建服务网关

    简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...

  6. SpringCloud学习笔记(7):使用Spring Cloud Config配置中心

    简介 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持,服务器端统一管理所有配置文件,客户端在启动时从服务端获取配置信息.服务器端有多种配置方式,如将配置文件 ...

  7. SpringCloud学习笔记:服务支撑组件

    SpringCloud学习笔记:服务支撑组件 服务支撑组件 在微服务的演进过程中,为了最大化利用微服务的优势,保障系统的高可用性,需要通过一些服务支撑组件来协助服务间有效的协作.各个服务支撑组件的原理 ...

  8. SpringBoot + Security学习笔记

    SpringSecurity学习笔记 本以为是总结,最后写成了笔记,所以还是需要更加的努力啊. 开始的时候看了一遍官方文档,然后只看懂了加密器. 然后又学了一个尚硅谷的视频,虽然这个教程是在讲一个项目 ...

  9. SpringBoot 完整学习笔记免费分享

    从0到进阶,完全系统性的学习笔记 每次我都会反复拿来观看,因为我们总会有遗漏忘记的地方,但是笔记不会. 希望大家能好好利用它,以下是笔记截图! 以上只是其中的一项部分,这份笔记可以说含金量超高,绝对会 ...

随机推荐

  1. jcl sort comp3 to 表示型

    Lets say your packed data is at 10th column and is of length 6, S9(4)V99 You could try the following ...

  2. [BZOJ 2547] 玩具兵

    Link: BZOJ 2547 传送门 Solution: 很容易通过解可行性的单调性想到二分答案,接下来考虑如何验证解 发现一个很奇妙的条件:步兵和骑兵的个数相同 因此交换位置时不用考虑可行性,保证 ...

  3. 洛谷 P3804 后缀自动机

    题目描述 给定一个只包含小写字母的字符串SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SS 输出 ...

  4. 【bzoj2190】【仪仗队】欧拉函数+线性筛(浅尝ACM-J)

    向大(hei)佬(e)势力学(di)习(tou) Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪 ...

  5. Ubuntu 16.04没有/etc/default/rcS文件的UTC设置选项的问题解决

    继续上一篇文章介绍了CentOS的时钟设置:http://www.cnblogs.com/EasonJim/p/8111747.html,大致的知道了BIOS在Linux的时区设置. 而现在关心的问题 ...

  6. Winform打砖块游戏制作step by step第7节---碰撞检测

    一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 预备知识,无GDI画图基础的童鞋请先阅读一篇文章让你彻底弄懂WinFor ...

  7. rabbitmq集群节点操作

    节点恢复过程中把数据删掉很重要,恢复一单结点,再清数据 节点增加: 1. rabbitmq-server -detached   --- .erlang.cooike的权限,400 属主rabbitm ...

  8. 使用nvDXT.exe把图片转换成dds图片【转】

    从nvidia官网下载工具包DDS Utilities [https://developer.nvidia.com/legacy-texture-tools] 转换图片格式需要的工具是 nvdxt.e ...

  9. Oracle数据库实现获取前几条数据的方法

    如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的SELECT TOP N的方法.本文将告诉您答案,举例说明了哟!   1.在Oracle中实现SELECT TOP N : ...

  10. SQL Script for read information from a csv file in FTP Server

    DECLARE w_file_path VARCHAR2(4000) := 'XXIF_INPUT'; --all_directories.directory_name w_file_name VAR ...