【微服务】第13节:搞懂网关路由及配置

目录

1.网关路由

1.1.认识网关

1.2.快速入门

1.2.1.创建项目

1.2.2.引入依赖

1.2.3.启动类

1.2.4.配置路由

1.2.5.测试

1.3.路由过滤


由于每个微服务都有不同的地址或端口,入口不同,相信大家在与前端联调的时候发现了一些问题:

        🔹 请求不同数据时要访问不同的入口,需要维护多个入口地址,麻烦

        🔹 前端无法调用nacos,无法实时更新服务列表

单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:

        🔹 每个微服务都需要编写登录校验、用户信息获取的功能吗?

        🔹 当微服务之间调用时,该如何传递用户信息?

不要着急,这些问题都可以在今天的学习中找到答案,我们会通过网关技术解决上述问题。今天的内容会分为3章:

        🔹 第一章:网关路由,解决前端请求入口的问题。

        🔹 第二章:网关鉴权,解决统一登录校验和用户信息获取的问题。

        🔹 第三章:统一配置管理,解决微服务的配置文件重复和配置热更新问题。

好了,接下来我们就一起进入今天的学习吧。

1.网关路由

1.1.认识网关

什么是网关?

顾明思议,网关就是络的口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验

更通俗的来讲,网关就像是以前园区传达室的大爷。

  • 外面的人要想进入园区,必须经过大爷的认可,如果你是不怀好意的人,肯定被直接拦截。

  • 外面的人要传话或送信,要找大爷。大爷帮你带给目标人。

现在,微服务网关就起到同样的作用。前端请求不能直接访问微服务,而是要请求网关:

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行

  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去

在SpringCloud当中,提供了两种网关实现方案:

  • Netflix Zuul:早期实现,目前已经淘汰

  • SpringCloudGateway:基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强

课堂中我们以SpringCloudGateway为例来讲解,官方网站:

https://spring.io/projects/spring-cloud-gateway#learn

1.2.快速入门

接下来,我们先看下如何利用网关实现请求路由。由于网关本身也是一个独立的微服务,因此也需要创建一个模块开发功能。大概步骤如下:

  • 创建网关微服务

  • 引入SpringCloudGateway、NacosDiscovery依赖

  • 编写启动类

  • 配置网关路由

1.2.1.创建项目

首先,我们要在hmall下创建一个新的module,命名为hm-gateway,作为网关微服务:

1.2.2.引入依赖

hm-gateway模块的pom.xml文件中引入依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>hmall</artifactId>
        <groupId>com.heima</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>hm-gateway</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <!--common-->
        <dependency>
            <groupId>com.heima</groupId>
            <artifactId>hm-common</artifactId>
            <version>1.0.0</version>
        </dependency>
        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

1.2.3.启动类

hm-gateway模块的com.hmall.gateway包下新建一个启动类:

代码如下:

package com.hmall.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

1.2.4.配置路由

接下来,在hm-gateway模块的resources目录新建一个application.yaml文件,内容如下:

