zuul направляет запрос к серверу приложений tomcat root вместо контекстного пути - PullRequest
0 голосов
/ 03 февраля 2020

Мы строим облачный сервер Sprig с eureka и zuul.

Вот zuul yml:

management:
  context-path: /my-zuul
  endpoints:
    web:
      exposure:
        include: "*"
spring:
  profiles:
    active: devel
  application:
    name: my-zuul
  jmx:
    default-domain: my-zuul
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://(some eureka sever):8761/my-eureka/eureka
  instance:
    preferIpAddress: true
    metadata-map:
      management:
        context-path: ${management.context-path}/actuator
zuul:
  ignoredServices: '*'
  routes:
    my-auth:
      service-id: my-auth
      path: /auth/**
    my-hr:
      service-id: my-hr
      path: /hr/**
    my-user-management:
      service-id: my-user-management
      path: /user-management/**
    my-permit:
      service-id: my-permit
      path: /permit/**
  sensitive-headers: Cookie,Set-Cookie
  debug:
    requests: true
ribbon:
  ReadTimeout: 150000
  SocketTimeout: 160000
server:
  servlet:
    contextPath: /my-zuul
  port: 8080

И zuul 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>my</groupId>
    <artifactId>my-zuul</artifactId>
    <version>0.1.0</version>
    <packaging>war</packaging>
    <name>my-zuul</name>
    <description>Proxy server for my Cloud system</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
        <spring-boot-admin.version>2.2.1</spring-boot-admin.version>
    </properties>


    <dependencies>

        <!-- spring boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Security -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

        <!--spring cloud -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.2.1</version>
        </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>
        </dependencies>
    </dependencyManagement>

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

</project>

А вот, например, yml & pom одного из клиентских серверов: «my-auth»

yml:

management:
  context-path: /my-auth
  endpoints:
    web:
      exposure:
        include: "*"
spring:
  profiles:
    active: devel
  application:
    name: my-auth
  jmx:
    default-domain: my-auth
  datasource:
    url: jdbc:oracle:thin:@(some IP):1521:MYMDB
    username: SOME_USER
    password: 1
    driver-class-oracle: jdbc.driver.OracleDriver
eureka:
  client:
    serviceUrl:
      defaultZone: http://(some eureka sever):8761/my-eureka/eureka
  instance:
    metadata-map:
      management:
        context-path: ${management.context-path}/actuator
    status-page-url: http://${eureka.hostname}:${server.port}/my-auth/actuator
server:
  servlet:
    contextPath: /my-auth
  port: 8080

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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repositories -->
    </parent>
    <groupId>my</groupId>
    <artifactId>my-auth</artifactId>
    <version>0.1.0</version>
    <packaging>war</packaging>
    <name>my-auth</name>
    <description>Authentication server of my Cloud system</description>


    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
        <spring-boot-admin.version>2.2.1</spring-boot-admin.version>
    </properties>

    <dependencies>

        <!-- spring boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!--tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Security -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

        <!--spring cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.2.1</version>
        </dependency>

        <!-- Database(Oracle)-->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>12.2.0.1</version>
        </dependency>

        <!-- Lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>
        </dependencies>
    </dependencyManagement>

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

</project>


Мы развертываем наши приложения как WAR на серверах tomcat, и нам нужно разместить более 1 микросервиса на сервере, разделенном контекстным путем.

Когда я запрашиваю службу my-auth через сервер zuul ( http: // (zuul имя сервера): 8080 / my-zuul / auth) Я получаю ответ от root сервера tomcat, а не от пути к контексту my-auth

Также, когда я запрашиваю http: // (zuul имя сервера): 8080 / my-zuul / auth / my-auth, я получаю ответ от my-auth, и это неоднозначно, потому что я может запросить http: // (zuul имя сервера): 8080 / my-zuul / auth / my-other-path-on-that-tomcat и другой путь не является микросервисом, который разрешается по пути / авториз / * *

Я попытался установить stripPrefix: false, но он удаляет первое появление «auth» в пути (а не «my-auth», как я полагал), оставляя путь таким: http : // (zuul имя сервера): 8080 / my-zuul / my-auth. Я думаю, что это удобно, но безопасно ли указывать идентификатор службы для inte rnet? и это хорошее решение? Я думал, что получу путь, подобный этому http: // (zuul имя сервера): 8080 / my-zuul / auth, чтобы найти путь к контексту службы my-auth

Спасибо за ваше внимание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...