SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解 1. 什么是gateway,什么是eureka注册中心以及为什么需要注册 2. eureka Service模块注册流程 3. 配置gateway项目文件

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

  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)

SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件

主项目下只留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 

  SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件

SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件

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

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

  SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件

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启动类(就是想改个名字方便启动时辨认)

SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件

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 进入如下界面说明注册成功!!!

 SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件

看到这里,总结以下:所谓的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 得到下面的结果就全部完成了

SpringCloud 详细网关gateway 与 eureka注册中心 以及如何结合使用的案例讲解
1. 什么是gateway,什么是eureka注册中心以及为什么需要注册
2. eureka Service模块注册流程
3. 配置gateway项目文件

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

spring-cloud-starter-netflix-eureka-client

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

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