• SpringCloud gateway


    NacosSpringCloud Nacos-CSDN博客 

    *****************************************************

    认识网关 

    什么是网关?

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

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

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

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

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

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

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

    案例

    项目初建

    新建一个springboot项目,导入如下依赖

    把src删掉后,目录结构是这样的

    将pom.xml里面的一些不必要的东西去掉(build dependencies),这个pom文件将作为parent来管理子模块的依赖

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.examplegroupId>
    6. <artifactId>demo-gateway02artifactId>
    7. <version>0.0.1-SNAPSHOTversion>
    8. <name>demo-gateway02name>
    9. <description>demo-gateway02description>
    10. <properties>
    11. <java.version>17java.version>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    14. <spring-boot.version>3.0.2spring-boot.version>
    15. <spring-cloud-alibaba.version>2022.0.0.0-RC2spring-cloud-alibaba.version>
    16. <spring-cloud.version>2022.0.0-RC2spring-cloud.version>
    17. properties>
    18. <dependencyManagement>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.cloudgroupId>
    22. <artifactId>spring-cloud-dependenciesartifactId>
    23. <version>${spring-cloud.version}version>
    24. <type>pomtype>
    25. <scope>importscope>
    26. dependency>
    27. <dependency>
    28. <groupId>org.springframework.bootgroupId>
    29. <artifactId>spring-boot-dependenciesartifactId>
    30. <version>${spring-boot.version}version>
    31. <type>pomtype>
    32. <scope>importscope>
    33. dependency>
    34. <dependency>
    35. <groupId>com.alibaba.cloudgroupId>
    36. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    37. <version>${spring-cloud-alibaba.version}version>
    38. <type>pomtype>
    39. <scope>importscope>
    40. dependency>
    41. dependencies>
    42. dependencyManagement>
    43. <repositories>
    44. <repository>
    45. <id>spring-milestonesid>
    46. <name>Spring Milestonesname>
    47. <url>https://repo.spring.io/milestoneurl>
    48. <snapshots>
    49. <enabled>falseenabled>
    50. snapshots>
    51. repository>
    52. repositories>
    53. project>

    user-service模块 

    新建一个user-service模块,导入需要的依赖

    修改pom文件 (去掉properties,dependence management     引入parent)

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.examplegroupId>
    6. <artifactId>user-serviceartifactId>
    7. <version>0.0.1-SNAPSHOTversion>
    8. <name>user-servicename>
    9. <description>user-servicedescription>
    10. <parent>
    11. <groupId>com.examplegroupId>
    12. <artifactId>demo-gateway02artifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. parent>
    15. <dependencies>
    16. <dependency>
    17. <groupId>org.springframework.bootgroupId>
    18. <artifactId>spring-boot-starter-webartifactId>
    19. dependency>
    20. <dependency>
    21. <groupId>com.alibaba.cloudgroupId>
    22. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-testartifactId>
    27. <scope>testscope>
    28. dependency>
    29. dependencies>
    30. <build>
    31. <plugins>
    32. <plugin>
    33. <groupId>org.apache.maven.pluginsgroupId>
    34. <artifactId>maven-compiler-pluginartifactId>
    35. <version>3.8.1version>
    36. <configuration>
    37. <source>17source>
    38. <target>17target>
    39. <encoding>UTF-8encoding>
    40. configuration>
    41. plugin>
    42. <plugin>
    43. <groupId>org.springframework.bootgroupId>
    44. <artifactId>spring-boot-maven-pluginartifactId>
    45. <version>${spring-boot.version}version>
    46. <configuration>
    47. <mainClass>com.example.UserServiceApplicationmainClass>
    48. <skip>trueskip>
    49. configuration>
    50. <executions>
    51. <execution>
    52. <id>repackageid>
    53. <goals>
    54. <goal>repackagegoal>
    55. goals>
    56. execution>
    57. executions>
    58. plugin>
    59. plugins>
    60. build>
    61. project>

    在parent的pom文件下修改打包方式为pom  并标记modules

     

    注册nacos服务

    user-service的端口号为8090

    1. # 应用服务 WEB 访问端口
    2. server.port=8090
    3. # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
    4. spring.application.name=user-service
    5. # Nacos认证信息
    6. spring.cloud.nacos.discovery.username=nacos
    7. spring.cloud.nacos.discovery.password=nacos
    8. # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
    9. #虚拟机的ip为192.168.168.168
    10. spring.cloud.nacos.discovery.server-addr=192.168.168.168:8848
    11. # 注册到 nacos 的指定 namespace,默认为 public
    12. spring.cloud.nacos.discovery.namespace=public

    写一个控制器,用于等下测试

    1. package com.example.controller;
    2. import org.springframework.web.bind.annotation.GetMapping;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. @RestController
    6. @RequestMapping("/home")
    7. public class UserController {
    8. @GetMapping("hello")
    9. public String hello() {
    10. return "this is user-service";
    11. }
    12. }

    order-service模块

    order-service模块的创建如法炮制

     parent的pom也要知道它的存在

    注册nacos服务 ,服务的端口号为8091


    控制器

    做完这些工作后,项目的结构如下

    试着启动order-service 和 user-service  在nacos可以看到注册的两个服务

    gateway-service模块

    新建一个gateway-service ,导入如下依赖

    不能导入web的起步依赖,因为web里面默认使用tomcat服务器,gateway自带了netty服务器,两者会冲突

    需要额外导入loadbalancer   用于负载均衡

    gateway的pom文件如下

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.examplegroupId>
    6. <artifactId>gateway-serviceartifactId>
    7. <version>0.0.1-SNAPSHOTversion>
    8. <name>gateway-servicename>
    9. <description>gateway-servicedescription>
    10. <parent>
    11. <groupId>com.examplegroupId>
    12. <artifactId>demo-gateway02artifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. parent>
    15. <dependencies>
    16. <dependency>
    17. <groupId>org.springframework.cloudgroupId>
    18. <artifactId>spring-cloud-starter-loadbalancerartifactId>
    19. dependency>
    20. <dependency>
    21. <groupId>com.alibaba.cloudgroupId>
    22. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.cloudgroupId>
    26. <artifactId>spring-cloud-starter-gatewayartifactId>
    27. dependency>
    28. <dependency>
    29. <groupId>org.springframework.bootgroupId>
    30. <artifactId>spring-boot-starter-testartifactId>
    31. <scope>testscope>
    32. dependency>
    33. dependencies>
    34. <build>
    35. <plugins>
    36. <plugin>
    37. <groupId>org.apache.maven.pluginsgroupId>
    38. <artifactId>maven-compiler-pluginartifactId>
    39. <version>3.8.1version>
    40. <configuration>
    41. <source>17source>
    42. <target>17target>
    43. <encoding>UTF-8encoding>
    44. configuration>
    45. plugin>
    46. <plugin>
    47. <groupId>org.springframework.bootgroupId>
    48. <artifactId>spring-boot-maven-pluginartifactId>
    49. <version>${spring-boot.version}version>
    50. <configuration>
    51. <mainClass>com.example.GatewayServiceApplicationmainClass>
    52. <skip>trueskip>
    53. configuration>
    54. <executions>
    55. <execution>
    56. <id>repackageid>
    57. <goals>
    58. <goal>repackagegoal>
    59. goals>
    60. execution>
    61. executions>
    62. plugin>
    63. plugins>
    64. build>
    65. <repositories>
    66. <repository>
    67. <id>spring-milestonesid>
    68. <name>Spring Milestonesname>
    69. <url>https://repo.spring.io/milestoneurl>
    70. <snapshots>
    71. <enabled>falseenabled>
    72. snapshots>
    73. repository>
    74. repositories>
    75. project>

    parent的pom文件也要知道它的存在

    在application.properties中注册nacos服务,编写gateway转发规则

    1. # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
    2. spring.application.name=gateway-service
    3. # Nacos认证信息
    4. spring.cloud.nacos.discovery.username=nacos
    5. spring.cloud.nacos.discovery.password=nacos
    6. # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
    7. spring.cloud.nacos.discovery.server-addr=192.168.168.168:8848
    8. # 注册到 nacos 的指定 namespace,默认为 public
    9. spring.cloud.nacos.discovery.namespace=public
    10. # gateway 请求配置
    11. # 允许跨域
    12. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origin-patterns=*
    13. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedHeaders=*
    14. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowCredentials=true
    15. # 允许以下请求方式的请求
    16. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[0]=GET
    17. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[1]=POST
    18. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[2]=PUT
    19. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[3]=DELETE
    20. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[4]=OPTIONS
    21. spring.cloud.gateway.discovery.locator.enabled=true
    22. # 配置gateway的转发规则
    23. # user-service
    24. # id 需要跟服务注册中心一致
    25. spring.cloud.gateway.routes[0].id=user-service
    26. # uri值需要跟服务注册中心一致
    27. spring.cloud.gateway.routes[0].uri=lb://user-service
    28. # 路径里面带user就需要转发到user-service
    29. spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**
    30. # 移除前缀
    31. spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1
    32. # order-service
    33. # id 需要跟服务注册中心一致
    34. spring.cloud.gateway.routes[1].id=order-service
    35. # uri值需要跟服务注册中心一致
    36. spring.cloud.gateway.routes[1].uri=lb://order-service
    37. # 路径里面带order就需要转发到order-service
    38. spring.cloud.gateway.routes[1].predicates[0]=Path=/order/**
    39. # 移除前缀
    40. spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1

    最终的目录结构如下

    测试

    现在启动 user-service order-service gateway-service,在nacos的服务列表中可以看到我们注册的3个服务

     现在访问一下user-service和order-service的控制器,检查是否能够正常访问(注意看端口)

    现在我们通过网关访问一下这两个模块,可以看到成功访问了

    总结

    由此案例,我们可以感受到gateway带给我们的方便。有了gateway,前端就只需要请求8080端口,以模块进行路径的书写,就能访问所有的后端接口了,同时gateway也解决了跨域的问题。

  • 相关阅读:
    Q-learning算法实战
    QT学习日记28——QT动态库制作和使用
    信息技术 安全技术 信息安全管理测量
    【Python百宝箱】探索数据科学的瑞士军刀:Python机器学习库大揭秘
    Mysql和Elasticsearch的数据同步
    著名童星刘佳琪深圳市中心举办个人Live音乐汇专辑发布会圆满成功
    交换两个数字(字符) 学习随笔
    matlab中类的分别之handle类和value类——matlab无法修改类属性值的可能原因
    说说switch关键字
    解决npm run build 打包出现XXXX.js as it exceeds the max of 500KB.
  • 原文地址:https://blog.csdn.net/c1tenj2/article/details/142130368