SpringCloud+Nacos+Gateway

SpringCloud+Nacos+Gateway

    • SpringBoot整合Gateway+Nacos
      • 一. 环境准备
        • 1. 版本环境
        • 2. 服务环境
      • 二. 实战
        • 1.创建用户服务
        • 2.创建订单服务
        • 3.创建网关服务
        • 4.测试
      • 三. 避坑指南
        • 问题1--503问题
        • 问题2--网关服务启动报错


SpringBoot整合Gateway+Nacos

本篇文章只演示通过gateway网关服务访问其他服务,不对gateway的其他功能做演示

一. 环境准备

1. 版本环境
  • Jdk: 1.8
  • SpringBoot: 2.4.2
  • SpringCloud: 2020.0.1
  • SpringCloudAlibaba: 2021.1

以下是项目中pom配置,可拿来直接使用

1. 独立订单/用户服务pom文件


<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.4.2version>
        <relativePath/> 
    parent>
    <groupId>com.scggroupId>
    <artifactId>spring-cloud-order-centerartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>spring-cloud-order-centername>
    <description>Demo project for Spring Bootdescription>
    <properties>
        <java.version>1.8java.version>
        <spring.cloud.version>2020.0.1spring.cloud.version>
        <spring-cloud-alibaba.version>2021.1spring-cloud-alibaba.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring.cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.24version>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

2. 独立网关服务pom文件


<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.4.2version>
        <relativePath/> 
    parent>
    <groupId>com.scggroupId>
    <artifactId>spring-cloud-nacosartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>spring-cloud-gatewayname>
    <description>Demo project for Spring Bootdescription>
    <properties>
        <java.version>1.8java.version>
        <spring.cloud.version>2020.0.1spring.cloud.version>
        <spring-cloud-alibaba.version>2021.1spring-cloud-alibaba.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring.cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-gatewayartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>
project>
2. 服务环境

本节使用一个简单的案例来演示Spring Cloud Gateway的使用方法,首先我们准备三个SpringBoo应用:

  • spring-cloud-user-center : 独立用户服务
  • spring-cloud-order-center : 独立订单服务
  • spring-cloud-gateway: 独立的网关服务

二. 实战

1.创建用户服务
  1. 引入相关依赖
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
  1. yml配置
server:
  port: 8085

spring:
  application:
    name: spring-cloud-user-center
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        ip: 127.0.0.1
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 编写测试类
/**
 * @author gf
 * @date 2023/2/14
 */
@Slf4j
@RestController
public class UserController {
    @RequestMapping("/user")
    public String user(){
        log.info("hello Mr gateway,this is user serve");
        return "hello Mr gateway,this is user serve";
    }
}

由于我们要将服务注册倒注册中心,所以我们在引入nacos依赖后要在启动类上添加@EnableDiscoveryClient注解

@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudUserCenterApplication {

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

}
2.创建订单服务

创建订单服务和创建用户服务的过程一致,我们可以在测试类上做些改变以区分后面的调用
订单服务测试类

@Slf4j
@RestController
public class OrderController {
    @RequestMapping("/order")
    public String getOrder(){
        log.info("hello Mr gateway,this is order serve");
        return "hello Mr gateway,this is order serve";
    }
}

3.创建网关服务
  1. 引入相关依赖

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.4.2version>
        <relativePath/> 
    parent>
    <groupId>com.scggroupId>
    <artifactId>spring-cloud-nacosartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>spring-cloud-gatewayname>
    <description>Demo project for Spring Bootdescription>
    <properties>
        <java.version>1.8java.version>
        <spring.cloud.version>2020.0.1spring.cloud.version>
        <spring-cloud-alibaba.version>2021.1spring-cloud-alibaba.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring.cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-gatewayartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>
project>
  1. 配置yml文件
server:
  port: 8082
spring:
  application:
    name: gateway_server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          #开启从注册中心动态创建路由的功能,利用微服务名进行路由
          enabled: true
          #开启小写验证,默认feign根据服务名查找都是用的全大写
          lowerCaseServiceId: true
      routes:
        - id: spring-cloud-order-center
          uri: lb://spring-cloud-order-center
          # 断言,路径相匹配的进行路由
          predicates:
            - Path=/order-center/**
          filters:
            - StripPrefix=1

        - id: spring-cloud-user-center
          uri: lb://spring-cloud-user-center
          # 断言,路径相匹配的进行路由
          predicates:
            - Path=/user-center/**
          filters:
            - StripPrefix=1
management:
  endpoints:
    web:
      exposure:
        include: "*"


`3. 启动类添加@EnableDiscoveryClient注解

```java
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudGatewayApplication {

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

}
4.测试

同时启动三台服务,我们可以看到这三者服役已经注册到了nacos注册中心中

按照我们的配置,访问http://localhost:8082/user-center/user会调用用户中心的的user接口,访问http://localhost:8082/order-center/order会调用订单中心的order接口,接下来我们测试一下
SpringCloud+Nacos+Gateway_第1张图片

通过网关访用户服务
SpringCloud+Nacos+Gateway_第2张图片

通过网关访订单服务
SpringCloud+Nacos+Gateway_第3张图片

三. 避坑指南

问题1–503问题

SpringCloud+Nacos+Gateway_第4张图片
解决办法:添加如下依赖

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>

问题原因:
参考:gateway 503 问题

问题2–网关服务启动报错
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' in your configuration.


Process finished with exit code 1

问题原因:

这是由于所依赖的模块中有 spring-boot-starter-web 的依赖,而 SpringCloudGateway 还不支持 spring-boot-starter-web

解决方案:

网关服务去掉spring-boot-starter-web依赖

  <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

你可能感兴趣的:(SpringCloud,SpringBoot,spring,cloud,gateway,spring,boot)