10.使用gateway作为服务网关的简单配置

gateway 简介

Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了Ribbon做负载均衡,以及默认使用Hystrix对网关进行保护,当然也可以选择其他的容错组件,例如Sentinel

优点:

  • 性能强劲:是第一代网关Zuul的1.6倍
  • 功能强大:内置了很多实用的功能,例如转发、监控、限流等
  • 设计优雅,容易扩展

缺点:

  • 其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,有一定的学习成本
  • 不能在Servlet容器下工作,也不能构建成WAR包,即不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行
  • 不支持Spring Boot 1.x,需2.0及更高的版本



1. gateway 的简单配置使用

1. 入门配置

需要4步:

  • 新建model
  • 修改pom文件
  • 配置yml文件
  • 启动类

1. 新建Model

这个没什么好说的了,新建一个普通的maven的model 即可

2. 修改pom文件

pom文件是基于父子工程来做的,微服务一般都是基于父子工程来做的。
在pom文件中添加 gateway 的依赖

注意: 不要在pom中添加 spring-boot-starter-web 的依赖。

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

版本号已经在父项目中规定了:参见:https://blog.csdn.net/weixin_43852058/article/details/110670923

3. 配置yml文件

在yml文件中配置 gateway 的 路由规则,可以路由到哪些地址等信息

spring:
  cloud:
    gateway:
      routes:
        - id: shop-product            # 路由的唯一标识
          uri: http://localhost:8081  # 如果断言成功,将要转发去的地址
          order: 0                    # 优先级,越小优先级越高
          predicates:                 # 断言,满足所有断言,才会进行转发
            - Path=/product/**        # 注意:这是使用= 不是:
        - id: shop-order
          uri: http://localhost:8091
          order: 0
          predicates:
            - Path=/order/**

server:
  # 指定服务器的端口号
  port: 9000

4. 启动类

maven项目没有springboot的启动类,需要自己新建,新建的时候注意以下,至少先建立两层包目录,防止出现一些意料之外的问题,养成习惯。

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

5. 测试是否成功

做完上边几步就已经配置完成了,下边在浏览器中输入网关的地址,加上想要访问的服务的路径,就可以访问到想要访问的资源了。
在这里插入图片描述
这里应该已经可以感受到网关的作用了,网关就是帮你找到你想要的资源。



2. 结合注册中心使用gateway

在yml中直接写死绑定的uri当然是不好的方法,而且服务间的通信如果多了,使用gateway的时候你就需要记住非常多的地址,端口,使用不太方便,这时候可以配合注册中心一起使用

配合注册中心使用需要两步就可以搞定:

  • 修改pom文件
  • 修改yml文件

1. pom文件

在pom中引入注册中心的依赖,这里以 eureka 为例,nacos同理

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2. yml文件

在yml文件中修改配置,配置注册中心,在转发给远程服务的时候,地址需要进行改变。

# 配置 eureka 注册中心
eureka:
  client:
    register-with-eureka: false  	# 不在注册中心注册
    fetch-registry: true 			# 需要从注册中心拉取服务
    service-url:					# 注册中心的地址
      defaultZone: http://localhost:7001/eureka/

spring:
  cloud:
    gateway:
      routes:
        - id: shop-product            # 路由的唯一标识
          # 这里的地址需要使用 lb://服务名的方式进行转发
          uri: lb://shop-product        # 如果断言成功,将要转发去的地址
          order: 0                    # 优先级,越小优先级越高
          predicates:                 # 断言,满足所有断言,才会进行转发
            - Path=/product/**        # 注意:这是使用= 不是:
        - id: shop-order
          uri: lb://shop-order
          order: 0
          predicates:
            - Path=/order/**
  application:
    name: shop-gateway

注意: 在配置gateway的时候,uri的地址需要使用 lb://服务名 的方式进行配置。
lb 是 LoadBalance 的意思,也就是负载均衡的意思。

使用网关模式的话,网关是带有负载均衡的(Eureka 和 nacos 集成了Ribbon)
Ribbon的简单使用参考:4. 使用Ribbon实现客户端负载均衡


3. 测试是否成功

在浏览器中输入 http://网关ip:网关端口/资源路径 进行测试,如果显示出目标资源,就是配置成功
在这里插入图片描述

3. 简化版配置

有人说,微服务多的话,我这yml里边岂不是要配置很多东西,有点烦人啊,gateway还提供一种简化版的配置,可以在yml中不配置route。但是在访问的时候,对url路径有一定的要求。
具体是什么要求,到后边再说,先看配置吧

1. yml 文件

在yml中开启自动定位

spring:
  application:
    name: shop-gateway
  cloud:
    gateway:
      discovery:
        # 定位器
        locator:
          enabled: true

2. 测试是否成功

在浏览器中输入:http://网关ip:网关端口/服务名/资源(接口)路径 进行访问
在这里插入图片描述

注意: 使用这种方式的时候,请求路径一定要遵循这个规则: http://网关ip:网关端口/服务名/资源(接口)路径

再次注意: 使用Eureka 做完注册中心的时候,注册的服务名称会默认转换为 全大写,使用的时候一定要注意。

  • 23
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Spring Security的认证模块作为Gateway网关的认证模块。在Spring Cloud Gateway中,我们可以使用Spring Security的认证模块来进行用户认证和授权操作。 首先,我们需要在Gateway应用中引入Spring Security的相关依赖,例如: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-security</artifactId> </dependency> ``` 然后,在Gateway应用的配置文件中,我们需要配置Spring Security的相关信息,例如: ```yaml spring: security: user: name: admin password: admin oauth2: client: registration: my-client: client-id: my-client-id client-secret: my-client-secret scope: read,write redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}' authorization-grant-type: authorization_code client-name: My Client provider: my-provider: authorization-uri: https://my-provider.com/oauth2/authorize token-uri: https://my-provider.com/oauth2/token user-info-uri: https://my-provider.com/oauth2/userinfo jwk-set-uri: https://my-provider.com/oauth2/jwks ``` 上述配置中,我们配置了一个简单的用户名和密码进行认证,同时也配置了一个OAuth2的客户端,并将其注册到了一个OAuth2的提供者中。 最后,在Gateway应用的路由配置中,我们需要使用Spring Security的API来进行认证和授权的操作,例如: ```java @Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http.authorizeExchange() .pathMatchers("/admin/**").hasRole("ADMIN") .pathMatchers("/user/**").hasRole("USER") .anyExchange().permitAll() .and() .httpBasic() .and() .csrf().disable() .build(); } ``` 上述代码中,我们定义了一个SecurityWebFilterChain,用于控制Gateway应用中的路由请求的访问权限。我们可以根据不同的路由路径,设置不同的角色权限要求。同时,我们还可以使用httpBasic()方法来配置基于HTTP基本认证的登录方式。最后,我们使用disable()方法来关闭CSRF防护,使得我们可以直接从浏览器中访问Gateway应用。 总之,Spring Security的认证模块可以很好地与Gateway网关集成,提供强大的用户认证和授权服务

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值