Springcloud复习篇

nacos服务治理

服务注册+服务发现

启动nacos

win: startup.cmd
linux:startup.sh

账号密码:nacos 、nacos

服务注册

启动两个服务
在这里插入图片描述
在这里插入图片描述

服务发现

provider为服务名

    //自动转载,所以直接用
    @Autowired
    private DiscoveryClient discoveryClient;
    @GetMapping("/instances")
    public List<ServiceInstance> instances(){
        List<ServiceInstance> provider = this.discoveryClient.getInstances("provider");
        return provider;
    }

在这里插入图片描述

Ribbon负载均衡

默认是轮询算法,还有随机算法,基于权重的算法

@LoadBalanced该注解起到的作用
这里调用利用到了restTemplate


@Configuration
public class ConsumerConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

@RestController
@Slf4j
public class ConsumerController {

    //自动转载,所以直接用
    @Autowired
    private DiscoveryClient discoveryClient;
    //不会自动装载,不能直接用
    @Autowired
    private RestTemplate restTemplate;

	//getForObject第一个参数调用接口,第二个接收返回的类型
    @GetMapping("/index")
    public String index(){
        return this.restTemplate.getForObject("http://provider/index", String.class);
    }

}

随机的算法

provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

基于权重的算法 根据nacos控制台里面设置的权重
第一步:

package com.lin.configuration;

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.ribbon.NacosServer;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
        //读取配置文件
    }

    @Override
    public Server choose(Object o) {
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) loadBalancer;
        //获取要请求的微服务名称
        String name = baseLoadBalancer.getName();
        //获取服务发现的相关API
        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
        try {
            Instance instance = namingService.selectOneHealthyInstance(name);
            log.info("选择的实例是port={},instance={}",instance.getPort(),instance);
            return new NacosServer(instance);
        } catch (NacosException e) {
            e.printStackTrace();
            return null;
        }
    }
}

第二步:

provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.lin.configuration.NacosWeightedRule

Sentinel服务限流降级

雪崩效应:A服务挂了,B服务需要调用A,这时候会有很多线程被阻塞,造成B服务也挂了
解决方案:
1.设置线程超时
2.设置限流(比如超过10个流量就限流)
3.熔断器Sentinel

熔断器原理
在这里插入图片描述
降级:只提供部分功能,应对自身的故障
限流:只接收系统能够承载的访问量,如果超出直接抛出异常
熔断:调用不了别人的功能,会抛出异常

在这里插入图片描述
在这里插入图片描述
点击流控,然后设置
在这里插入图片描述
上图阈值为1,则一秒一次

流量模式:

  • 直接
    直接限制/index

  • 关联
    /list超过流量,则限制/index
    在这里插入图片描述

  • 链路
    入侵service层,监控service
    在这里插入图片描述

需要在service层中加入@SentinelResource注解实现

@Service
public class ProviderService {

    @SentinelResource("test")
    public void test(){
        System.out.println("test");
    }
}

流控:

  • 快速失败:直接抛异常
  • warm up:设置预热时间(秒):设置的时间内是单击阈值的1/3,过了设置时间后会恢复
  • 排队等待:设置超时时间(毫秒):不会立马抛异常,而是等设置的时间过后再去调用

降级

在这里插入图片描述

RT
单个请求的响应时间超过阈值,则进入准降级状态,接下来的1s内连续5个请求响应都超过阈值,就进行降级,抛出429,持续时间为时间窗口的值

在这里插入图片描述

异常比例
每秒异常数量占通过量的比例大于阈值,就进行降级处理,持续时间为时间窗口的值
在这里插入图片描述

异常数
一分钟内的异常数,超过阈值就会降级,时间窗口要大于60s,否则刚结束熔断又要进入下一次熔断了

热点

在这里插入图片描述

需要添加 @SentinelResource注解实现

    @GetMapping("/hot")
    @SentinelResource("hot")
    public String hot(
            @RequestParam(value = "num1",required = false) Integer num1,
            @RequestParam(value = "num2",required = false) Integer num2){
        return num1+"-"+num2;
    }

在这里插入图片描述

授权

在这里插入图片描述

是通过获取url里的参数name,然后根据这个值判断,设置白名单,就是只允许白名单的访问,
设置黑名单,就是只有黑名单的不能访问

SpringCloud Gateway服务网关

传达室就相当于网关
SpringCloud Gateway是基于Netty实现的,所以过程中不能用Servlet的组件
这个组件也可以配合Sentinel实现路由的限流
在这里插入图片描述

Seata分布式事务

通过全局事务通知本地事务进行回滚 undo_log记录需要回滚是操作

需要在nacos-config.txt配置服务。。。。一些列配置
然后在需要的地方添加@GlobalTransactional注解

Feign

Feign是伪Http客户端,它使得调用远程服务就像调用本地服务一样,只需要创建一个接口并实现一个注解即可
定义一个接口:
接口
注入需要的业务调用即可
在这里插入图片描述

Feign集成了Nacos,在Nacos下使用Feign默认实现了负载均衡的效果

总结

  • 服务治理:nacos
    包括了服务注册、服务发现 服务注册就是把自身服务信息注册到注册中心中 服务发现就是去请求把已注册的服务

  • 服务调用 :Fegin

  • 服务网关:SpringCloud Gateway
    SpringCloud Gateway是基于Netty实现的,所以过程中不能用Servlet的组件,这个组件也可以配合Sentinel实现路由的限流,也可以实现API网关的功能

  • 服务容错:Sentinel
    预防雪崩效应(A服务挂了,B服务调用A,会造成B阻塞很多线程,造成B服务也挂了)

  • 负载均衡:Ribbon

默认是轮询算法,还有随机算法,基于权重的算法

  • 分布式事务:Seata
    使用@GlobalTransactional注解
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值