springCloud网关Gateway

简介

目标

  • 使用gateway演示客户端通过API网关访问相关服务。

  • 演示路由匹配RoutePredicateFactory

  • 演示动态路由,负载均衡

  • 演示路由过滤功能。

spring cloud gateway

Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等。

创建父工程

创建父工程springcloud_gateway

  • 打开软件idea,新建项目->左侧选择Spring Initializr 后选择jdk的版本。
  • 配置项目信息,注意Type要选择Maven POM,选择project的话,它会帮你生成整个完整的工程结构;选择pom的话,它只会在工程目录下生成pom.xml,而没有src等等结构。
  • 不选择依赖,直接下一步完成

网关路由功能

user_service

在父工程下面创建用户服务user_service模块

  • 在项目上右键>New>Module, 配置Group要跟最外层的一样,前面创建跟之前的一样,Type选择Maven Project.
  • 添加依赖Web->Spring Web 依赖
  • 安装位置:在父工程目录下新建一个user_service文件夹

UserController

新建controller目录在该目录下新建控制了UserController类。

package indi.xzw.user_service.control;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @GetMapping("/myuser-service/{id}")
    public String getMyUser(@PathVariable("id") String id){
        System.out.println("get User"+id);
        return "xiazhongwei:"+id;
    }

    @GetMapping("/user/{name}")
    public String getUser(@PathVariable("name") String name){
        System.out.println("get User"+name);
        return "xzw:"+name;
    }
}

配置文件

修改配置文件application.yaml

server:
  port: 8081

gateway_service

在父工程下面创建注册中心gateway_service模块

  • 在项目上右键>New>Module, 配置Group要跟最外层的一样,前面创建跟之前的一样,Type选择Maven Project.
  • 添加依赖Spring Cloud Routing-> Gateway 依赖
  • 安装位置:在父工程目录下新建一个gateway_service文件夹

pom依赖里面会自动添加

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

配置文件

server:
  port: 8080

service-url:
  user-service: http://localhost:8081

spring:
    cloud:
      gateway:
        routes:
          - id: my_route
            uri: ${service-url.user-service}/myuser-service/{id}
            predicates:
              - Path=/myuser-service/{id}
          - id: my_route1
            uri: ${service-url.user-service}
            predicates:
              - Path=/user/{name}

  • id: 路由的ID
  • uri: 匹配后路由地址
  • predicates: 断言,路径相匹配的进行路由
  • 这里第一个路由是把http://localhost:8080/myuser-service/路由到http://localhost:8081/myuser-service/,这里路径名要一致。
  • 第二个路由是把所有http://localhost:8080/user/路由到http://localhost:8081/user/,这里uri里面的路径名没有写默认是和原始的路径名一致

运行

访问http://127.0.0.1:8080/user/xzw 被路由到了http://127.0.0.1:8081/user/xzw

访问http://localhost:8080/myuser-service/3被路由到了http://localhost:8081/myuser-service/3

109

动态路由负载均衡

eureka_service(注册中心)

在父工程下面创建注册中心eureka_service模块

  • 在项目上右键>New>Module, 配置Group要跟最外层的一样,前面创建跟之前的一样,Type选择Maven Project.
  • 添加依赖Spring Cloud Discovery -> Eureka Server 依赖
  • 安装位置:在父工程目录下新建一个eureka_service文件夹

启动类

在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能

配置文件

server:
  #指定运行端口
  port: 8083
spring:
  application:
    # 指定服务名称
    name: eureka-service

eureka:
  instance:
    # 指定主机地址
    hostname: localhost
  client:
    #指定是否要从注册中心获取服务(注册中心不需要开启)
    fetch-registry: false
    #指定是否要注册到注册中心(注册中心不需要开启)
    register-with-eureka: false
  server:
    #关闭保护模式
    enable-self-preservation: false

修改gateway_service

添加依赖

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

添加配置文件

先将application.yaml重命名为application-dev.yaml

添加application-eureka.yml配置文件:

server:
  port: 8080

spring:
  application:
    name: gateway-service

  cloud:
    gateway:
      discovery:
        locator:
          # 开启从注册中心动态创建路由的功能
          enabled: true
          # 使用小写服务名
          lower-case-service-id: true

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8083/eureka/
  instance:
  	# 将IP注册到eureka中,如果为false默认注册主机名
    prefer-ip-address: true

logging:
  level:
    # 开启gateway日志
    org.springframework.cloud.gateway: debug

使用application-eureka.yaml配置文件新建一个启动类

  • 进入配置界面,选择左上角 + 号,

  • 并依次填入启动配置的名字:user-01 (随意取)

  • 选择工程的启动类:indi.xzw.gateway_service.GatewayServiceApplication

  • 输入启动参数:--spring.profiles.active=eureka ( --spring.profiles.active=是固定格式,eureka 是用以指定调用的配置文件)

    110

修改user_service

添加依赖

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

添加配置文件

新建application-user1.yaml

server:
  port: 7070

spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8083/eureka/
    register-with-eureka: true
    fetch-registry: true
  instance:
  	# 将IP注册到eureka中,如果为false默认注册主机名
    prefer-ip-address: true

新建application-user2.yaml

server:
  port: 7071

spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8083/eureka/
    register-with-eureka: true
    fetch-registry: true
  instance:
    prefer-ip-address: true

按照上面方法使用这两个配置文件新建启动程序user1,user2

运行

过滤器

修改gateway_service

添加application-filter.yml配置文件:

server:
  port: 8080

spring:
  application:
    name: gateway-service

  cloud:
    gateway:
      discovery:
        locator:
          # 开启从注册中心动态创建路由的功能
          enabled: true
          # 使用小写服务名
          lower-case-service-id: true

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8083/eureka/
  instance:
    prefer-ip-address: true

logging:
  level:
    # 开启gateway日志
    org.springframework.cloud.gateway: debug

uri的协议为lb,这样才能启用Gateway的负载均衡功能。

根据这个配置文件新建启动程序gateway_filter

运行

启动gateway_filter替代gateway_eureka

访问http://127.0.0.1:8080/xiazhongwei就会被路由到user-service的http://127.0.0.1:7070/user/xiazhongwei或http://127.0.0.1:7071/user/xiazhongwei

111

问题

UnknownHostException

报错:

java.net.UnknownHostException: failed to resolve 'DESKTOP-7GMIRBP' after 2 queries 

解决:

配置项添加
eureka.instance.prefer-ip-address=true
解释:将IP注册到eureka中,如果为false默认注册主机名
默认情况下,Eureka 使用 hostname 进行服务注册,以及服务信息的显示。既然解析hostname错误我们就使用 IP 地址的方式

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×