2013-08-13 26 views
9

Chúng tôi đang tạo API bằng cách sử dụng ServiceStack là người thuê nhiều người. Chúng tôi muốn thực hiện việc cân bằng tải và định tuyến dựa trên DNS, thay vì ghép các thứ lên thông qua proxy ngược (như nginx hoặc haproxy).API ServiceStack nhiều bên thuê, cùng triển khai để phản hồi các yêu cầu trên tên máy chủ khác nhau?

Chúng tôi có Yêu cầu DTO có tham số Người thuê. ServiceStack (và SwaggerFeature) cho phép chúng tôi xác định các tuyến tùy chỉnh và ghi lại các DTO sao cho chúng ta có thể đọc các giá trị từ đường dẫn, truy vấn, tiêu đề hoặc nội dung.

Làm cách nào để chúng tôi (tốt nhất) điều dây để các thuộc tính DTO có thể đọc các giá trị từ mẫu tên máy chủ lưu trữ? Vì vậy, làm cho Route lấy giá trị từ khớp với tên máy chủ cũng như đường dẫn?

Chúng tôi muốn có URL như

  • https://{tenant}.{DNS zone for environment}/{rest of path with tokens}

Ngoài ra - ra vùng DNS sẽ thay đổi tùy theo mà môi trường chúng ta đang ở - cho phi sản xuất chúng tôi sử dụng (nói) testing-foobar.com và sản xuất chúng tôi sử dụng real-live.com. Lý tưởng nhất là chúng tôi có thể hỗ trợ cả hai với một tuyên bố tuyến đường duy nhất (và chúng tôi thích trang trí Yêu cầu DTO thay vì khai báo bắt buộc tại thời gian chạy AppHost.Init).

+1

Độ nghiêng đầu tiên của tôi là sử dụng [bộ lọc yêu cầu và phản hồi] (https://github.com/ServiceStack/ServiceStack/wiki/Request-and-response-filters) Bạn đã cân nhắc chúng chưa? –

+4

Tôi muốn sử dụng một bộ lọc yêu cầu tiêm bất kỳ yêu cầu DTO mà thực hiện một tùy chỉnh 'ITenant' giao diện mà chỉ có một' Tenant' tài sản. Một giải pháp khác là sử dụng phương thức mở rộng 'IHttpRequest.Tennant()' mà bạn có thể sử dụng lại bên trong tất cả các dịch vụ kiểm tra các thuộc tính AbsoluteUri hoặc RawUrl. – mythz

+0

@mythz - có một ví dụ nào đó giới thiệu cách triển khai điều này trong ServiceStack không? – Marek

Trả lời

3

Tôi đã giải quyết vấn đề này chỉ trong tuần này, trên hệ thống nhiều người thuê hiện có sử dụng các hiệu trưởng bảo mật .NET để xử lý các quyền người dùng và người thuê. Tôi đã sử dụng ServiceRunner tùy chỉnh để chọn người thuê và thiết lập bảo mật. Cách tiếp cận của bạn với người thuê nhiều người là khác nhau, nhưng việc sử dụng ServiceRunner vẫn có vẻ là một cách tiếp cận hợp lệ.

Bạn muốn kết thúc với một cái gì đó như thế này:

public class MyServiceRunner<T> : ServiceRunner<T> 
{ 
    public MyServiceRunner(IAppHost appHost, ActionContext actionContext) 
     : base(appHost, actionContext) 
    {} 

    public override void BeforeEachRequest(IRequestContext requestContext, T request) 
    { 
     // Set backend authentication before the requests are processed. 
     if(request instanceof ITenantRequest) 
     { 
      Uri uri = new Uri(requestContext.AbsoluteUri); 
      string tenant = uri.Host; // Or whatever logic you need... 
      ((ITenantRequest).Tenant = tenant; 
     } 
    } 
} 

public class MyAppHost : AppHostBase 
{ 
    public MyAppHost() : base("My Web Services", typeof(MyService).Assembly) { } 

    public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext) 
    { 
     return new MyServiceRunner<TRequest>(this, actionContext); 
    } 

    public override void Configure(Container container) 
    { 
     ... 
    } 
} 

Có lẽ yêu cầu phương pháp lọc là bằng cách nào đó tốt hơn, nhưng điều này không được công việc cho chúng tôi.

+0

Chúng tôi đã có một IServiceRunner để làm UnitOfWork của chúng tôi - Tôi không nghĩ rằng những người có thể bị xích –

Các vấn đề liên quan