SpringCloud
SpringCloud
神奇海螺注册中心
nacos注册中心
安装:下载安装包
启动:(windows下)
startup.cmd -m standalone 单机版启动
依赖:
nacos启动器
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置:
spring.cloud.nacos.discovery.server-addr=localhost:8848 指定注册中心地址,向注册中心注册
spring.application.name: order 指定应用名称
高级特性:
就近集群策略:
spring.cloud.nacos.discovery.cluster-name: sh 配置服务所属集群
spring.cloud.loadbalancer.nacos.enabled: true 集成nacos的负载均衡算法
权重策略:
配置权重值使更大权重值更能被随机到
spring.cloud.nacos.discovery.weight: 20 配置权重
环境隔离:
spring.cloud.nacos.discovery.namespace: dev 配置命名空间
spring.cloud.nacos.discovery.group: group01 配置组
实例类型:
非临时实例:
nacos会定时发送心跳包检测是否存活,但不会在列表中剔除服务,处于下线状态不参与负载均衡
spring.cloud.nacos.discovery.ephemeral: false
临时实例:
服务实例会定时发送心跳包检测是否存活
spring.cloud.nacos.discovery.ephemeral: true
配置中心
nacos配置中心:
依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置:
spring.cloud.nacos.config.server-addr: localhost:8848 指定配置中心地址
spring.config.import: -nacos:userservice.yml 指定读取配置的名称
热更新:
@RefreshScope 热更新,配置中心属性变化,服务自动拉取最新配置
配置项优先级:
1.nacos配置高于本地
2.nacos同名时最终声明者优先
负载均衡
springcloud的负载均衡组件:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
@LoadBalanced 赋予负载均衡能力(默认轮询)
配置负载均衡算法:
package com.server.order.config;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
public class CustomLoadBalancerConfiguration {
/**
* @param environment: 用于获取环境属性配置,其中LoadBalancerClientFactory.PROPERTY_NAME表示该负载均衡器要应用的服务名称。
* @param loadBalancerClientFactory: 是Spring Cloud中用于创建负载均衡器的工厂类,通过getLazyProvider方法获取ServiceInstanceListSupplier对象,以提供可用的服务列表。
* ServiceInstanceListSupplier:用于提供ServiceInstance列表的接口,可以从DiscoveryClient或者其他注册中心中获取可用的服务实例列表。
* @return
*/
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}
配置使用负载均衡算法:
@LoadBalancerClients(value = {
@LoadBalancerClient(name = "spzx-cloud-user" , configuration = CustomLoadBalancerConfiguration.class) // 将负载均衡算法应用到指定的服务提供方中
})
网关
GateWay:
路由:由id,uri,一系列断言和过滤器组成,人格断言为true则匹配该路由
断言:有十几种断言,开发人员可以匹配http请求中的所有内容
过滤器:在之前和之后执行些额外操作
导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置:
spring.cloud.gateway.routes:
- id: spring-cloud-order //配置路由id
uri: lb://spring-cloud-order //配置路由地址
predicates: //路径断言
- Path=/*/order/** //配置断言拦截
- id: spring-cloud-user
uri: lb://spring-cloud-user
predicates:
- Path=/*/user/**
spring.cloud.gateway.discovery.locator.enabled: true //路径中可以通过服务名称从注册中心找到服务实例进行调用
断言:
After 指定时间之后
Before 指定时间之前
Between 指定时间之间
Cookie 携带指定cookie
Header 携带指定头信息
Host 指定主机访问
Method 指定访问方式
Path 路径断言
Query 参数断言
RemoteAddr 指定ip范围,如192.168.1.1/16
路由过滤器:
spring.cloud.gateway.routes.filters=过滤器名称
默认过滤器:
spring.cloud.gateway.default-filters=过滤器名称
全局过滤器:
1.实现GlobalFilter接口
2.重写filter方法
3.将该类纳入到spring容器
4.实现Ordered接口定义该过滤器的顺序
执行顺序:
order一致时,globalFilter>defaultFilter>路由过滤器
服务监控
远程调用
RestTemplate模板类(不推荐使用) 远程调用模板类,其中的模板方法实现远程调用
使用:
为RestTemplate注册Bean
问题:
维护性差(硬编码)
缺少负载均衡机制
OpenFegin远程调用组件(推荐)
依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
声明使用:
@EnableFeignClients 启用OpenFeign
@FeignClient("spring-cloud-user") 声明当前类为OpenFeign,指定远程调用的服务名称
@GetMapping/PostMapping/PutMapping/DeleteMapping/RequestMapping 设置远程调用接口
日志:
feign.Logger.Level 修改日志级别,包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder 响应结果的解析器,http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder 请求参数编码,将请求参数编码,便于通过http请求发送
feign.Contract 支持的注解格式,默认是SpringMVC的注解
feign.Retryer 失败重试机制,请求失败的重试机制,默认是没有,不过会使用Ribbon的重试
超时时间:
spring.cloud.openfeign.client.config.default.read-timeout: 2000 读取数据超时时间,默认60000毫秒
spring.cloud.openfeign.client.config.default.connect-timeout: 2000 请求连接超时时间,默认10000毫秒
重试机制:
自定义重试器
package com.server.order.config;
import feign.RetryableException;
import feign.Retryer;
public class FeignClientRetryer implements Retryer {
// 定义两个成员变量来决定重试次数
private int start = 1 ;
private int end = 3 ;
@Override
public void continueOrPropagate(RetryableException e) {
if(start >= end) {
throw new RuntimeException(e) ;
}
start++ ;
}
@Override
public Retryer clone() { // 框架底层调用该方法得到一个重试器
return new FeignClientRetryer();
}
}
配置重试器
spring.cloud.openfeign.client.config.default.retryer: com.server.order.config.FeignClientRetryer
服务降级熔断
sentinel 流量控制,流量监控,降级处理,熔断处理
依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
安装:
下载sentinel的jar包,他是由springboot开发,直接使用java -jar启动
整合配置:
spring.cloud.sentinel.transport.dashboard: localhost:8080 配置sentinel的控制台地址
spring.cloud.sentinel.web-context-unify: false 关闭context整合
特殊:Jmeter 压力测试工具,Apache基于java开发的
流量控制:
流控模式-直接:当需要流控时直接返回预设结果
流控模式-关联:当关联资源需要流控时限流当前资源
流控模式-链路:统计链路的请求数量,超过阈值时,这条链路的请求将被限流
@SentinelResource("名称") 声明当前为Sentinel资源
流控效果-预热:对超出阈值的请求同样拒绝并抛出异常,但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值
流控效果-排队:让所有请求按照先后次序进入到一个队列中进行排队,当某个请求最大的等待时间超尴尬时,拒绝并抛出异常
热点参数限流:根据资源的参数进行限流,例如传递的id,可以设置当id为2时的阈值,id为3时的阈值,和一个默认情况下的阈值
系统规则: 对所有资源进行限流,有多种模式可以选择LOAD,RT,线程数,入口QPS,cpu使用率
熔断规则: 熔断时间到达后放行一个请求,不满足熔断规则时,正常访问,满足熔断规则时继续熔断
慢调用比例:统计时长 内,最小请求数 中,超过 最大RT 的比例 达到 比例阈值 时 熔断预设的熔断时长
异常比例:统计时长 内,最小请求数 中,异常数量的比例 达到 比例阈值 时 熔断预设的熔断时长
异常数:统计时长 内,最小请求数 中,异常数量 达到 异常数量阈值 时 熔断预设的熔断时长
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果


