Версионность для web-сервисов

В рамках динамично развивающейся архитектуры довольно часто приходиться сталкиваться с ситуацией, когда сервис одной системы используется большим количеством независимых систем, обновление которых не возможно провести единовременно.

В таком случае перед разработчиком и администратором встаёт вопрос: “Как вести версионность?”. Самый простой и часто встречаемый вариант – это развёртывание рядом новой версии сервиса, с новым url. К минусам данного варианта можно отнести разростание инфраструктуры и увеличение потребляемых ресурсов. Переходный период может затянуться на продолжительное время, и как следствие этого, появиться n приложений, сходных по функционалу, но отличающихся, например, по передаваемым и получаемым значениям.

Вторым вариантом может быть использование одной версии сервиса, доступной по разным url и реализующей в рамках себя ветвление по разным бизнес потокам в зависимости от того, на какой url пришёл запрос. Именно такой вариант мы и рассмотрим.

Постановка задачи

Реализовать возможность прозрачной переадресации внешних запросов в рамках IIB с возможностью дальнейшей трансформации в зависимости от входящего URL.

Имеем

Веб сервис развёрнутый на IIB с точкой доступа: /SoapTest/soap/1.0, реализующий 3 мажорных и 2 минорных версии (1.0, 1.1, 2.0, 2.1, 3.0).

Реализация

1. Для внешних систем url веб сервиса имеет вид: /SoapTest/soap/test/”номер версии”
2. В рамках Apache в конфигурационном файле присутствуют директивы:

<Location /SoapTest/soap/test/*>
SetEnvIf Request_URI "^(.*)$" REQUEST_URI=$1

#RequestHeader set X-Request-Uri "%{Request_URI}e"
#RequestHeader set Location %{Request_URI}e
RequestHeader set Referer %{Request_URI}e
</Location>

RewriteEngine on
RewriteRule "^/SoapTest/soap/test/(.+)"  "/SoapTest/soap/all"  [P,QSA,NC]
ProxyPass /SoapTest/soap/all http://test-http-server1:8080/SoapTest/soap/1.0
ProxyPassReverse /SoapTest/soap/all http://test-http-server1:8080/SoapTest/soap/1.0

3. В приложение-сервис в заголовке Referer будут передаваться вызываемые версии сервиса (для этого так же можно использовать заголовки X-Request-Uri и Location).

Результаты переадресации

Url запроса:

http://test-http-server1:8080/SoapTest/soap/test/2.0

HTTP заголовки:

POST http://test-http-server1:7800/SoapTest/soap/1.0 HTTP/1.1
Host: test-http-server1:8080
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://www.example.org/TestSoap/SetLocalVar1"
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
X-Forwarded-For: ***, ***, ***, ***, ***
Referer: /SoapTest/soap/test/2.0
X-Forwarded-Host: test-http-server1:8080, test-http-server1:8080
X-Forwarded-Server: iib-server1, iib-server1
Content-Length: 278
$wsis: false
$wssc: http
$wspr: HTTP/1.1
$wsra: ***
$wsrh: ***
$wssn: test-http-server1
$wssp: 8080
Surrogate-Capability: WS-ESI="ESI/1.0+"
_ws_haprt_wlmversion: -1
Expect: 100-Continue
X-Remote-Addr: ***
X-Remote-Host: ***
X-Server-Name: test-http-server1
X-Server-Port: 7800

Url запроса:

http://test-http-server1:8080/SoapTest/soap/test/3.0

HTTP заголовки:

POST http://test-http-server1:7800/SoapTest/soap/1.0 HTTP/1.1
Host: test-http-server1:8080
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://www.example.org/TestSoap/SetLocalVar1"
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
X-Forwarded-For: ***, ***, ***, ***, ***
Referer: /SoapTest/soap/test/3.0
X-Forwarded-Host: test-http-server1:8080, test-http-server1:8080
X-Forwarded-Server: iib-server1, iib-server1
Content-Length: 278
$wsis: false
$wssc: http
$wspr: HTTP/1.1
$wsra: ***
$wsrh: ***
$wssn: test-http-server1
$wssp: 8080
Surrogate-Capability: WS-ESI="ESI/1.0+"
_ws_haprt_wlmversion: -1
Expect: 100-Continue
X-Remote-Addr: ***
X-Remote-Host: ***
X-Server-Name: test-http-server1
X-Server-Port: 7800

Url запроса: 

http://test-http-server1:8080/SoapTest/soap/test/1.1

HTTP заголовки:

POST http://test-http-server1:7800/SoapTest/soap/1.0 HTTP/1.1
Host: test-http-server1:8080
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://www.example.org/TestSoap/SetLocalVar1"
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
X-Forwarded-For: ***, ***, ***, ***, ***
Referer: /SoapTest/soap/test/1.1
X-Forwarded-Host: test-http-server1:8080, test-http-server1:8080
X-Forwarded-Server: iib-server1, iib-server1
Content-Length: 278
$wsis: false
$wssc: http
$wspr: HTTP/1.1
$wsra: ***
$wsrh: ***
$wssn: test-http-server1
$wssp: 8080
Surrogate-Capability: WS-ESI="ESI/1.0+"
_ws_haprt_wlmversion: -1
Expect: 100-Continue
X-Remote-Addr: ***
X-Remote-Host: ***
X-Server-Name: test-http-server1
X-Server-Port: 7800

Url запроса:

http://test-http-server1:8080/SoapTest/soap/test/2.1

HTTP заголовки:

POST http://test-http-server1:7800/SoapTest/soap/1.0 HTTP/1.1
Host: test-http-server1:8080
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://www.example.org/TestSoap/SetLocalVar1"
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
X-Forwarded-For: ***, ***, ***, ***, ***
Referer: /SoapTest/soap/test/2.1
X-Forwarded-Host: test-http-server1:8080, test-http-server1:8080
X-Forwarded-Server: iib-server1, iib-server1
Content-Length: 278
$wsis: false
$wssc: http
$wspr: HTTP/1.1
$wsra: ***
$wsrh: ***
$wssn: test-http-server1
$wssp: 8080
Surrogate-Capability: WS-ESI="ESI/1.0+"
_ws_haprt_wlmversion: -1
Expect: 100-Continue
X-Remote-Addr: ***
X-Remote-Host: ***
X-Server-Name: test-http-server1
X-Server-Port: 7800

VN:F [1.9.22_1171]
Rating: 5.0/5 (2 votes cast)
Метки: , , ,
Опубликовано в IBM HTTP Server & Plug-in, WebSphere Message Broker

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Выбор языка: