网关Gateway与Nacos

网关与Nacos入门

一. 架构分析

在一个项目中如果有很多更多的微服务,那么由前端直接请求微服务的方式会存在弊端,前端对每个请求地址都配置绝对路径,非常不利于系统维护,比如下边代码中请求系统管理服务的地址使用的是localhost

在这里插入图片描述

当系统上线后这里需要改成公网的域名,如果这种地址非常多则非常麻烦。

基于这个问题可以采用网关来解决,如下图:
在这里插入图片描述

那么基于网关,前端直接请求微服务的地址只需要指定每个接口的相对路径
在这里插入图片描述

而且后端也可以将访问微服务的地址改为访问网关的地址,然后由网关进行路由

在这里插入图片描述

网关就可以对请求进行路由,路由到具体的微服务,减少外界对接微服务的成本,另外,网关还可以实现权限控制、限流等功能

那么由图可得,部署网关的流程如下:

1、微服务启动,将自己注册到Nacos,Nacos记录了各微服务实例的地址。

2、网关从Nacos读取服务列表,包括服务名称、服务地址等。

3、请求到达网关,网关将请求路由到具体的微服务。

二. 搭建Nacos

服务发现中心

要使用网关首先搭建Nacos,Nacos有两个作用:

1、服务发现中心。

微服务将自身注册至Nacos,网关从Nacos获取微服务列表。

2、配置中心。

微服务众多,它们的配置信息也非常复杂,为了提供系统的可维护性,微服务的配置信息统一在Nacos配置。

在搭建Nacos服务发现中心之前需要搞清楚两个概念:namespace和group

namespace:用于区分环境、比如:开发环境、测试环境、生产环境。

group:用于区分项目,比如:xuecheng-plus项目、xuecheng2.0项目

首先在nacos配置namespace:

登录Nacos后,点击左侧菜单“命名空间”进入命名空间管理界面,

在这里插入图片描述

点击“新建命名空间”,填写命名空间的相关信息。如下图:

在这里插入图片描述

将微服务消息注册到Nacos中

  1. 首先添加依赖管理
<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>  
    <version>Hoxton.SR9</version>  
    <type>pom</type>  
    <scope>import</scope>  
</dependency>
<!--Nacos服务注册依赖-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
   <version>2.3.7.RELEASE</version> 
</dependency>

2.配置nacos的地址

在配置文件中配置如下信息:


spring:  
  application:  
    name: content-api  #微服务名称
  cloud:  
    nacos:  
      server-addr: 192.168.101.65:8848  #Nacos地址
      discovery:  
        namespace: dev  #命名空间
        group: xuecheng-plus-project #组

重启服务。

进入Nacos服务查看服务列表,发现有注册的微服务消息

在这里插入图片描述

配置中心

配置三要素

搭建完成Nacos服务发现中心,下边搭建Nacos为配置中心,其目的就是通过Nacos去管理项目的所有配置。

先将项目中的配置文件分分类:

1、每个项目特有的配置

是指该配置只在有些项目中需要配置,或者该配置在每个项目中配置的值不同。

比如:spring.application.name每个项目都需要配置但值不一样,以及有些项目需要连接数据库而有些项目不需要,有些项目需要配置消息队列而有些项目不需要。

2、项目所公用的配置

是指在若干项目中配置内容相同的配置。比如:redis的配置,很多项目用的同一套redis服务所以配置也一样。

另外还需要知道nacos如何去定位一个具体的配置文件,即:namespace、group、dataid.

1、通过namespace、group找到具体的环境和具体的项目。

2、通过dataid找到具体的配置文件,dataid有三部分组成

比如:content-service-dev.yaml配置文件 由(content-service)-(dev). (yaml)三部分组成

content-service:第一部分,它是在application.yaml中配置的应用名,即spring.application.name的值。

dev:第二部分,它是环境名,通过spring.profiles.active指定,

Yaml: 第三部分,它是配置文件 的后缀,目前nacos支持properties、yaml等格式类型,本项目选择yaml格式类型。

我们启动项目中传入spring.profiles.active的参数决定引用哪个环境的配置文件,例如:传入spring.profiles.active=dev表示使用dev环境的配置文件即content-service-dev.yaml。

例如

1.点击加号,添加配置

在这里插入图片描述

2.编辑配置

在这里插入图片描述

3.添加依赖


 <!--微服务配置依赖-->
 <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.6.RELEASE</version> 
