学习内容:

1.nacos 配置管理

2.feign远程调用

3.Gateway网关

学习目的:

1.nacos 配置管理:

当我们因为具体开发环境,业务需求,等因素,微服务部署实例日渐增多,逐一修改一些统一配置,不仅浪费时间,而且容易出错,而nacos配置中心,可以为我们统一管理实例配置,并且实现热更新

2.feign远程调用

之前我们用RestTemplate发起的远程调用,这种方法的弊端:1.代码维护性差,后期url长又多,容易写错,2.代码可读性差

优雅永不过时,feign的出现,为我们优雅的解决了此类问题

3.Gateway网关

是Spring Cloud中一个重要的组件

核心功能:

请求路由 : 网关不处理业务,但网关可以把请求,转发到某个微服务,这个过程叫做

路由

权限控制 : 关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进

行拦截

限流 :当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放 行请求,避免服务压力过大。

个人理解: 网关具备的作用就像是水坝开闸放水一样, 可以限制流量的大小,可以引导请求找到自己相对应的服务,可以检验请求是否具备请求资格

一.nacos 配置管理:

1.从微服务拉取配置

1)引入nacos-config依赖

  1. <!--nacos配置管理依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  5. </dependency>
    2)添加bootstrap.yaml
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

2.配置热更新

方式一:

在@Value注入的变量所在类上添加注解@RefreshScope:
image.png

方式二:

使用@ConfigurationProperties注解代替@Value注解

image.png

3.配置共享

image.png

不受隔离环境影响,所有环境都快可以读到次配置

二.Feign远程调用

1)引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)添加注解

添加@EnableFeignClients , 开启feign功能

3)编写Feign的客户端

二.修改日志级别

1) yaml方式

1.针对个别服务

feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别

2.针对所有服务

feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别

2)java代码方式

public class DefaultFeignConfiguration  {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }
}

如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)

如果是局部生效,则把它放到对应的@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)

三.Feign使用优化

1)引入依赖

<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

2)配置连接池

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

四.利用抽取继承方式,降低代码的重复性,专业的模块干专业的事

注意:
@EnableFeignClients(basePackages = “cn.itcast.feign.clients”) 包扫描路径!!!

3.Gateway服务网关

1)创建gateway服务,引入依赖

<!--网关-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2)编写启动类

3)编写基础配置和路由规则

server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: user-service # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

4.过滤器工厂

1.路由过滤器的种类

image.png

2.请求头过滤器

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/** 
        filters: # 过滤器
        - AddRequestHeader=name, Itcast is freaking awesome! # 添加请求头

3.默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/**
      default-filters: # 默认过滤项
      - AddRequestHeader=Truth, Itcast is freaking awesome!

自定义全局过滤器

在filter中编写自定义逻辑,可以实现下列功能:

  • 登录状态判断
  • 权限校验
  • 请求限流等

方式是实现GlobalFilter接口。

代码示例

package cn.itcast.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取authorization参数
        String auth = params.getFirst("authorization");
        // 3.校验
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        // 4.1.禁止访问,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 4.2.结束处理
        return exchange.getResponse().setComplete();
    }
}

面试题

一.配置中心的作用? 如何使用?

实现nacos配置的集中统一管理,并实现配置的热更新

二.nacos如何动态变更配置?

方式一:
在@Value注入的变量的类上添加@RefreshScope
方式二:
使用@ConfigurationProperties

三.nacos如何保证高可用?

搭建nacos集群

步骤:
- 搭建nacos数据库,初始化数据库表结构
- 配置nacos
- 启动nacos集群
- nginx反向代理

四.feign的介绍及作用?

介绍:Feign是一个声明式的http客户端
作用:帮助我们优雅的实现http请求的发送

五.如何使用feign进行远程服务调用?

同上

六.feign的基本工作原理?

feign通过我们定义的接口,生成一个代理对象,具体由JDK动态代理实现,生成代理的同时会根据注解生成一个Map,接口方法调用时,会进入invoke方法,然后根据调用的方法从Map中获得一个MethodHandler,然后通过 MethodHandler 根据指定的 client 来完成处理

七.是否对feign进行过性能优化?

feign默认的是URLConnection,不支持连接池,我们可以通过配置,使feign支持连接池,
1) 引入依赖

<!--httpClient的依赖 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

2) 配置连接池

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

八.gateway网关的介绍及作用?

gateway网关是SpringCloud原生组件之一,是我们所有微服务的统一入口
作用:
请求路由
权限控制
限流

九.如何搭建一个gateway网关?

1.创建项目,引入nacos服务发现和gateway依赖
2.配置application.yml,包括服务基本信息、nacos地址、路由

十.网关中路由的作用?

1.判断是否有请求资格
2.引导请求找到对应的服务
3.对请求和响应进行过滤

十一.gateway中断言的作用?

Predicate Factory读取并处理,变为路由判断的条件