• SpringCloud入门详细教程二(Nacos配置管理,http客户端Feign,统一网关Gateway)


    一:Nacos配置管理

    1.Nacos配置管理——微服务实现配置管理

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    2.Nacos配置管理——微服务配置拉取

    bootstrap.yml文件在application.yml之前被项目读入

    在这里插入图片描述
    同一配置管理
    引入Nacos的配置管理客户端依赖:

      <!--nacos的配置管理依赖-->
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-config
            
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:

    spring:
      application:
        name: userservice
      profiles:
        active: dev # 环境
      cloud:
        nacos:
          server-addr: localhost:8848 # nacos地址
          discovery:
            cluster-name: SH #集群名称,这里HZ代指杭州
          config:
            file-extension: yaml # 文件后缀名
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在user-service中将pattern.dateformat这个属性注入到UserController中做测试

    @Slf4j
    @RestController
    @RequestMapping("/user")
    // @RefreshScope
    public class UserController {
    
         @Value("${pattern.dateformat}")
         private String dateformat;
     @GetMapping("now")
        public String now(){
            return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat, Locale.CHINA));
        }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    3.Nacos配置管理——配置热更新

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4.Nacos配置管理——多环境配置共享

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    5.Nacos配置管理——nacos集群搭建

    链接:https://pan.baidu.com/s/1vokjKM49nJUrbzUT3MZGRA?pwd=ch93
    提取码:ch93
    在这里插入图片描述

    二:http客户端Feign

    1.Feign-基于Feign得远程调用

    RestTemplate方式调用存在问题

    String url = "http://userservice/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);
    
    • 1

    在这里插入图片描述
    Feign的介绍
    Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
    其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
    在这里插入图片描述
    使用Feign的步骤:
    引入依赖:

     <!--feign客户端依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在order-service的启动类添加注解开启Feign的功能:

    @EnableFeignClients()
    
    • 1

    编写Feign客户端:
    在clients包下面新建一个UserClients接口

    @FeignClient("userservice")
    public interface UserClient {
       @GetMapping("/user/{id}")     
       User findById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    用Feign客户端代替RestTemplate
    在这里插入图片描述
    在这里插入图片描述

    2.Feign-自定义配置

    在这里插入图片描述

    配置日志的级别

    1. 方式一:配置文件方式

    全局生效

    feign:
      client:
        config: 
          default: #这里使用default就是全局配置,如果改成服务名称,则是针对某个服务
            loggerLevel: FULL #日志级别
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    局部生效,将default改成服务名称,例如userservice

    1. 方式二:java代码方式,需要先声明一个Bean:
    public class DefaultFeignConfiguration {
        @Bean
        public Logger.Level logLevel(){
            return Logger.Level.BASIC;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    全局配置:

    @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
    
    • 1

    局部配置:

    @EnableFeignClients(value="userservice",defaultConfiguration = DefaultFeignConfiguration.class)
    
    • 1

    在这里插入图片描述

    3.Feign-性能优化

    Feign底层的客户端实现:

    • URLConnection:默认实现,不支持连接池
    • Apache HttpClient:支持连接池
    • OKHttp:支持连接池

    因此优化Feign的性能主要包括:

    • 使用连接池代替默认的URLConnection
    • 日志级别,最好用basic或none

    Feign添加HttpClient的支持
    引入依赖:

      <!--引入HttpClient依赖-->
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-httpclient</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置连接池:

    feign:
      httpclient:
        enabled: true # 支持HttpClient的开关
        max-connections: 200 # 最大连接数
        max-connections-per-route: 50 # 单个路径的最大连接数
      client:
        config:
          default: # default全局的配置
            loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    4.Feign-最佳实践

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
    在这里插入图片描述

    • 方式一:指定FeignClient所在包
    @EnableFeignClients(basePackages = "cn.itcast.feign.clients")
    
    • 1
    • 方式二:指定FeignClient字节码
    @EnableFeignClients(clients = UserClient.class
    • 1

    在这里插入图片描述

    三:统一网关Gateway

    1.GateWay网关作用和入门

    网关功能:

    • 身份认证和权限校验
    • 身份路由、负载均衡
    • 请求限流
      在这里插入图片描述
      在这里插入图片描述
      搭建网关服务:
      1.创建新的module,引入SpringcloudGateWay的依赖和nacos的服务发现依赖:
      <!--nacos服务注册发现依赖-->
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-discovery
            
     <!--网关gateway依赖-->
            
                org.springframework.cloud
                spring-cloud-starter-gateway
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.编写路由配置及nacos地址

    server:
      port: 10010 # 网关端口
    spring:
      application:
        name: gateway #服务名称
      cloud:
        nacos:
          server-addr: localhost:8848 #nacos地址
        gateway:
          routes: #网关路由配置
            - id: user-service  #路由id ,自定义,只要唯一即可
              uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
              predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
                - Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件 
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
    
                
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述
    网关搭建步骤:

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

    路由配置包括:

    1. 路由id:路由的唯一标识
    2. 路由目标(uri):路由的目标地址,http代表固定地址。lb代表根据服务名称负载均衡
    3. 路由断言(predicates):判断路由的会泽
    4. 路由过滤器(filters):对请求或相应做处理

    2.GateWay——路由断言工厂和路由过滤器

    路由断言工厂Route Predicate Factory
    在这里插入图片描述
    Gateway断言工厂官网讲述地址:详细
    在这里插入图片描述
    在这里插入图片描述
    路由过滤器 GatewayFilter
    在这里插入图片描述
    在这里插入图片描述
    给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
    实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器

    spring:
      application:
        name: gateway #服务名称
      cloud:
        nacos:
          server-addr: localhost:8848 #nacos地址
        gateway:
          routes: #网关路由配置
            - id: user-service  #路由id ,自定义,只要唯一即可
              uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
              predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
                - Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件
              filters: # 过滤器
                - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试:
    在这里插入图片描述

    spring:
      application:
        name: gateway #服务名称
      cloud:
        nacos:
          server-addr: localhost:8848 #nacos地址
        gateway:
          routes: #网关路由配置
            - id: user-service  #路由id ,自定义,只要唯一即可
              uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
              predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
                - Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
          default-filters: # 默认过滤器,会对所有的路由请求都生效
            - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    3.GateWay——全局过滤器以及过滤器链执行顺序

    在这里插入图片描述

    在这里插入图片描述
    自定义类,实现GlobalFilter接口,添加@Order注解:
    @Order注解和Ordered接口的作用是解决过滤器执行顺序问题

    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    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, Ordered {
        @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.FORBIDDEN);
             // 4.2结束处理
            return exchange.getResponse().setComplete();
    
            
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4.GateWay网关——网关的跨域请求

    在这里插入图片描述
    网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:

    spring:
      cloud:
        gateway:
          globalcors: # 全局的跨域处理
            add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
            corsConfigurations:
              '[/**]':
                allowedOrigins: # 允许哪些网站的跨域请求
                  - "http://localhost:8090"
                  - "http://www.leyou.com"
                allowedMethods: # 允许的跨域ajax的请求方式
                  - "GET"
                  - "POST"
                  - "DELETE"
                  - "PUT"
                  - "OPTIONS"
                allowedHeaders: "*" # 允许在请求中携带的头信息
                allowCredentials: true # 是否允许携带cookie
                maxAge: 360000 # 这次跨域检测的有效期
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

  • 相关阅读:
    9月8日作业
    算法练习day7
    优维低代码:Storyboard Functions 微应用函数
    multi-gneration lru系列 - 怎么决定回收anon还是file
    Jetson Orin NX 开发指南(5): 安装 OpenCV 4.6.0 并配置 CUDA 以支持 GPU 加速
    Java版Word开发工具Aspose.Words基础教程:创建或加载文档
    npm 发布 使用 跟新 vue 插件
    MD5加密【代码实现】
    C# 现状简单说明
    小程序实现下拉刷新
  • 原文地址:https://blog.csdn.net/qq_51269815/article/details/126736289