首页 文章资讯内容详情

springBoot+springCloud学习笔记

2026-06-01 4 花语

本文内容纲要:

-尊重原创: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.cloudspring-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.javazipkin-serverio.zipkin.javazipkin-autoconfigure-ui2.为应用引入和配置ZipKin服务spring.zipkin.base-url=http://localhost:9411

Sleuth与Zipkin整合消息中间件收集

为具体应用添加pom依赖: org.springframework.cloudspring-cloud-sleuth-streamorg.springframework.cloudspring-cloud-starter-stream-rabbit2.配置rabbitmq服务:spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=springcloudspring.rabbitmq.password=1234563.修改zipkin-server的pom依赖:org.springframework.cloudspring-cloud-sleuth-zipkin-streamorg.springframework.cloudspring-cloud-starter-stream-rabbitio.zipkin.javazipkin-autoconfigure-ui 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.bootspring-boot-starter-parent1.5.2.RELEASEorg.springframework.bootspring-boot-starter-data-elasticsearchorg.springframework.bootspring-boot-starter-testcom.sun.jnajna3.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