SpringBoot
四大特性
1. auto-configuration
2. starters
4. cli
5. actuator
nacos
帮助快速实现动态服务发现、服务配置、服务元数据及流量管理 文档
服务注册
- nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.enabled 默认为true标识开启状态 - 领域模型
- namespace 命名空间可以作为环境隔离,如开发环境和生产环境的隔离
- group 分组,默认的分组为DEFAULT_GROUP
- cluster 集群,可以用来做区域集群标记
- instance 服务实例,每个服务都对应着自己的元数据信息,可以用来做定制化的业务开发,如版本号区别
- NacosDiscoveryClient
提供了一些查询nacos server中注册服务信息的api,可以结合ribbon开发基于nacos自定义的负载均衡策略
配置中心
1. 新建bootstrap.yml文件
2. nacos控制台创建配置文件dataid格式为${name}-${active_profile}.${file-extension}
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
application:
name: sca-content-center
profiles:
active: dev
3. 在指定的配置类上加入@RefreshScope注解
ribbon
负载均衡,spring-cloud-rabbion是基于netflix开发的组件,主要又以下几种策略
- AvailabilityFilteringRule 简单理解就是选用所有状态正常的服务
- BestAvailableRule 选择一个响应时间最小的
- RandomRule 随机选择一个服务
- RoundRobinRule 轮询规则
- RetryRule 重试规则,当选择的服务不能使用则会一直重试,具体是什么规则可以设置除了RetryRule以外的策略,默认是RoundRobinRule
- WeightedResponseTimeRule 根据响应时间设置权重规则,响应时间越长权重越小
- ZoneAvoidanceRule 默认选项 这是一种根据服务提供者所在Zone的性能以及服务提供者可用性综合计算,选择提供者节点的负载均衡规则,如果没有配置zone,则类似RoundRobinRule规则
细粒度配置
- 使用@RibbonClient(name = "${application-name}", configuration = XXXConfiguration.class)
可以为指定的服务配置负载均衡策略 - 使用yml配置方式
application-name:
ribbon:
NFLoadBalancerRuleClassNameL: com.netflix.loadbalancer.RandomRule
RibbonClient使用的配置类XXXConfiguration,一定要放在main程序包外,否则的就会是全局配置,这是因为spring父子上下文导致的、
类似的feign也有同样的问题
全局配置
- @RibbonClients(defaultConfiguration = XXXConfiguration.class)
拓展nacos
nacos可以结合ribbon定义更加适合自己业务(Nacos权重,同一集群优先调用,基于元数据的版本控制)的负载均衡策略,需要使用nacos客户端提供的NacosDiscoveryClient以及ribbon的AbstractLoadBalancerRule
接口。
feign
声明式服务调用,可以代替RestTemplate的硬编码。
组成
- Feign.Builder Feign的入口
- Client feign底层用什么请求,可以和dibbon配合使用
- Contract 契约注解支持,默认SpringMvcContract
- Encoder 编码器,用于将对象转换成消息体 默认SpringEncoder
- Decoder 解码器,将响应消息体转换成对象,默认ResponseEntityDecoder
- Logger 日志管理器
- RequestInterceptor 该接口用于为每个请求添加通用逻辑
配置项
- Logger.Level 日志级别
- Retryer 指定重试策略
- ErrorDecoder 指定错误解码器
- Request.Options 超时时间
- Collection
拦截器 - SetterFactory
属性配置
feign.client.config:
<feignName>:
loggerLevel: full
connectTimeout: 5000
readTimeout: 5000
requestInterceptors:
- com.example.XXXRequestInterceptor
日志级别
- NONE
- BASIC 默认,线上使用
- INFO 开发调试使用
- FULL
feign的全局配置以及细粒度配置也有类似ribbon的问题,需要将XXXFeignConfiguration配置类放在main包以外
非nacos注册服务使用
@FeignClient(name = "xxx", url = "https://xxxx")
性能优化
为线程池指定配置参数优化线程池
feign:
client:
config:
sca-content-center:
loggerLevel: full
httpclient:
connection-timeout: 2000
enabled: true
max-connections: 200
max-connections-per-route: 20
sentinel
是一套从流量控制、熔断降级、系统负载保护等多个维度保护服务稳定性的容错框架,可以脱离spring使用,提供了api供普通java应用程序使用。
和hystrix相比,hystrix使用的是线程进行熔断处理,而sentinel是从并发数或者响应时间来进行流控处理的,这样的好处在于避免了线程切换的开销性能更优,文档
核心API
1. SphU.entry(resourceName) 定义资源名
2. Tracer.traceEntry(ex, entry)
3. ContextUtil 获取上下文工具,可以进行上下文切换
SpringBoot集成
使用@SentinelResources注解可以和SpringBoot集成,@SentinelResource(blockHandler = "blockHandlerMethod"),blockHandler指定的方法需要和注解修饰的方法
具有相同的返回值以及参数,唯一不同的是blockHandlerMethod可以额外增加一个异常参数
规则
- 流量控制规则
- 熔断降级规则
- 系统保护规则
- 访问控制规则
- 热点规则
配置持久化
- 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
- 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
配置方式,拉模式可以从Sentinel-控制台(集群流控管理)#规则配置找到,
至于推模式修改过于复杂,可以从Sentinel-Dashboard-Nacos结合289464
修改
sleuth zipkin
微服务调用链路跟踪
spring:
sleuth:
sampler:
# 过滤推送的日志,1代表100%全部推送
probability: 1
zipken:
base-url: http://localhost:9411/
discover-client-enable: false