• SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解


    1. 什么是gateway,什么是eureka注册中心以及为什么需要注册

      首先博主经过一周的到处乱撞,各种奇葩案例,走过的坑就希望大伙不去踩坑。所以下面的案例就直击重点,采用最简单的案例来为大家讲解,你一定会明白的!!!

      1.1什么是eureka Service注册中心

        首先要明白为什么需要注册,这里要用到SpringCloud的独立模块的概念,当我们一个大型项目有很多模块时(例如 一个购物网站 有购物车模块 用户管理模块 商品模块等),如果需要某个模块的接口去访问资源时,

        我们就得知道它的具体ip +端口+接口 。这时如果有一个统一的管理购物网站的东西,我输入

    • 统一管理地址+user----》访问用户模块
    • 统一管理地址+cart-----》访问购物车模块

      这时有同学就会疑惑 我一个项目的ip不是同一个吗,还需要一个统一管理地址不是多此一举。如果你的项目的不同模块处于不同服务器上,甚至所处区域都不一样时,ip就会衍生出非常之多(大型公司 淘宝等为了减轻服务器压力,在不同的地区放置了应对不同功能的服务器,整合成一个淘宝),这样是不是就突出了统一管理地址的作用。

      而注册中心就是把各个模块统一注册到eureka 注册中心中,只需要用网关+模块的应用名称(可以理解为模块的名字)就能访问到该模块的相关数据。

      1.2什么是gateway

        gateway通俗的简单理解就是网络协议转换器,下面的案例中gateway暂时仅充当公司项目中的断言-》转发的目的。结合eureka注册中心,gateway网关要想通过别名发现注册到eureka中的服务,他自己也得注册进去。下面上实例。

    2. eureka Service模块注册流程

      2.1新建一个SpringBoot 项目(具体新建就不说了,我取名为eureka-demo)

    主项目下只留pom,也就是上图的文件布局,为什么只留pom 是因为后面的模块才是各个具体功能模块,而主项目的pom是为了给模块的pom添加继承,统一各个模块的版本,方便管理。 

     eureka-demo的配置文件(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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>eureka-demo</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        
        
        <modules>
            <module>eureka-service</module>
            <module>eureka-server02</module>
            <module>server-provider</module>
            <module>server-consumer</module>
        </modules>
    
        <parent>
            <artifactId>spring-boot-starter-parent</artifactId>
            <groupId>org.springframework.boot</groupId>
            <version>2.3.6.RELEASE</version>
        </parent>
    
    
    <!--    集中自定义版本-->
        <properties>
    <!--        <maven.compiler.source>8</maven.compiler.source>-->
    <!--        <maven.compiler.target>8</maven.compiler.target>-->
            <spring-cloud.version> Hoxton.SR1</spring-cloud.version>
        </properties>
    
    
    
        <dependencyManagement>
            <dependencies>
    <!--            springCloud依赖-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type> pom</type>
                    <scope>import</scope>
                </dependency>
    
                <!--增加eureka-server的依赖-->
    
    
            </dependencies>
        </dependencyManagement>
    
    </project>

      2.2 新增模块eureka-server 

      

      2.3 新建resources资源文件夹,编写该模块的pom文件

    我这里时新建过了,所以是取消mark标记为资源文件,你们新建时就显示标记就行。

      

    pom文件如下(之后如果启动模块失败就三处test 整个文件目录)

    <?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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>org.example</groupId>
      <artifactId>eureka-service</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <parent>
        <groupId>org.example</groupId>
        <artifactId>eureka-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent> #====继承父版本,达到版本统一。
    
    
    
    
    
    
      <dependencies>
    <!--    测试依赖-->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
          <exclusions>
            <exclusion>
              <groupId>org.junit.vintage</groupId>
              <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
    
    <!--    netflix-eureka-client依赖-->
    <!--    <dependency>-->
    <!--      <groupId>org.springframework.cloud</groupId>-->
    <!--      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
    <!--    </dependency>-->
    
        <!--    web依赖-->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-netflix-eureka-server</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter</artifactId>
          </dependency>
    
      </dependencies>
    </project>

       2.4 编写application.yml文件(得在本模块resources下新建)

      

    server:
      port: 8761
    
    spring:
      application:
        name: eureka-service
    
    eureka:
      instance:
        hostname: eureka01
    
        prefer-ip-address: true #是否使用ip注册
        instance-id: ${spring.cloud.client.ip-address}:${server.port} #ip:port
    
      client:
        register-with-eureka: true #是否将自己注册到注册中心
        fetch-registry: true #是否从注册中心服务注册信息
        service-url:          #注册中心对外暴露的注册地址
          defaultZone: http://localhost:8761/eureka/
    #      http://${eureka.instance.hostname}:${server.port}/eureka/

     删除新建本模块下的App启动类(就是想改个名字方便启动时辨认)

    package org.example;
    
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @EnableEurekaServer
    @SpringBootApplication
    @RestController
    public class EurekaServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServiceApplication.class);
        }
    
        @GetMapping("/user")
        public String getUser(){
            return "gateway ok";
        }---------后续为了gateway来测试它,本来是要写在controller中的,这里只是为了方便测试。
    }

      这里面写了一个简单的测试接口,方便gateway 拦截,并用网关+Application-name属性去访问该模块。暂时写道这里只需要启动该模块,访问http://localhost:8761 进入如下界面说明注册成功!!!

     

    看到这里,总结以下:所谓的eureka注册就是通过配置yml 和pom依赖并通过eureka可视化平台看到自己的注册模块,没有难度吧。下面配置gateway

    3. 配置gateway项目文件

      3.1新建项目。

      常规的新建Springboot文件,pom依赖下面有,所以不勾选依赖看下面的pom注释也能明白有哪些依赖。

      3.2 pom编写

      

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example</groupId>
        <artifactId>gateway-study</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>gateway-study</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
            <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        </properties>
    
        <dependencies>
            <!--引入gateway依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
            <!--gateway也是需要注册到服务中心的-->
            <!--注入eureka client 依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.3.7.RELEASE</version>
                    <configuration>
                        <mainClass>com.example.gatewaystudy.GatewayStudyApplication</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <id>repackage</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>

      3.3 yml配置以及讲解

      

    server:
    port: 9527
    spring:
    application:
    name: cloud-gateway
    cloud:
    gateway:
    discovery:
    locator:
    enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由"

    routes:
    - id: eureka-service #payment_routh #路由的ID,没有固定规则,但要求唯一,建议配合服务名
    #uri: http://localhost:8761 #匹配后提供服务的路由地址 没有进行负载均衡
    uri: lb://eureka-service #匹配后提供服务的路由地址-------这里用的动态路由格式统一为 lb://注册进eureka服务中心的名字
    predicates:
    - Path=/server01/** #断言,路径相匹配的进行路由--------断言也就是匹配方式,当识别到/servero1/**时就会跳转上面的uri
    filters: #这个必须写
    - StripPrefix=1 # 请求/name/bar/foo,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo-----这里写的是只去掉一个,多了自然会导致路径错误,不同的访问url配置也不同

    eureka:
    instance:
    hostname: cloud-gateway-service
    client: # 服务提供者provider注册金eureka服务列表内
    service-url:
    register-with-eureka: true
    fetch-registry: true
    defaultZone: http://localhost:8761/eureka/

    gateway启动类如下

    package com.example.gatewaystudy;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.gateway.route.RouteLocator;
    import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.reactive.result.view.Rendering;
    
    @EnableEurekaClient
    @SpringBootApplication
    public class GatewayStudyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GatewayStudyApplication.class, args);
        }
    
    }

      

    前面说过,gateway想要通过Application-name发现注册到eureka的服务模块,自己就也得注册进去,多的部分也就是gateway配置部分。(总结就是匹配server01 然后转发到上面的uri)

      3.4 启动gateway,进行跨项目访问

        输入 localhost:9527/server01/user 得到下面的结果就全部完成了

    需要注意一点:gateway项目引入的依赖是:

    spring-cloud-starter-netflix-eureka-client

    而模块服务引入的依赖是
    spring-cloud-netflix-eureka-server

    总结上面的例子,我只举例了一个服务中心的注册。因为对于简单的理解gateway+eureka足够了,而使用yml的配置方式也是公司常用的使用方式。希望能帮助大家入门。少走弯路!!!!

        

  • 相关阅读:
    SQL Server ----- 备份数据库 生成(.bak)文件
    SQL Server ----- 生成sql 脚本
    SQLServer --------- 将sql脚本文件导入数据库
    sql 语言--- DML,DDL,DQL,DCL,TCL,CCL
    装系统 ---------- 了解 UEFI与Legacy、硬盘分区MBR和GPT
    web基础(请求转发与重定向、二者区别)
    request(获取请求信息、用户提交的数据)
    response(向客户端写入数据、对相应进行设置(状态码、响应头))
    HttpServlet类(servlet的实现方式、doGet方法与get提交、doPost方法与post提交)
    servlet(API、配置文件、生命周期)
  • 原文地址:https://www.cnblogs.com/cybg/p/14694790.html
Copyright © 2020-2023  润新知