Bạn đặt và truy cập các thông số cấu hình thời gian chạy trên mỗi môi trường cho kết cấu dịch vụ ở đâu?


82

Đối với hai môi trường, cục bộ và đám mây, làm cách nào để thiết lập cài đặt hoặc thông số tùy chỉnh cho các tài nguyên như cơ sở dữ liệu Sql, tài khoản lưu trữ, v.v. cơ sở dữ liệu, mà trong các cấu hình cho môi trường cục bộ hoặc đám mây là khác nhau. Cảm ơn bạn.


Mặc dù tôi ước họ bao gồm mã ứng dụng để thực sự sử dụng cấu hình, nhưng Microsoft sẽ chỉ cho bạn cách thiết lập nó trong bài viết sau: docs.microsoft.com/en-us/azure/service-farel/…
Adam Plocher

Câu trả lời:


144

Để có mỗi biến môi trường để chạy Service Fabric cục bộ và trên đám mây, đây là những gì bạn phải làm:

  1. Thêm phần và thông số cấu hình tùy chỉnh của bạn vào tệp Settings.xml của dự án Service / Actor (nằm tại \ PackageRoot \ Config \ Settings.xml từ gốc dự án). Để trống các tham số vì chúng tôi sẽ đặt chúng ở những nơi khác cho mỗi môi trường. Đây là một ví dụ.
<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<!-- Add your custom configuration sections and parameters here -->
    <Section Name="UserDatabase">
        <Parameter Name="UserDatabaseConnectionString" Value="" />
    </Section>
</Settings>
  1. Trong tệp ApplicationManifest.xml của dự án Service Fabric của bạn, sẽ có <ServiceManifestImport>các phần tử cho từng dự án được bao gồm của bạn. Bên dưới đó sẽ là một <ConfigOverrides>phần tử mà chúng tôi sẽ khai báo những giá trị nào cho cấu hình của chúng tôi sẽ được thay thế bằng các giá trị được đặt cho mỗi môi trường trong tệp xml cục bộ và đám mây bên dưới ApplicationParameters trong dự án Service Fabric của chúng tôi. Trong cùng một tệp ApplicationManifest.xml đó, bạn sẽ cần thêm thông số sẽ có trong tệp xml cục bộ và đám mây, nếu không chúng sẽ bị ghi đè khi xây dựng.

Tiếp tục với ví dụ trên, đây là cách nó sẽ được thiết lập.

<Parameters>
    <Parameter Name="ServiceName_InstanceCount" DefaultValue="-1" />
    <Parameter Name="UserDatabaseConnectionString" DefaultValue="" />
</Parameters>
<ConfigOverrides>
    <ConfigOverride Name="Config">
        <Settings>
            <Section Name="UserDatabase">
                <Parameter Name="UserDatabaseConnectionString" Value="[UserDatabaseConnectionString]" />
            </Section>
        </Settings>
    </ConfigOverride>
</ConfigOverrides>
  1. Trong các tệp local.xml và cloud.xml bên dưới ApplicationParameters trong dự án Service Fabric của bạn, bạn sẽ chỉ định các biến cụ thể cho môi trường của mình như vậy.
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <Parameter Name="ServiceName_InstanceCount" Value="1" />
        <Parameter Name="UserDatabaseConnectionString" Value="Server=(localdb)\MsSqlLocalDb;Database=Users;User=ReadOnlyUser;Password=XXXXX;" />
    </Parameters>
</Application>
  1. Cuối cùng, trong Service / Actor của bạn, bạn có thể truy cập các biến cấu hình cho mỗi môi trường như vậy.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];

100
Tôi có thể chỉ nói "yuck!". Điều này vô vọng phức tạp đối với một cài đặt dựa trên môi trường đơn giản. Điều này đã chín muồi cho một số nỗ lực của nhà phát triển từ nhóm SF.
BrettRobi,

Không chắc tôi đang thiếu gì, nhưng Context của tôi không có CodePackageActivationContext. Tôi thấy trong các dịch vụ không trạng thái của mình rằng nó được chuyển vào phương thức khởi tạo tới OwinCommunicationListener. Nhưng tôi không chắc lấy nó ở đâu trong Diễn viên?
Steve