</dependency>

在配置文件中修改配置

(具体介绍看前面)

YAML
spring:
  application:
    name: content-service
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: dev
        group: xuecheng-plus-project
      config:
        namespace: dev
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true

#profiles默认为dev
  profiles:
    active: dev 

配置完成,运行工程 的单元测试文件,能否正常测试,跟踪单元测试方法可以正常读取数据库的数据,说明从nacos读取配置信息正常。

公用配置

如果有配置是重复要写的或者公用配置,那么如何在nacos中配置项目的公用配置呢?

nacos提供了shared-configs可以引入公用配置。

例如,在content-api中配置了swagger,所有的接口工程 都需要配置swagger,这里就可以将swagger的配置定义为一个公用配置,哪个项目用引入即可。

单独在xuecheng-plus-common分组下创建xuecheng-plus的公用配置,进入nacos的开发环境,添加swagger-dev.yaml公用配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSLuJRO1-1689594280792)(file:///C:/Users/a2262/Pictures/Typedown/c50152f7-1c78-4a9a-aca4-139482cc8dc8.png)]

然后在配置文件中标上共享配置信息

YAML
spring:
  application:
    name: content-api
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: dev
        group: xuecheng-plus-project
      config:
        namespace: dev
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true #开启自动更新配置
        extension-configs: #扩展配置,下面是扩展配置的信息(Nacos中的配置)
          - data-id: content-service-${
    
    spring.profiles.active}.yaml
            group: xuecheng-plus-project
            refresh: true
        shared-configs: #共享配置,下面是共享配置的信息
          - data-id: logging-${
    
    spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true
  profiles:
    active: dev #环境,也是后缀

新建配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PxnA3s17-1689594280793)(file:///C:/Users/a2262/Pictures/Typedown/67e1ad57-181d-4bfd-b5a6-0e2800fb4022.png)]

配置完成,重启工程,看看是否有相应配置的结果,有则表示配置成功

配置优先级

SpringBoot读取配置文件 的顺序如下:

在这里插入图片描述

引入配置文件的形式有:

1、以项目应用名方式引入

2、以扩展配置文件方式引入

3、以共享配置文件 方式引入

4、本地配置文件

各配置文件 的优先级:项目应用名配置文件 > 扩展配置文件 > 共享配置文件 > 本地配置文件。

如果我们想让本地最优先,可以在nacos配置文件 中配置如下即可实现:

#配置本地优先  
spring:  
 cloud:  
  config:  
    override-none: true

三.搭建Gateway(网关)

我们需要创建一个网关工程。

1.新建一个网关工程。

在这里插入图片描述

2.项目结构

在这里插入图片描述

3.添加依赖


<artifactId>xuecheng-plus-gateway</artifactId>

<dependencies>

    <!--网关-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>

    <!--服务发现中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.83</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
    </dependency>
    <!-- 排除 Spring Boot 依赖的日志包冲突 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.3.7.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- Spring Boot 集成 log4j2 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
        <version>2.3.7.RELEASE</version>
    </dependency>


</dependencies>

4.配置网关的bootstrap.yaml配置文件

YAML
#微服务配置
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: dev
        group: xuecheng-plus-project
      config:
        namespace: dev
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true
        shared-configs:
          - data-id: logging-${
    
    spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true


  profiles:
    active: dev

5.在nacos上配置网关路由策略:

在这里插入图片描述

配置如下

YAML
server:
  port: 63010 # 网关端口
spring:
  cloud:
    gateway:
#      filter:
#        strip-prefix:
#          enabled: true
      routes: # 网关路由配置,这下面是我的几个微服务信息
        - id: content-api # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://content-api # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/content/** # 这个是按照路径匹配,只要以/content/开头就符合要求
#          filters:
#            - StripPrefix=1
        - id: system-api
          # uri: http://127.0.0.1:8081
          uri: lb://system-api
          predicates:
            - Path=/system/**
#          filters:
#            - StripPrefix=1
        - id: media-api
          # uri: http://127.0.0.1:8081
          uri: lb://media-api
          predicates:
            - Path=/media/**
#          filters:
#            - StripPrefix=1


6.把请求微服务的地址换成网关地址

比如

在这里插入图片描述

或者

在这里插入图片描述

启动工程测试,如果请求正常,那么就部署成功了

猜你喜欢

转载自blog.csdn.net/m0_71106830/article/details/131773625