2012-01-29 6 views
5

현재 Google 네트워크에는 3 개의 사이트가 있습니다. 하나는 Ruby on Rails로 작성된 것이고 다른 하나는 PHP로 작성된 것입니다. 모든 사이트는 동일한 데이터와 로직을 공유하는 경향이 있습니다. 필자는 PHP 측의 레일 사이드에서 많은 작업을 반복해야한다는 것을 알게되었습니다. 이것을 통합하기위한 공통의 내부 API가 필요한 것처럼 보입니다. 전에 API를 작성한 적이 없으며 몇 가지 질문이 있습니다. 내가 별도의 응용 프로그램으로 API를 빌드하는 경우이 두 배 느린 것처럼내부 REST API

  • 성능 것 같습니다. API가 끝날 때까지 전체 요청/응답주기를 거쳐야하므로 공개 애플리케이션 측에서 다시 시도해야합니다. 이 작업을 더 빠르게 수행 할 수있는 방법이 있습니까? 아니면 다른 접근 방식일까요?

  • 로컬 네트워크를 통한 API 액세스 로컬 네트워크를 통해 API에 액세스하려면 어떻게해야합니까? 127.0.0.1을 가리키는 Apache에 가상 호스트를 설정하겠습니까?

  • Active Resource 내 경우에는 (레일 끝) ActiveResource가 가장 좋은 방법이며, API를 사용하는 데 더 좋은 옵션이 있습니까? 또한 공용 측에서 유효성 검사가 어떻게 작동하는지 궁금합니다. ActiveResource가 유효성 검사 규칙을 재사용합니까, 아니면 공용 측에서 다시 작성해야합니까?

  • API 보안 API는 로컬 네트워크를 통해서만 (이상적으로) 액세스 할 수 있기 때문에 걱정할 필요가 없습니다. 이 가정에서 나는 맞습니까?

답변

2

이 특정 주제를 다루는 whole books이 있습니다. 서비스를 만들 때 대기 시간, 안정성, 유연성 및 기타 모든 기능을 관리합니다.

매우 일반적인 관점에서 본 것처럼 비교적 간단한 사용 사례에서 각 응용 프로그램에 REST 기반 API를 사용하는 것이 좋습니다. PHP에서 이미 Ruby로 작성된 코드를 반복하고 싶지 않으며 그 반대의 경우도 마찬가지입니다. 응답 시간은 경쟁 HTTP 쿼리 방식 (HTTP 대 CORBA와 같은 것에 대해 말할 때와 크게 다르지 않습니다.) 간에는 너무 많이 사용되지 않을 것입니다. REST 리소스를 작성하는 것이 Ruby on Rails의 장점이다. 그래서 당신은 꽤 많이 가지고있다. PHP는 조금 더 어려워 질 뿐이며, REST 표준을 따르는 방식으로 쿼리 가능한 API를 구조해야한다. 그 후, 두 클라이언트 중 하나에 대한 요청을 수행하기 위해 HTTP 클라이언트 만 있으면됩니다. 각 응용 프로그램에 대해 끝점을 잘 정의했다면 하드 코드를 너무 많이해서는 안됩니다. 그렇지 않다면 enterprise service buses 주위에 또 다른 하나의 서비스가 다른 서비스를 찾도록 돕는 또 다른 전체 디자인 패턴이 있지만, 일반적으로 크로스 플랫폼 기능은 없습니다 (적어도 PHP와 Rails 간에는 그렇지 않습니다 - 내가 알고있는 것은 !).

Ruby/Rails의 경우 HTTP 클라이언트 또는 Typheous를 HTTP 클라이언트로 권장 할 수 있습니다 (다른 응용 프로그램의 REST 클라이언트에 쿼리합니다). PHP 세계에서, this thread을 들여다 볼 수 있습니다. 몇 가지 목록이 있습니다.

분명히 말하면 이것은 유일한 옵션이 아닙니다. 웹 서비스에서 전체를 만들 수 있으며 직접 소켓 연결을 생성하여 더욱 깊어질 수 있습니다. 실제로 시스템이 얼마나 밀접하게 결합되어 있는지, 얼마나 긴밀하게 결합되었는지, 얼마나 가까이 있는지 ("네트워크 토폴로지"의 의미에서), 각 시스템에서 제공하는 응답 속도가 얼마나 중요한지에 달려 있습니다.

보안 관련 : 특정 시스템에서 특정 리소스로 연결되는 경우에만 특정 리소스로 연결되는 연결 만 허용하도록 각 시스템에서 방화벽을 설정하는 것이 좋습니다. 응용 프로그램 수준에서 비슷한 패턴을 따를 수 있습니다. 기본/다이제스트 인증을 사용하여 표준 HTTPS 세션을 보안하는 것과 마찬가지로 많은 행운을 누릴 수 있습니다.

희망이 도움이됩니다. 나는 이것에 대해 더 오래 지속 할 수는 있지만 어떤 좋은 방법이 있는지 알지 못한다. 하나의 구체적인 대답이 일반적인 질문에. 내가 확장 할 수있는 것이 있다면, 자유롭게 의견을 말하면 될 수있는대로하겠다.

+0

좋은 답변입니다. DNS/Apache를 어떻게 설정해야하는지 조금 이야기 해 주시겠습니까? A 레코드가 127.0.0.1 인 api.mycompany.com에 대한 DNS 항목을 간단하게 작성하면 충분합니까? 또는 서버 IP를 가리키고 해당 IP에만 대한 액세스를 제한하는 방화벽 규칙이 성능에 영향을 줍니까? 또는 IP가 로컬이고 127.0.0.1과 동일하다는 것을 알면 충분히 똑똑할까요? – Andrew

+0

정말 네트워크 토폴로지에 따라 다릅니다. 두 응용 프로그램이 동일한 시스템에있는 경우, 서로를 직접 쉽게 가리킬 수 있습니다. 아파치 내에서 어떤 형태의 가상 호스팅을 사용하고 있다면 올바르게 작동하지 않을 수 있습니다. 이 경우, 로컬 시스템에 호스트 레코드를 설정해야합니다 (즉,/etc/hosts에서 api.mycompany.com을 127.0.0.1로 지정). –

+0

방화벽 질문에 대해서는 아마도 개별 리눅스 배포판을 확인해야 할 것입니다. 예를 들어 Ubuntu에 있다면 UFW로 작업하게 될 것입니다. CentOS/RedHat 등을 사용하고 있다면 iptables로 직접 작업해야합니다. 개인적으로 iptables는 특별한 경우에 다루기가 더 쉽다고 생각합니다. 당신이 만든 API에 들어오는 모든 트래픽을 거의 차단하고 있기 때문입니다. –