springBoot+springCloud学习笔记
本文内容纲要:
-尊重原创:https://www.jianshu.com/p/492dfefa2735
-SpringBoot
-配置优先级
-监控功能
-SpringCloud
-Eureka注册服务中心三个重要的角色:服务注册中心、服务提供者、服务消费者。
-springCloudRibbon客户端负载均衡
-springCloudHystrix服务容错保护
-springCloudFeign声明是服务调用
-springCloudZuulAPI网关服务
-springCloudSleuth分布式服务跟踪
-springboot+elasticsearch全文检索
-自动配置类
-框架整合
-springCloud与springBoot问题汇总
尊重原创:https://www.jianshu.com/p/492dfefa2735
SpringBoot
配置优先级
- 在命令行中传入的参数如:java-jarstoreMs.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=1112eureka.instance.hostname=peer2eureka.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 RestTemplaterestTemplate(){ returnRestTemplateMgr.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开头。
springCloudRibbon客户端负载均衡
- RibbonEurekaAutoConfiguration自动配置类
- 开启负载均衡的步骤:
- 多个服务提供者,注册到服务中心
- 服务消费者通过调用被@LoadBalanced注解修饰过的restTemplate
- RestTemplate与Ribbon整合使用详解
- RestTemplate基本使用GETPOSTPUTDELETE
- RestTemplate与Ribbon整合
- 重点源码:LoadBalancerClientLoadBalancerAutoConfiguration
springCloudHystrix服务容错保护
-
HystrixCommand:用在依赖的服务返回单个操作结果的时候
-
HystrixObservableCommand:用在依赖的服务返回多个操作结果的时候
-
通过几个注解的方式可以简单使用断路器的功能
#程序启动的地方 @EnableCircuitBreaker #具体需要断路器的服务方法上 @HystrixCommand(fallbackMethod="helloFallback",commandKey="helloKey") #断路器被触发熔断的回调方法publicStringhelloFallback(){}
springCloudFeign声明是服务调用
- 尚未仔细看
springCloudZuulAPI网关服务
-
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转发后,还保留有CookieHeads等信息,需要做一些配置:
#通过设置全局参数为空来覆盖默认值 zuul.senstitiveHeaders= #通过制定路由的参数来配置有如下两种配置 zuul.routes.
.customSensitiveHeaders=true zuul.routes. .senstiveHeaders= -
重定向问题springsecurity和shiro
zuul.addHostHeader=true
SpringCloud的Brixton会有重定向问题CamdenDalston则没有
-
Hystrix和Ribbon支持尽量使用path与serviceId对应即使用面向服务的路由。
-
动态加载/动态路由:原理将配置放置在git远程仓库,更新仓库的配置文件,调用refresh接口,加载新的配置信息。
-
动态过滤器:使用groovy实现。
springCloudSleuth分布式服务跟踪
- 整合使用
-
添加pom.xml的依赖
org.springframework.cloud spring-cloud-starter-sleuth -
启动eureka服务
-
访问查看日志分析日志即可看出链路调用的规则。[trace-1,7cbdce82c9447510,7667724d864b3ec,false]
trace-1:应用名称即application.properties中的spring.application.name的值7cbdce82c9447510:springCloudSleuth生成的一个ID称为TraceID用来标识一条请求链路7667724d864b3ec:springCloudSleuth生成的另外一个ID称为SpanID表示一个基本的工作单元比如发送一个HTTP请求。false:代表该信息是否要被后续的跟踪信息收集器获取和存储。一条请求链路中只能包含一个TraceID可以有多SpanID
-
服务跟踪的实现原理
1.服务框架为每个请求创建唯一的跟踪标识。一般是在httpHeader里标识 2.统计各个处理单元的时间耗时。下一个单元开始上一个单元结束。 3.源码跟踪:org.springframework.cloud.sleuth.Span publicstaticfinalStringSAMPLED_NAME="X-B3-Sampled";publicstaticfinalStringPROCESS_ID_NAME="X-Process-Id";publicstaticfinalStringPARENT_ID_NAME="X-B3-ParentSpanId";publicstaticfinalStringTRACE_ID_NAME="X-B3-TraceId";publicstaticfinalStringSPAN_NAME_NAME="X-Span-Name";publicstaticfinalStringSPAN_ID_NAME="X-B3-SpanId";publicstaticfinalStringSPAN_EXPORT_NAME="X-Span-Export";
-
Sleuth抽样收集策略
- 通过Sampler接口实现默认使用PercentageBasedSampler @Bean publicAlwaysSamplerdefaultSampler(){returnnewAlwaysSampler();}2.通过配置文件配置spring.sleuth.sampler.percentage=0.1#代表获取10%的样例1代表100%
-
与Logstash整合收集日志分析
- ELK平台ElasticSearch/Logstash/Kibana这三个工具。
- 配置logstash对JSON格式日志的支持
- 与Zipkin整合生产开发中,应该使用这个附带有图形界面查看链路调用的服务。
-
四大核心组件:
- Collector:收集器组件,主要处理从外部系统发送过来的信息,将这些信息转换成Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。
- Storage:存储组件,主要处理收集器收到的信息,默认会将这些信息存储在内存中。可以修改存储的策略,通过使用其他存储组件,将跟踪信息存储到数据库中。
- RestfulAPI:API组件,童工外部访问接口。
- WEBUI:UI组件,基于API组件实现的上层应用。方便用户查询、分析跟踪信息。
-
Sleuth与Zipkin整合HTTP方式。
- 搭建ZipKinServer服务
io.zipkin.java zipkin-server io.zipkin.java zipkin-autoconfigure-ui
- 搭建ZipKinServer服务
-
Sleuth与Zipkin整合消息中间件收集
- 为具体应用添加pom依赖:
org.springframework.cloud spring-cloud-sleuth-stream 2.配置rabbitmq服务:spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=springcloudspring.rabbitmq.password=1234563.修改zipkin-server的pom依赖:org.springframework.cloud spring-cloud-starter-stream-rabbit org.springframework.cloud spring-cloud-sleuth-zipkin-stream org.springframework.cloud spring-cloud-starter-stream-rabbit io.zipkin.java zipkin-autoconfigure-ui
- 为具体应用添加pom依赖:
- API接口
springboot+elasticsearch全文检索
-
Elasticsearch与关系型数据库的比对
RelationalDB->Databases->Tables->Rows->Columns Elasticsearch->Indices->Types->Documents->Fields
Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
- DSL查询(QueryDSL)DSL(DomainSpecificLanguage特定领域语言)以JSON请求体的形式出现
- 高亮(highlight)匹配
- 短语搜索
- 全文搜索
- 分析聚合在数据上生成复杂的分析统计
自动配置类
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties
框架整合
-
POM.xml的配置
org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE org.springframework.boot spring-boot-starter-data-elasticsearch org.springframework.boot spring-boot-starter-test com.sun.jna jna 3.0.9 -
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@interfaceDocument{StringindexName();//索引库的名称,一般用项目的名称命名Stringtype()default"";////类型,一般用实体的名称命名booleanuseServerConfiguration()defaultfalse;shortshards()default5;//默认分区数shortreplicas()default1;//每个分区默认的备份数StringrefreshInterval()default"1s";//刷新间隔StringindexStoreType()default"fs";//索引文件存储类型booleancreateIndex()defaulttrue;}
-
@Field
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @Documented @Inherited public@interfaceField{FieldTypetype()defaultFieldType.Auto;//自动检测属性的类型FieldIndexindex()defaultFieldIndex.analyzed;//默认情况下分词DateFormatformat()defaultDateFormat.none;Stringpattern()default"";booleanstore()defaultfalse;//默认情况下不存储原文StringsearchAnalyzer()default"";//指定字段搜索时使用的分词器Stringanalyzer()default"";//指定字段建立索引时指定的分词器String[]ignoreFields()default{};//指定需要忽略的字段booleanincludeInParent()defaultfalse;}
springCloud与springBoot问题汇总
- zuul与eureka使用的springCloud版本需要对应上,否则容易引起Ribbon的hystrix熔断机制。
作者:IT笨男孩
链接:https://www.jianshu.com/p/492dfefa2735
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本文内容总结:尊重原创:https://www.jianshu.com/p/492dfefa2735,SpringBoot,配置优先级,监控功能,SpringCloud,Eureka注册服务中心三个重要的角色:服务注册中心、服务提供者、服务消费者。,springCloudRibbon客户端负载均衡,springCloudHystrix服务容错保护,springCloudFeign声明是服务调用,springCloudZuulAPI网关服务,springCloudSleuth分布式服务跟踪,springboot+elasticsearch全文检索,自动配置类,框架整合,springCloud与springBoot问题汇总,
原文链接:https://www.cnblogs.com/xiaohouzai/p/8981082.html