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 的比例 达到 比例阈值 时 熔断预设的熔断时长
        异常比例:统计时长 内,最小请求数 中,异常数量的比例 达到 比例阈值 时 熔断预设的熔断时长
        异常数:统计时长 内,最小请求数 中,异常数量 达到 异常数量阈值 时 熔断预设的熔断时长