SpringCloud组件梳理

一、nacos

在nacos配置中改权重只是临时生效,在配置文件中改nacos的权重是永远生效

nacos的权重为0时,不会访问。

springclude中实现负载均衡的两种方式:

1.消费者端 loadBalancerClient调用(轮询)

2.在nacos中配置权重

若两者都配置以消费者端为准

在配置文件中进行权重配置:

  cloud:
    nacos:
      discovery:
        weight: 0.1  #注意:如果权重修改为0,则该实例永远不会被访问

二、feign接口

(拷贝提供端的controller层)

(1)在接口上加@FeignClient 表明是一个feign接口(name ="BBB",path ="/api/demo2",contextld ="指定bean名,一般写接口名")

contextld ="指定bean名,一般写接口名",注入时用@Resource根据bean名称注入

接口中抽象方法的参数注解都不能省@RequestParam @PathVariable

@FeignClient(name = "BBB",path = "/test2",contextId = "feignDemo")
public interface FeignDemo {
    @GetMapping
    public String getPhone();
    @GetMapping("/a")
    public String getPhoneA(String phone);
    @GetMapping("/b/{phone}")
    public String getPhoneB(@PathVariable("phone") String phone);
}

(2)启动类上加@EnableFeignClients 确保feign接口被扫描 为确保100%被扫到加(basePackages = "feign接口所在的包名路径")

(3)消费端注入依赖,feign接口

<!--读取feign-demo - mould-->
<dependency>
    <groupId>org.example</groupId>
    <artifactId>feign-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

feign:日志配置和超时配置

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true
​
    openfeign:
      client:
        config:
          default:
            loggerLevel: full
            read-timeout: 2000  # 读取数据的超时时间设置为2s
            connect-timeout: 2000  # 建立连接的超时时间设置为2s
​
# 将feign包下产生的日志的级别设置为debug
logging:
  level:
    com.atguigu.feign: debug

开启负载均衡,会优先调用同集群的的节点,也会有权重比

​
​
spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true
        
        

三、环境隔离/空间命名

nacos---namespace

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #nacos地址
        cluster-name: 111  ## 配置服务所属集群
        namespace: 2327d1b6-af0e-4905-b18f-0bafd22060e6  #配置服务实例所属名称空间

四、配置文件

(1):bootstrap.yml配置文件

spring:
  cloud:
    nacos:
      discovery:
      //注册中心
        server-addr: localhost:8848
        cluster-name: 111   //集群名
        namespace: 2327d1b6-af0e-4905-b18f-0bafd22060e6 //命名空间
      //配置中心  
      config:
        prefix: ${spring.application.name} #前缀
        file-extension: yaml #后缀
        namespace: 2327d1b6-af0e-4905-b18f-0bafd22060e6 //配置空间
        server-addr: localhost:8848 //配置中心地址(可不配,同注册地址)
  application:
    name: AAA  //注册中心的名字
  profiles:
    active: prod  #前缀-拼-后缀

(2)微服务集成配置中心

获取配置文件中自定义的a.b=456

两种方法:

一:使用@Value

必须搭配@RefreshScope//刷新配置文件

 @Value("${a.b}")
    public String a;
    @GetMapping("/aaa")
    public String getA(){
        return a;
    }
 必须搭配@RefreshScope//刷新配置文件  

二:(1)写一个配置类

@Component
@ConfigurationProperties(prefix = "a")
public class TestConfig {
    public String b;
​
    public String getB() {
        return b;
    }
​
    public void setB(String b) {
        this.b = b;
    }
}

(2)注入

@Autowired
private TestConfig testConfig;
@GetMapping("/aaa")
public String getA(){
    return testConfig.b;
}

五、网关 gateway:

server:
  port: 80
​
spring:
  application:
    name: gateway-demo
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 6731e546-f632-40e1-8b01-535b7a1a6e89
    gateway:
      routes:
        - id: AAA #路由id,可以自定义,只要唯一即可
          uri: lb://AAA #路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates:
            - Path=/*/xxx/** #断言:路径匹配
        - id: BBB
          uri: lb://BBB
          predicates:
            - Path=/*/yyy/**,/*/zzz/**
      discovery:
        locator:
          enabled: true

六、过滤器:filters

(1)局部过滤器(在配置文件中配置)

filters:
  - args: #局部过滤器只针对当前的id生效

(2)默认过滤器(在配置文件中配置)

default-filters: #如:可以在所有的请求头上加Truth, atguigu is good 
  - AddRequestHeader=Truth, atguigu is good 

(3)全局过滤器(写一个配置类进行配置)

请求---->过滤器---->拦截器---->controller层

请求到达网关在转发之前,会先经过过滤器,过滤器可以有多个

如:可以限流 校验是否登录

​
@Component
//@Order
public class TestFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //exchange可以获取请求对象
        ServerHttpRequest request = exchange.getRequest();
        //获取响应对象
        ServerHttpResponse response = exchange.getResponse();
        //场景:看用户本次请求是否携带了一个叫token的参数 getQueryParams()可以获取url中的参数 通过key获取value
        //List<String> token = request.getQueryParams().get("token");
        String token = request.getQueryParams().getFirst("token");
        if (StringUtils.isEmpty(token)){
            // 若用户没有携带.则拦截用户的请求返回状态码:401
            response.setStatusCode(HttpStatusCode.valueOf(401));
            return response.setComplete();
        }
        // 若用户携带了token的参数放过请求转发给微服务---放行
        return chain.filter(exchange);
    }
​
    @Override
    public int getOrder() {
        return 0;//数字越小优先级越高 可以换成@Order(1)注解
    }
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值