7
Hỏi sớm. Các nhận xét ở đây: azure.microsoft.com/en-us/documentation/articles/… Trỏ vào sử dụng: CodePackageActivationContext kích hoạtContext = FabricRuntime.GetActivationContext ();
Steve

11
Điều này tốt hơn nhiều so với tài liệu thực tế, cảm ơn bạn! Cũng đồng ý rằng nó rất phức tạp ... hãy sửa đội SF này!
naspinski

2
Tôi gặp sự cố trong đó các cài đặt này không bị ghi đè. Bạn phải xác định các tham số ở trên ServiceManifestImport(con của ApplicationManifest) nhưng ConfigOverridesphải đi vào trong đó (con của ServiceManifestImport).
Mardoxx

42

Bạn chỉ có thể sử dụng các biến môi trường giống như bất kỳ ứng dụng nào khác, điều này cũng hoạt động với tệp thực thi của khách trong cấu trúc dịch vụ không giống settings.xmlnhư điều này yêu cầu thời gian chạy cấu trúc dịch vụ tích hợp sẵn.

Trong ứng dụng của bạn, bạn có thể truy cập các biến môi trường giống như bất kỳ ứng dụng .net nào khác thông qua GetEnvironmentVariablephương thức trên Environmentlớp:

var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");

Sau đó, chúng ta cần thiết lập một số giá trị biến môi trường mặc định, điều này được thực hiện trong ServiceManifest.xmltệp kê khai của dịch vụ.

<?xml version="1.0" encoding="utf-8" ?>
<ServiceManifest Name="MyServicePkg" Version="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- snip -->
    <CodePackage Name="Code" Version="1.0.0">
        <!-- snip -->
        <EnvironmentVariables>
            <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="http://localhost:12345"/>
        </EnvironmentVariables>
    </CodePackage>
    <!-- snip -->
</ServiceManifest>

Sau đó, biến môi trường này có thể được ghi đè trong ApplicationManifest.xmltệp bằng cách sử dụng mã sau:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <!-- snip -->
    </Parameters>
    <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
        <EnvironmentOverrides CodePackageRef="Code">
            <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="https://the-real-live-super-base-uri.com/"/>
        </EnvironmentOverrides>
    </ServiceManifestImport>
    <!-- snip -->
</ApplicationManifest>

Sau đó, điều này có thể được tham số hóa giống như bất kỳ cài đặt tệp kê khai ứng dụng nào khác bằng cách sử dụng local.xmlcloud.xml.

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <Parameter Name="MyService_SuperWebServiceBaseUri" Value="https://another-base-uri.com/" />
    </Parameters>
</Application>

Sau đó, chúng tôi sẽ phải cập nhật ApplicationManifest.xmlđể hỗ trợ các tham số này;

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <Parameter Name="MyService_SuperWebServiceBaseUri" DefaultValue="https://the-real-live-super-base-uri.com/" />
    </Parameters>
    <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
        <EnvironmentOverrides CodePackageRef="Code">
            <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="[MyService_SuperWebServiceBaseUri]"/>
        </EnvironmentOverrides>
    </ServiceManifestImport>
    <!-- snip -->
</ApplicationManifest>

2
Cách gọn gàng hơn để thiết lập biến môi trường
đóiMind

2
Liên kết này cũng đã giúp tôi: binaryradix.com/2016/10/…
Darrel K.

7

Các câu trả lời trên giải thích rõ nó được thực hiện như thế nào. Tôi muốn thêm nhãn hiệu phụ, tại sao nó lại ' phức tạp ':

Nó phải theo cách này, vì các dịch vụ được dự định là độc lập. Chúng sẽ chạy theo mặc định trong bất kỳ ứng dụng nào mà chúng được liên kết. Độc lập với Manifest của ứng dụng. Vì vậy, dịch vụ chỉ có thể dựa vào các tham số, ít nhất đã được xác định trước trong cấu hình của chính nó.

Các cài đặt trước này sau đó có thể được ứng dụng ghi đè. Đây là cách tiếp cận phổ quát duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.