Мы строим облачный сервер 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
Спасибо за ваше внимание