server:
  port: 8080
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.150.101:8848
    gateway:
      routes:
        - id: item # 路由规则id,自定义,唯一
          uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
          predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
            - Path=/items/**,/search/** # 这里是以请求路径作为判断规则
        - id: cart
          uri: lb://cart-service
          predicates:
            - Path=/carts/**
        - id: user
          uri: lb://user-service
          predicates:
            - Path=/users/**,/addresses/**
        - id: trade
          uri: lb://trade-service
          predicates:
            - Path=/orders/**
        - id: pay
          uri: lb://pay-service
          predicates:
            - Path=/pay-orders/**

1.2.5.测试

启动GatewayApplication,以 http://localhost:8080 拼接微服务接口路径来测试。例如:

http://localhost:8080/items/page?pageNo=1&pageSize=1

此时,启动UserApplication、CartApplication,然后打开前端页面,发现相关功能都可以正常访问了:

1.3.路由过滤

路由规则的定义语法如下:

spring:
  cloud:
    gateway:
      routes:
        - id: item
          uri: lb://item-service
          predicates:
            - Path=/items/**,/search/**

其中routes对应的类型如下:

是一个集合,也就是说可以定义很多路由规则。集合中的RouteDefinition就是具体的路由规则定义,其中常见的属性如下:

四个属性含义如下:

  • id:路由的唯一标示

  • predicates路由断言,其实就是匹配条件

  • filters路由过滤条件,后面讲

  • uri路由目标地址,lb://代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问。

这里我们重点关注predicates,也就是路由断言。SpringCloudGateway中支持的断言类型有很多:

名称

说明

示例

After

是某个时间点后的请求

- After=2037-01-20T17:42:47.789-07:00[America/Denver]

Before

是某个时间点之前的请求

- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Between

是某两个时间点之前的请求

- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]

Cookie

请求必须包含某些cookie

- Cookie=chocolate, ch.p

Header

请求必须包含某些header

- Header=X-Request-Id, \d+

Host

请求必须是访问某个host(域名)

- Host=**.somehost.org,**.anotherhost.org

Method

请求方式必须是指定方式

- Method=GET,POST

Path

请求路径必须符合指定规则

- Path=/red/{segment},/blue/**

Query

请求参数必须包含指定参数

- Query=name, Jack或者- Query=name

RemoteAddr

请求者的ip必须是指定范围

- RemoteAddr=192.168.1.1/24

weight

权重处理

  • 24
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 微服务网关和shiro是两个不同的概念,它们的作用和功能也不同。 微服务网关是一个服务的入口,它可以负责路由、负载均衡、安全认证、流量控制等一系列功能,将客户端请求转发到不同的服务中。微服务网关可以统一管理服务,提高系统的可维护性和可扩展性,也可以优化系统的性能和安全性。 而shiro是一个用于权限管理的框架,它可以实现用户认证、授权、会话管理、密码加密等功能,可以保护应用程序的安全。shiro可以集成到各种应用程序中,提供安全保障,防止未授权的访问和攻击。 因此,微服务网关和shiro的作用和功能是不同的,它们在应用场景和使用方式上也有所不同。微服务网关适用于微服务架构中,可以提供服务的入口和安全保障;而shiro适用于各种应用程序中,可以提供安全控制和权限管理。 ### 回答2: 微服务网关和Shiro是两个不同的概念和技术。 微服务网关是一种用于管理和统一调度微服务的中间层组件。它的作用是将多个微服务统一对外提供服务,客户端只需要与网关进行交互,而无需直接与各个微服务进行通信。微服务网关可以进行路由、负载均衡、安全认证等功能,可以有效地提高微服务的可用性和安全性,同时也简化了客户端与微服务之间的交互过程。 而Shiro是一个用于应用程序的Java安全框架。它提供了身份认证、授权、会话管理等安全功能,可以帮助开发者快速地添加安全性到应用程序中。Shiro可以对整个应用程序进行保护,包括web应用、非web应用以及分布式应用。它的设计目标是简单、易用和灵活,可以满足各种不同类型的应用程序的安全需求。 从功能上来说,微服务网关主要是用于微服务的统一管理和调度,包括路由、负载均衡、安全认证等功能。而Shiro主要是用于应用程序的安全管理,包括身份认证、授权等功能。 总的来说,微服务网关和Shiro是两个不同的技术,各自有各自的功能和作用。微服务网关主要用于微服务的管理和调度,而Shiro主要用于应用程序的安全管理。 ### 回答3: 微服务网关和shiro是面向不同层面的技术组件,具有不同的功能和应用场景。 首先,微服务网关是一种用于处理多个微服务的入口,它可以集中管理和路由请求,对外提供统一的接口。微服务网关通常用于实现微服务架构中的API网关,可以提供统一的认证、鉴权、流量控制、日志记录等功能。它可以帮助简化系统架构,提高系统的可维护性和可扩展性。 而shiro是一种用于身份认证和访问控制的框架。它提供了一套完整的认证、授权、会话管理等安全功能,可以帮助开发者轻松地实现用户身份认证和权限控制。shiro可以与各种应用进行集成,可以用于传统的单体应用,也可以用于微服务架构中的每个微服务,实现微服务内的安全控制。 因此,微服务网关和shiro的区别主要体现在两个方面。 首先,在功能上,微服务网关主要用于实现微服务架构中的API网关功能,提供统一的入口和管理多个微服务之间的请求。而shiro主要用于实现身份认证和访问控制,提供可用于传统应用和微服务内部的安全控制。 其次,在应用场景上,微服务网关被广泛应用于微服务架构中,用于提供统一的服务接口,方便管理和监控多个微服务。而shiro可以用于各种类型的应用,无论是传统的单体应用还是微服务架构中的每个微服务。 总体而言,微服务网关和shiro是两种不同的技术组件,各自在不同层面和方面发挥作用。在实际应用中,可以根据具体需求选择使用其中的一种或两者结合,以达到更好的系统安全和可管理性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫蜜柚子茶

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值