Fix broken links and site nav glitch, misc cleanup (#141)

* remove broken links to incomplete dynamic logging page
* update jquery and bootstrap refs, remove highlight.js
* remove some unused components
* redirect unfinished fileshare page to docs site
* use a single deployment workflow that is aware of PR vs merge
* drop incubator references
This commit is contained in:
Tim Hess 2024-02-16 12:35:55 -06:00 коммит произвёл GitHub
Родитель c393c3c55e
Коммит 41f0255675
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
52 изменённых файлов: 576 добавлений и 3649 удалений

171
.github/workflows/build-and-stage.yml поставляемый
Просмотреть файл

@ -1,71 +1,100 @@
name: Build and stage
env:
AZURE_WEBAPP_PACKAGE_PATH: '.'
DOTNET_VERSION: '8.0'
SLOT_NAME: staging
on:
push:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
name: Build and publish app
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Set up dependency caching for faster builds
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Build with dotnet
run: dotnet build src/Client --configuration Release
- name: dotnet publish
run: dotnet publish src/Client -c Release -o ${{ env.DOTNET_ROOT }}/mainsite
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: Steeltoe-MainSite
path: ${{ env.DOTNET_ROOT }}/mainsite
deploy-to-staging:
name: Deploy to staging environment
permissions:
contents: none
runs-on: ubuntu-latest
needs: build
environment:
name: 'Staging'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: Steeltoe-MainSite
- name: Log into Azure CLI with service principal
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to Azure Web App
id: deploy-to-webapp
uses: azure/webapps-deploy@v3
with:
app-name: ${{ vars.AZURE_WEBAPP_NAME }}
package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
slot-name: ${{ env.SLOT_NAME }}
name: Build and stage
env:
AZURE_WEBAPP_PACKAGE_PATH: '.'
DOTNET_VERSION: '8.0'
on:
push:
branches: [ "main" ]
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
pull-requests: 'write'
jobs:
build:
name: Build and publish app
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Set up dependency caching for faster builds
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: dotnet build
run: dotnet build src/Client --configuration Release
- name: dotnet publish
run: dotnet publish src/Client -c Release -o ${{ env.DOTNET_ROOT }}/mainsite
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: Steeltoe-MainSite
path: ${{ env.DOTNET_ROOT }}/mainsite
deploy-to-staging:
name: Deploy to staging environment
runs-on: ubuntu-latest
needs: build
environment:
name: ${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.number) || vars.STAGING_SLOT_NAME }}
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
env:
SLOT_NAME: ${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.number) || vars.STAGING_SLOT_NAME }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: Steeltoe-MainSite
- name: Log into Azure CLI with service principal
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: If PR, create a new staging slot
if: ${{ github.event_name == 'pull_request' }}
run: az webapp deployment slot create --resource-group ${{ vars.AZURE_RESOURCE_GROUP }} --name ${{ vars.AZURE_WEBAPP_NAME}} --slot ${{ env.SLOT_NAME }}
# Need to pair a PR slot with a custom docs site address?
# az webapp config appsettings set -g steeltoe --name www-steeltoe --slot pr-141 --settings DocsSite__BaseAddress=https://docs-steeltoe-pr-310.azurewebsites.net
- name: Deploy to Azure Web App
id: deploy-to-webapp
uses: azure/webapps-deploy@v3
with:
app-name: ${{ vars.AZURE_WEBAPP_NAME }}
package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
slot-name: ${{ env.SLOT_NAME }}
- name: If PR, comment with the preview link
if: ${{ github.event_name == 'pull_request' }}
uses: mshick/add-pr-comment@v2
with:
message: |
## Preview link: https://${{ vars.AZURE_WEBAPP_NAME }}-${{ env.SLOT_NAME }}.azurewebsites.net
- Your changes have been deployed to the preview site. The preview site will update as you add more commits to this branch.
- The preview link is shareable, but will be deleted when the pull request is merged or closed.
> *This is an automated message.*
repo-token: ${{ secrets.GITHUB_TOKEN }}

1
.github/workflows/pr-cleanup.yml поставляемый
Просмотреть файл

@ -1,4 +1,3 @@
name: Delete a preview environment
on:

98
.github/workflows/pr-deploy.yml поставляемый
Просмотреть файл

@ -1,98 +0,0 @@
name: Deploy a preview environment
on:
pull_request:
branches:
- main
- v4
concurrency: ci-${{ github.event.number }}
env:
AZURE_WEBAPP_PACKAGE_PATH: '.'
DOTNET_VERSION: '8.0'
SLOT_NAME: preview-${{ github.event.number }}
jobs:
build:
name: Build and publish app
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Set up dependency caching for faster builds
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Build with dotnet
run: dotnet build src/Client --configuration Release
- name: dotnet publish
run: dotnet publish src/Client -c Release -o ${{ env.DOTNET_ROOT }}/mainsite
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: Steeltoe-MainSite
path: ${{ env.DOTNET_ROOT }}/mainsite
set-up-test-env:
name: Create a staging slot for this PR
runs-on: ubuntu-latest
steps:
- name: Log into Azure CLI with service principal
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Create slot on staging site
run: az webapp deployment slot create --resource-group ${{ vars.AZURE_RESOURCE_GROUP }} --name ${{ vars.AZURE_WEBAPP_NAME}} --slot $SLOT_NAME
deploy:
name: Deploy to new staging slot
runs-on: ubuntu-latest
needs: [build, set-up-test-env]
environment:
name: "PR #${{ github.event.number }}"
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
permissions:
pull-requests: write
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: Steeltoe-MainSite
- name: Log into Azure CLI with service principal
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to slot on staging site
uses: azure/webapps-deploy@v3
id: deploy-to-webapp
with:
app-name: ${{ vars.AZURE_WEBAPP_NAME }}
package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
slot-name: ${{ env.SLOT_NAME }}
- name: Comment on PR with the preview link
uses: mshick/add-pr-comment@v2
with:
message: |
## Preview link: https://${{ vars.AZURE_WEBAPP_NAME }}-${{ env.SLOT_NAME }}.azurewebsites.net
- Your changes have been deployed to the preview site. The preview site will update as you add more commits to this branch.
- The preview link is shareable, but will be deleted when the pull request is merged or closed.
> *This is an automated message.*
repo-token: ${{ secrets.GITHUB_TOKEN }}

Просмотреть файл

@ -3,10 +3,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<!-- OneTrust Cookie Consent -->
<meta content="3ab34b71-7023-4e93-90e8-12dd544a5179" name="onetrust-data-domain">
<meta content="https://tags.tiqcdn.com/utag/vmware/microsites-privacy/prod/utag.js" name="microsites-utag">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="//www.vmware.com/files/templates/inc/utag_data.js"></script>
<script src="//tags.tiqcdn.com/utag/vmware/microsites-privacy/prod/utag.sync.js"></script>
<script>function OptanonWrapper() { { window.dataLayer.push({ event: 'OneTrustGroupsUpdated' }); } }</script>
@ -41,14 +41,13 @@
<meta content="2019-10-03" name="DC.Date" scheme="ISO8601">
<meta content="text/html" name="DC.Type">
<meta content="https://steeltoe.io/" name="DC.Identifier">
<meta content="Copyright © 2005-2023 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries." name="DC.Rights">
<meta content="Copyright © 2005-@(DateTime.Now.Year) Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries." name="DC.Rights">
<base href="/" />
<title>Steeltoe OSS</title>
<link rel="canonical" href="https://steeltoe.io/">
<link rel="icon" href="https://steeltoe.io/images/favicon.png" type="image/png" />
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/styles/a11y-dark.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="css/fonts.css" />
<link rel="stylesheet" href="css/site.css" />
<link rel="stylesheet" href="css/mobile.css" />
@ -70,14 +69,6 @@
<Routes />
<script src="js/functions.js" type="text/javascript"></script>
<script src="_framework/blazor.web.js"></script>
<script src="js/highlightjs-badge.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/highlight.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/languages/powershell.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/languages/csharp.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/languages/bash.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/languages/json.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/languages/xml.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.2/languages/yaml.min.js" type="text/javascript"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" crossorigin="anonymous"></script>
</body>
</html>

Просмотреть файл

@ -1,45 +0,0 @@
<Tab Title="Azure">
Replace <code>localhost</code> with the @ServiceName instance info
<pre><code class="json">{
...
"@ParentSettingsParamName": {
"@ChildSettingsParamName": {
@(string.IsNullOrEmpty(ServiceServer) ? "" : "\"server\": \""+ServiceServer+"\",")
@(string.IsNullOrEmpty(ServiceHost) ? "" : "\"host\": \""+ServiceHost+"\",")
@(string.IsNullOrEmpty(ServicePort) ? "" : "\"port\": \""+ServicePort+"\",")
@(string.IsNullOrEmpty(ServiceUsername) ? "" : "\"username\": \""+ServiceUsername+"\",")
@(string.IsNullOrEmpty(ServicePassword) ? "" : "\"password\": \""+ServicePassword+"\",")
@(string.IsNullOrEmpty(ServiceDatabase) ? "" : "\"database\": \""+ServiceDatabase+"\",")
}
}
...
}
</code></pre>
</Tab>
@ChildContent
@code {
[Parameter]
public string InstanceName { get; set; } = "";
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public string ServiceServer { get; set; } = null;
[Parameter]
public string ServiceHost { get; set; } = null;
[Parameter]
public string ServicePort { get; set; } = null;
[Parameter]
public string ServiceUsername { get; set; } = null;
[Parameter]
public string ServicePassword { get; set; } = null;
[Parameter]
public string ServiceDatabase { get; set; } = null;
[Parameter]
public string ParentSettingsParamName { get; set; } = "";
[Parameter]
public string ChildSettingsParamName { get; set; } = "";
[Parameter]
public RenderFragment ChildContent { get; set; }
}

Просмотреть файл

@ -1,142 +0,0 @@
<Tab Title="Cloud Foundry">
@if (string.IsNullOrEmpty(ServiceName))
{
<span>It's already set, continue to next step.</span>
}
else
{
<span>Update with the @ServiceName info</span>
<pre><code class="json">{
...
</code>
@if (!string.IsNullOrEmpty(SpringApplicationName)) {
<code> "spring": {
"application": {
"name": "@SpringApplicationName"
}</code>
}
@if (!string.IsNullOrEmpty(SpringServerUri)){
<code> ,"cloud": {
"config": {
"uri": "@SpringServerUri"
"validate_certifates": false
}
}
</code>
}
@if (!string.IsNullOrEmpty(SpringApplicationName)) {
<code> },</code>
}
@if(!string.IsNullOrEmpty(ZipkinEndpoint)){
<code>"management": {
"tracing": {
"alwaysSample": true,
"useShortTraceIds ": true,
"exporter": {
"zipkin": {
"endpoint": "@(ZipkinEndpoint)",
"validateCertificates": false,
"useShortTraceIds ": true
}
}
}
},</code>
}
@if(!string.IsNullOrEmpty(ManagementEndpointPath)){
<code>
"management": {
"endpoints": {
"path": "@ManagementEndpointPath",
"cloudfoundry": {
"validateCertificates": false
}
},
"metrics": {
"exporter": {
"cloudfoundry": {
"validateCertificates": false
}
}
}
}</code>
}
@if(!string.IsNullOrEmpty(ShouldRegisterWithEureka)){
<code> "eureka": {
"client": {
"shouldRegisterWithEureka": @ShouldRegisterWithEureka
}
}</code>
}
@if(!string.IsNullOrEmpty(ConsulHostAddress)){
<code> "consul": {
"host": "@ConsulHostAddress",
"port": @ConsulHostPort,
"discovery": {
"register": @ConsulShouldRegister,
"serviceName": "@ProjectName"
}
}</code>
}
@if(!string.IsNullOrEmpty(OAuthClient)){
<code> "security": {
"oauth2": {
"client": {
"validateCertificates": false,
}
}
}</code>
}
@if(!string.IsNullOrEmpty(OpenIDClient)){
<code> "security": {
"oauth2": {
"client": {
"validateCertificates": false,
@(string.IsNullOrEmpty(OpenIDAuthDomain) ? "" : "\"authDomain\": \"" + OpenIDAuthDomain + "\",")
@(string.IsNullOrEmpty(OpenIDClientId) ? "" : "\"clientId\": \"" + OpenIDClientId + "\",")
@(string.IsNullOrEmpty(OpenIDClientSecret) ? "" : "\"clientSecret\": \"" + OpenIDClientSecret + "\",")
}
}
}</code>
}
<code>
...
}</code></pre>
}
@ChildContent
</Tab>
@code {
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public string SpringApplicationName { get; set; } = null;
[Parameter]
public string SpringServerUri { get; set; } = null;
[Parameter]
public string ZipkinEndpoint { get; set; } = null;
[Parameter]
public string ManagementEndpointPath { get; set; } = null;
[Parameter]
public string ShouldRegisterWithEureka { get; set; } = null;
[Parameter]
public string ConsulHostAddress { get; set; } = null;
[Parameter]
public string ConsulHostPort { get; set; } = null;
[Parameter]
public string ConsulShouldRegister { get; set; } = "false";
[Parameter]
public string ProjectName { get; set; } = "";
[Parameter]
public string OAuthClient { get; set; } = null;
[Parameter]
public string OpenIDClient { get; set; } = null;
[Parameter]
public string OpenIDAuthDomain { get; set; } = null;
[Parameter]
public string OpenIDClientId { get; set; } = null;
[Parameter]
public string OpenIDClientSecret { get; set; } = null;
[Parameter]
public RenderFragment ChildContent { get; set; }
}

Просмотреть файл

@ -1,26 +0,0 @@
<div>Create a new ASP.NET Core WebAPI app with the <a href="https://start.steeltoe.io" target="_blank">Steeltoe Initializr</a></div>
<img src="images/initializr/@ImageName" class="img-fluid" />
<ul>
<li><b>SteeltoeVersion:</b> 2.4 for the latest stable</li>
<li>
<div>Project Metadata:</div>
<div class="pl-2"><b>Name:</b> @ProjectName</div>
<div class="pl-2"><b>Target Framework:</b> netcoreapp3.1 is the latest stable</div>
</li>
<li><b>Dependencies:</b> @(string.IsNullOrEmpty(DependencyName) ? "none":DependencyName)</li>
<li>Click <b>Generate Project</b> to download a zip containing the new project</li>
</ul>
@ChildContent
@code {
[Parameter]
public string ImageName { get; set; } = "";
[Parameter]
public string ProjectName { get; set; } = "";
[Parameter]
public string DependencyName { get; set; } = null;
[Parameter]
public RenderFragment ChildContent { get; set; }
}

Просмотреть файл

@ -1,46 +0,0 @@
<Tab Title="Kubernetes">
Replace <code>localhost</code> with the @InstanceName instance info
<pre><code class="json">{
...
"@ParentSettingsParamName": {
"@ChildSettingsParamName": {
@(string.IsNullOrEmpty(ServiceServer) ? "" : "\"server\": \""+ServiceServer+"\",")
@(string.IsNullOrEmpty(ServiceHost) ? "" : "\"host\": \""+ServiceHost+"\",")
@(string.IsNullOrEmpty(ServicePort) ? "" : "\"port\": \""+ServicePort+"\",")
@(string.IsNullOrEmpty(ServiceUsername) ? "" : "\"username\": \""+ServiceUsername+"\",")
@(string.IsNullOrEmpty(ServicePassword) ? "" : "\"password\": \""+ServicePassword+"\",")
@(string.IsNullOrEmpty(ServiceDatabase) ? "" : "\"database\": \""+ServiceDatabase+"\",")
}
}
...
}</code></pre>
</Tab>
@ChildContent
@code {
[Parameter]
public string InstanceName { get; set; } = "";
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public string ServiceServer { get; set; } = null;
[Parameter]
public string ServiceHost { get; set; } = null;
[Parameter]
public string ServicePort { get; set; } = null;
[Parameter]
public string ServiceUsername { get; set; } = null;
[Parameter]
public string ServicePassword { get; set; } = null;
[Parameter]
public string ServiceDatabase { get; set; } = null;
[Parameter]
public string ParentSettingsParamName { get; set; } = "";
[Parameter]
public string ChildSettingsParamName { get; set; } = "";
[Parameter]
public RenderFragment ChildContent { get; set; }
}

Просмотреть файл

@ -1,237 +0,0 @@
<Tab Title="Local">
@if (string.IsNullOrEmpty(ServiceName))
{
<span>It's already set, continue to next step.</span>
}
else
{
<span>Update with the @ServiceName info</span>
<pre><code class="json">{
...
@if (!string.IsNullOrEmpty(ParentSettingsParamName)) {
<text> "@ParentSettingsParamName": {
"@ChildSettingsParamName": {</text>
if (!string.IsNullOrEmpty(ServiceServer))
{<text>
"server": "@ServiceServer",</text>
}
if (!string.IsNullOrEmpty(ServiceHost))
{<text>
"host": "@ServiceHost",</text>
}
if (!string.IsNullOrEmpty(ServicePort))
{<text>
"port": "@ServicePort",</text>
}
if (!string.IsNullOrEmpty(ServiceUsername))
{<text>
"username": "@ServiceUsername",</text>
}
if (!string.IsNullOrEmpty(ServicePassword))
{<text>
"password": "@ServicePassword",</text>
}
if (!string.IsNullOrEmpty(ServiceDatabase))
{<text>
"database": "@ServiceDatabase"</text>
}
<text>
}
}</text>
}
@if (!string.IsNullOrEmpty(SpringApplicationName)) {
<text> "spring": {
"application": {
"name": "@SpringApplicationName"
}</text>
}
@if (!string.IsNullOrEmpty(SpringServerUri)){
<text>,
"cloud": {
"config": {
"uri": "@SpringServerUri",
"validateCertificates": false
}
}</text>
}
@if (!string.IsNullOrEmpty(SpringApplicationName)) {
<text>
},</text>
}
@if(!string.IsNullOrEmpty(ZipkinEndpoint))
{<text>
"management": {
"tracing": {
"alwaysSample": true,
"useShortTraceIds ": true,
"exporter": {
"zipkin": {
"endpoint": "@(ZipkinEndpoint)",
"validateCertificates": false,
"useShortTraceIds ": true
}
}
}
},</text>
}
@if(!string.IsNullOrEmpty(ManagementEndpointPath))
{<text> "management": {
"endpoints": {
"path": "@ManagementEndpointPath",
"cloudfoundry": {
"validateCertificates": false
}
},
"metrics": {
"exporter": {
"cloudfoundry": {
"validateCertificates": false
}
}
}
}</text>
}
@if(!string.IsNullOrEmpty(ShouldRegisterWithEureka))
{<text>
"eureka": {
"client": {</text>
if (!string.IsNullOrEmpty(EurekaServerUrl))
{<text>
"serviceUrl": "@EurekaServerUrl",</text>
}
if (!string.IsNullOrEmpty(ShouldFetchEurekaRegistry))
{<text>
"shouldFetchRegistry": "@ShouldFetchEurekaRegistry",</text>
}<text>
"shouldRegisterWithEureka": @ShouldRegisterWithEureka,
"validateCertificates": false
},
"instance": {</text>
if (!string.IsNullOrEmpty(EurekaAppPort))
{<text>
"port": "@EurekaAppPort",</text>
}
if (!string.IsNullOrEmpty(EurekaAppIP))
{<text>
"ipAddress": "@EurekaAppIP",</text>
}
if (!string.IsNullOrEmpty(EurekaAppIP))
{<text>
"preferIpAddress": true</text>
}<text>
}
}</text>
}
@if(!string.IsNullOrEmpty(ConsulShouldRegister))
{<text>
"consul": {
"host": "@ConsulHostAddress",
"port": @ConsulHostPort,
"discovery": {
"enabled": true,
"register": @ConsulShouldRegister,</text>
if (!string.IsNullOrEmpty(ConsulAppPort))
{<text>
"port": "@ConsulAppPort",</text>
}
if (!string.IsNullOrEmpty(ConsulAppIP))
{<text>
"ipAddress": "@ConsulAppIP",</text>
}
if (!string.IsNullOrEmpty(ConsulAppIP))
{<text>
"preferIpAddress": true</text>
}<text>
}
}</text>
}
@if(!string.IsNullOrEmpty(OAuthClient)){
<text> "security": {
"oauth2": {
"client": {
"validateCertificates": false,
}
}
}</text>
}
@if(!string.IsNullOrEmpty(OpenIdClient)){
<text> "security": {
"oauth2": {
"client": {
"validateCertificates": false,
@(string.IsNullOrEmpty(OpenIdAuthDomain) ? "" : "\"authDomain\": \"" + OpenIdAuthDomain + "\",")
@(string.IsNullOrEmpty(OpenIdClientId) ? "" : "\"clientId\": \"" + OpenIdClientId + "\",")
@(string.IsNullOrEmpty(OpenIdClientSecret) ? "" : "\"clientSecret\": \"" + OpenIdClientSecret + "\",")
}
}
}</text>
}<text>
...
}</text></code></pre>
}
@ChildContent
</Tab>
@code {
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public string SpringApplicationName { get; set; } = null;
[Parameter]
public string SpringServerUri { get; set; } = null;
[Parameter]
public string ZipkinEndpoint { get; set; } = null;
[Parameter]
public string ManagementEndpointPath { get; set; } = null;
[Parameter]
public string ShouldRegisterWithEureka { get; set; } = null;
[Parameter]
public string ConsulHostAddress { get; set; } = null;
[Parameter]
public string ConsulHostPort { get; set; } = null;
[Parameter]
public string ConsulShouldRegister { get; set; } = null;
[Parameter]
public string ConsulAppPort { get; set; } = null;
[Parameter]
public string ConsulAppIP { get; set; } = null;
[Parameter]
public string ProjectName { get; set; } = "";
[Parameter]
public string ServiceServer { get; set; } = null;
[Parameter]
public string ServiceHost { get; set; } = null;
[Parameter]
public string ServicePort { get; set; } = null;
[Parameter]
public string ServiceUsername { get; set; } = null;
[Parameter]
public string ServicePassword { get; set; } = null;
[Parameter]
public string ServiceDatabase { get; set; } = null;
[Parameter]
public string ParentSettingsParamName { get; set; } = "";
[Parameter]
public string ChildSettingsParamName { get; set; } = null;
[Parameter]
public string EurekaServerUrl { get; set; } = null;
[Parameter]
public string EurekaAppPort { get; set; } = null;
[Parameter]
public string ShouldFetchEurekaRegistry { get; set; } = null;
[Parameter]
public string EurekaAppIP { get; set; } = null;
[Parameter]
public string OAuthClient { get; set; } = null;
[Parameter]
public string OpenIdClient { get; set; } = null;
[Parameter]
public string OpenIdAuthDomain { get; set; } = null;
[Parameter]
public string OpenIdClientId { get; set; } = null;
[Parameter]
public string OpenIdClientSecret { get; set; } = null;
[Parameter]
public RenderFragment ChildContent { get; set; }
}

Просмотреть файл

@ -1,19 +0,0 @@
<Tab Title="Local">
<pre><code class="json">"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "@(ApplicationUrl)",
"sslPort": 0
}
}</code></pre>
@ChildContent
</Tab>
@code {
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public string ApplicationUrl { get; set; } = "http://localhost:8080";
}

Просмотреть файл

@ -1,175 +1,174 @@
@using Microsoft.Extensions.Options
@inject IOptionsSnapshot<DocsSiteOptions> DocsSiteOptions
<div class="width-all bg-midnight-blue">
<div class="width-90 container" id="footer">
<div class="row bottom-bar">
<div class="col-sm-4 pl-5 text-center">
<Href href="/index">
<?xml version="1.0" encoding="utf-8" ?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="75px" preserveAspectRatio="xMidYMid meet" viewBox="0 0 617.6 180.5" xml:space="preserve">
<style type="text/css">
.logo-white {
fill: #FFFFFF;
}
</style>
<title>PVLG-Steeltoe-white-2019</title>
<polygon class="logo-white" points="70.7,176.2 35.4,115 0,135.4 " />
<polygon class="logo-white" points="78.2,96.2 5.2,54.1 39,112.8 78.2,180.5 156.3,135.4 119.8,72.2 " />
<polygon class="logo-white" points="78.2,0 0,45.1 78.2,90.2 78.2,90.2 156.3,45.1 " />
<path class="logo-white" d="M231.6,77c2.9,1.2,5.9,2.2,8.9,2.8c3.3,0.8,6.6,1.8,9.8,3c2.5,1,4.7,2.6,6.5,4.7c1.9,2.4,2.9,5.4,2.7,8.5
c0.1,4.2-1.8,8.2-5.1,10.9c-3.5,2.9-8.3,4.4-14.6,4.4c-6.5,0.1-12.9-1.5-18.6-4.6c-1.1-0.8-1.8-2.1-1.7-3.4c0-1.1,0.4-2.1,1.1-2.9
c0.7-0.8,1.8-1.3,2.9-1.2c0.6,0,1.3,0.1,1.9,0.4c2.1,0.9,4.3,1.7,6.5,2.2c2.4,0.6,4.9,0.9,7.4,0.8c7.6,0,11.4-2.4,11.4-7.3
c0-1.6-1.1-3.1-2.6-3.6c-2.8-1.2-5.6-2.1-8.6-2.8c-3.4-0.8-6.7-1.8-10-3c-2.6-1-4.9-2.6-6.8-4.7c-1.9-2.3-2.9-5.2-2.8-8.2
c-0.1-4.5,1.8-8.8,5.1-11.7c3.5-3,8.4-4.5,14.8-4.5c5.1,0,10.1,0.8,14.8,2.6c0.9,0.2,1.7,0.8,2.2,1.5c1.2,1.6,1,3.8-0.4,5.2
c-0.8,0.8-1.8,1.2-2.9,1.2c-0.4,0-0.9-0.1-1.3-0.2c-3.8-1.2-7.7-1.8-11.7-1.9c-3.7,0-6.6,0.6-8.6,2c-1.9,1-3.1,3-3.1,5.1
C228.7,74.3,229.8,76.1,231.6,77z" />
<path class="logo-white" d="M299.3,103c0.7,0.7,1.1,1.6,1.1,2.6c0,1.6-0.9,3-2.3,3.6c-2.7,1.2-5.6,1.9-8.5,1.9c-10,0-14.9-4.5-14.9-13.5
V65.8h-7.3c-1.1,0-1.9-0.8-1.9-1.9c0,0,0,0,0-0.1c0-0.7,0.3-1.3,0.9-1.7l13.9-13.6c0.4-0.5,1.1-0.8,1.7-0.9c0.5,0,1,0.2,1.4,0.6
c0.4,0.4,0.6,0.9,0.6,1.4v8.2h11.5c2.1-0.1,3.9,1.5,4,3.7c0,0.1,0,0.2,0,0.3c0,1-0.4,2.1-1.1,2.8c-0.7,0.8-1.8,1.2-2.9,1.2H284v30.9
c0,2.6,0.6,4.4,1.9,5.1c1.5,0.8,3.1,1.1,4.8,1.1c1.4,0,2.8-0.2,4.1-0.6c0.3-0.1,0.6-0.1,0.9-0.2c0.4-0.1,0.8-0.1,1.2-0.1
C297.8,101.9,298.7,102.3,299.3,103z" />
<path class="logo-white" d="M353.4,99.8c0.8,0.7,1.3,1.8,1.2,2.9c0,1.5-0.9,2.8-2.7,3.8c-2.5,1.4-5.1,2.6-7.9,3.4c-3.3,0.8-6.6,1.2-10,1.1
c-8.3,0-14.8-2.4-19.5-7.1s-7-11.4-7-20c-0.1-4.6,0.9-9.2,2.7-13.4c1.7-4,4.6-7.5,8.2-9.9c8.2-5,18.5-5.1,26.7-0.3
c3.6,2.3,6.5,5.6,8.4,9.4c1.9,4,2.9,8.4,2.9,12.9c0,1.2-0.4,2.4-1.3,3.3c-0.9,0.9-2.1,1.4-3.4,1.3H317c0.6,4.8,2.3,8.5,5.3,11.2
c3,2.7,7.2,4,12.6,4c2.5,0,5.1-0.2,7.5-0.8c2.2-0.6,4.3-1.4,6.3-2.3c0.6-0.3,1.2-0.4,1.9-0.4C351.6,98.8,352.6,99.1,353.4,99.8z
M325.1,66.2c-2.3,1.1-4.3,2.8-5.6,5c-1.6,2.5-2.5,5.4-2.5,8.4h30.2c-0.1-3-1-5.9-2.6-8.4c-1.4-2.1-3.4-3.9-5.7-5
c-2.1-1-4.5-1.6-6.8-1.6C329.7,64.7,327.3,65.2,325.1,66.2z" />
<path class="logo-white" d="M411.7,99.8c0.8,0.7,1.3,1.8,1.2,2.9c0,1.5-0.9,2.8-2.7,3.8c-2.5,1.4-5.1,2.6-7.9,3.4c-3.3,0.8-6.6,1.2-10,1.1
c-8.3,0-14.8-2.4-19.5-7.1s-7-11.4-7-20c-0.1-4.6,0.9-9.2,2.7-13.4c1.7-4,4.6-7.5,8.2-9.9c8.2-5,18.5-5.1,26.7-0.3
c3.6,2.3,6.5,5.6,8.4,9.4c1.9,4,2.9,8.4,2.9,12.9c0,1.2-0.4,2.4-1.3,3.3c-0.9,0.9-2.1,1.4-3.4,1.3h-34.7c0.6,4.8,2.3,8.5,5.3,11.2
c3,2.7,7.2,4,12.6,4c2.5,0,5.1-0.2,7.5-0.8c2.2-0.6,4.3-1.4,6.3-2.3c0.6-0.3,1.2-0.4,1.9-0.4C409.9,98.7,411,99.1,411.7,99.8z
M383.5,66.2c-2.3,1.1-4.2,2.8-5.6,5c-1.6,2.5-2.5,5.4-2.6,8.4h30.2c-0.1-3-1-5.9-2.6-8.4c-1.4-2.1-3.4-3.9-5.7-5
c-2.1-1-4.5-1.6-6.8-1.6C388,64.7,385.6,65.2,383.5,66.2z" />
<path class="logo-white" d="M436.1,36.1c0.9,0.9,1.4,2.1,1.3,3.4v66.4c0,1.2-0.5,2.4-1.4,3.3c-0.9,0.9-2.1,1.4-3.3,1.4
c-1.2,0-2.4-0.5-3.3-1.4c-0.9-0.9-1.4-2.1-1.3-3.3V39.5c0-1.2,0.5-2.5,1.3-3.3c0.9-0.9,2-1.4,3.3-1.4
C434,34.7,435.2,35.2,436.1,36.1z" />
<path class="logo-white" d="M482.4,103c0.7,0.7,1.1,1.6,1.1,2.6c0,1.6-0.9,3-2.3,3.6c-2.7,1.2-5.6,1.9-8.5,1.9c-10,0-14.9-4.5-14.9-13.5
V65.8h-7.3c-1.1,0-1.9-0.8-1.9-1.9c0,0,0,0,0-0.1c0-0.7,0.3-1.3,0.9-1.7l13.9-13.6c0.4-0.5,1.1-0.8,1.7-0.9c0.5,0,1,0.2,1.4,0.6
c0.4,0.4,0.6,0.9,0.6,1.4v8.2h11.6c2.1-0.1,3.9,1.5,4,3.7c0,0.1,0,0.2,0,0.3c0,1-0.4,2.1-1.1,2.8c-0.7,0.8-1.8,1.2-2.9,1.2h-11.6
v30.9c0,2.6,0.7,4.4,1.9,5.1c1.5,0.8,3.1,1.1,4.8,1.1c1.4,0,2.8-0.2,4.1-0.6c0.3-0.1,0.6-0.1,0.9-0.2c0.4-0.1,0.8-0.1,1.2-0.1
C480.9,101.9,481.8,102.3,482.4,103z" />
<path class="logo-white" d="M530.5,60.2c3.9,2.2,7.1,5.6,9.2,9.6c4.4,9,4.4,19.4,0,28.4c-2.1,4-5.3,7.3-9.2,9.6c-8.6,4.5-18.9,4.5-27.5,0
c-3.9-2.2-7.1-5.6-9.2-9.6c-4.3-9-4.3-19.4,0-28.4c2.1-4,5.3-7.3,9.2-9.6C511.6,55.6,521.9,55.6,530.5,60.2L530.5,60.2z
M524.8,100.6c2.7-1.4,4.9-3.5,6.4-6.1c1.8-3.3,2.7-6.9,2.5-10.6c0.1-3.7-0.7-7.3-2.5-10.6c-1.5-2.6-3.7-4.7-6.4-6.1
c-2.5-1.2-5.2-1.9-8-1.9c-2.8,0-5.6,0.6-8.1,1.9c-2.7,1.3-4.8,3.5-6.3,6.1c-1.8,3.2-2.6,6.9-2.5,10.6c-0.2,3.7,0.7,7.4,2.4,10.6
c1.4,2.6,3.6,4.8,6.3,6.1c2.5,1.3,5.3,2,8.1,2C519.5,102.6,522.3,101.9,524.8,100.6L524.8,100.6z" />
<path class="logo-white" d="M598.7,99.8c0.8,0.7,1.3,1.8,1.2,2.9c0,1.5-0.9,2.8-2.7,3.8c-2.5,1.4-5.1,2.6-7.9,3.4c-3.3,0.8-6.6,1.2-10,1.1
c-8.3,0-14.8-2.4-19.5-7.1s-7-11.4-7-20c-0.1-4.6,0.9-9.2,2.7-13.4c1.7-4,4.6-7.5,8.2-9.9c8.2-5,18.5-5.1,26.7-0.3
c3.6,2.3,6.5,5.6,8.4,9.4c1.9,4,2.9,8.4,2.8,12.9c0,1.2-0.4,2.4-1.3,3.3c-0.9,0.9-2.1,1.4-3.4,1.3h-34.7c0.6,4.8,2.3,8.5,5.3,11.2
c3,2.7,7.2,4,12.6,4c2.5,0,5.1-0.2,7.5-0.8c2.2-0.6,4.3-1.4,6.3-2.3c0.6-0.3,1.2-0.4,1.9-0.4C596.9,98.7,598,99.1,598.7,99.8z
M570.5,66.2c-2.3,1.1-4.2,2.8-5.6,5c-1.6,2.5-2.5,5.4-2.5,8.4h30.2c-0.1-3-1-5.9-2.6-8.4c-1.4-2.1-3.4-3.9-5.7-5
c-2.1-1-4.5-1.6-6.8-1.6C575,64.7,572.6,65.2,570.5,66.2z" />
<path class="logo-white" d="M611.3,69.5c-3.5,0-6.3-2.8-6.3-6.3c0-3.5,2.8-6.3,6.3-6.3c3.5,0,6.3,2.8,6.3,6.3c0,0,0,0,0,0
C617.6,66.6,614.7,69.5,611.3,69.5z M611.3,57.8c-3,0-5.4,2.4-5.4,5.3c0,3,2.4,5.4,5.4,5.4c3,0,5.3-2.4,5.3-5.3c0,0,0,0,0,0
C616.6,60.2,614.3,57.8,611.3,57.8C611.3,57.8,611.3,57.8,611.3,57.8z M613,66.8l-1.9-2.9h-1.2v2.9h-1v-7.2h2.9
c1.2-0.1,2.3,0.9,2.3,2.1c0,0,0,0,0,0.1c0,1.1-0.8,2-1.8,2.1l2,2.9L613,66.8z M611.8,60.5h-1.9v2.6h1.9c0.7,0,1.3-0.6,1.3-1.3
S612.5,60.5,611.8,60.5C611.8,60.5,611.8,60.5,611.8,60.5z" />
</svg>
</Href>
<Href href="https://dotnetfoundation.org/" NewWindow="true">
<img src="/images/dotnet_foundation_logo-white.webp" alt=".NET Foundation" style="margin-top:30px;max-width:199px;width:80%" />
</Href>
</div>
<div class="col" id="footer-why-col">
<div class="pb-2 font-weight-bold">Why Steeltoe</div>
<div><Href href="/why-steeltoe">Overview</Href></div>
<div><Href href="/microservices">Microservices</Href></div>
<div><Href href="/cloud">Cloud</Href></div>
<div><Href href="/web-applications">Web Applications</Href></div>
<div><Href href="/event-driven">Event Driven</Href></div>
</div>
<div class="col" id="footer-learn-col">
<div class="pb-2 font-weight-bold">Learn</div>
<div><Href href="https://start.steeltoe.io/" NewWindow="true">Steeltoe Initializr</Href></div>
<div><Href href="@(docsSite.GuidesHome)">Guides</Href></div>
<div><Href href="@(docsSite.DocsHome)">Documentation</Href></div>
<div><Href href="@(docsSite.ApiBrowserHome)">API Browser</Href></div>
<div><Href href="@(docsSite.BlogHome)">Blog</Href></div>
</div>
<div class="col" id="footer-projects-col">
<div class="pb-2 font-weight-bold">Projects</div>
<div><Href href="/app-configuration">Application Configuration</Href></div>
<div><Href href="/circuit-breakers">Circuit Breakers</Href></div>
@*<div><Href href="/cloud-management">Distributed Tracing</Href></div>*@
<div><Href href="/logging">Dynamic Logging</Href></div>
<div><Href href="/cloud-management">Management</Href></div>
<div><Href href="/messaging">Messaging</Href></div>
<div><Href href="/fileshares">Network File Sharing</Href></div>
<div><Href href="/security-providers">Security</Href></div>
<div><Href href="/service-connectors">Service Connectors</Href></div>
<div><Href href="/service-discovery">Service Discovery</Href></div>
<div><Href href="@(docsSite.DocsStreamHome)">Stream</Href></div>
</div>
<div class="col" id="footer-others-col">
@*<div class="pb-2 font-weight-bold"><Href href="/training">Training</Href></div>*@
<div class="pb-2 font-weight-bold"><Href href="/support">Support</Href></div>
<div class="pb-2 font-weight-bold"><Href href="/community">Community</Href></div>
</div>
</div>
<div class="row py-sm-0 py-4">
<div class="col text-right">
<Href href="https://github.com/steeltoeoss" title="Steeltoe on GitHub" NewWindow="true">
<svg id="github-icon" width="100px" height="50px" viewBox="0 0 1 75" xmlns="http://www.w3.org/2000/svg">
<defs>
<style>
#github-icon .cls-1 {
fill: #ffffff;
}
#github-icon .cls-2 {
fill: #000000;
fill-rule: evenodd;
}
</style>
</defs>
<path class="cls-1" d="M38,0a38,38,0,1,0,38,38A38,38,0,0,0,38,0Z"></path>
<path class="cls-2" d="M38,15.59A22.95,22.95,0,0,0,30.71,60.3c1.15.21,1.57-.5,1.57-1.11s0-2,0-3.9c-6.38,1.39-7.73-3.07-7.73-3.07A6.09,6.09,0,0,0,22,48.86c-2.09-1.42.15-1.39.15-1.39a4.81,4.81,0,0,1,3.52,2.36c2,3.5,5.37,2.49,6.67,1.91a4.87,4.87,0,0,1,1.46-3.07c-5.09-.58-10.45-2.55-10.45-11.34a8.84,8.84,0,0,1,2.36-6.15,8.29,8.29,0,0,1,.23-6.07s1.92-.62,6.3,2.35a21.82,21.82,0,0,1,11.49,0c4.38-3,6.3-2.35,6.3-2.35a8.29,8.29,0,0,1,.23,6.07,8.84,8.84,0,0,1,2.36,6.15c0,8.81-5.37,10.75-10.48,11.32a5.46,5.46,0,0,1,1.56,4.25c0,3.07,0,5.54,0,6.29s.42,1.33,1.58,1.1A22.94,22.94,0,0,0,38,15.59Z"></path>
</svg>
</Href>
</div>
<div class="col">
<Href href="https://twitter.com/steeltoeoss" title="Steeltoe on Twitter" NewWindow="true">
<svg id="twitter-icon" width="100px" height="50px" viewBox="0 0 115 75" xmlns="http://www.w3.org/2000/svg">
<defs>
<style>
#twitter-icon .cls-1 {
fill: #ffffff;
}
#twitter-icon .cls-2 {
fill: #000000;
}
</style>
</defs>
<circle class="cls-1" cx="37.97" cy="37.97" r="37.97"></circle>
<path class="cls-2" d="M55.2,22.73a15.43,15.43,0,0,1-4.88,1.91,7.56,7.56,0,0,0-5.61-2.49A7.78,7.78,0,0,0,37,30a7.56,7.56,0,0,0,.2,1.79,21.63,21.63,0,0,1-15.84-8.23,8,8,0,0,0,2.37,10.52,7.66,7.66,0,0,1-3.48-1v.09A7.84,7.84,0,0,0,26.45,41a7.54,7.54,0,0,1-2,.28A7.64,7.64,0,0,1,23,41.09a7.71,7.71,0,0,0,7.18,5.47,15.21,15.21,0,0,1-9.55,3.37,15.78,15.78,0,0,1-1.83-.11,21.41,21.41,0,0,0,11.78,3.54c14.13,0,21.86-12,21.86-22.42,0-.34,0-.68,0-1a15.67,15.67,0,0,0,3.83-4.08,14.9,14.9,0,0,1-4.41,1.24A7.8,7.8,0,0,0,55.2,22.73Z" data-name="Twitter" id="Twitter-2"></path>
</svg>
</Href>
</div>
</div>
<div class="row align-items-center no-gutters pt-0">
<div class="col text-center my-2 small text-muted">
Copyright &copy; 2005-@(DateTime.Now.Year) Broadcom. All Rights Reserved. The term &quot;Broadcom&quot; refers to Broadcom Inc. and/or its subsidiaries.<br />
&bull;&nbsp;<Href Class="text-muted" href="https://www.vmware.com/help/privacy.html" NewWindow="true">Privacy&nbsp;Policy</Href>
&bull;&nbsp;<Href Class="text-muted" href="https://www.vmware.com/help/privacy/california-privacy-rights.html" NewWindow="true">Your&nbsp;California&nbsp;Privacy&nbsp;Rights</Href>
&bull;&nbsp;<Href Class="text-muted" href="https://www.vmware.com/help/legal.html" NewWindow="true">Terms&nbsp;of&nbsp;Use</Href>
&bull;&nbsp;<Href Class="text-muted" href="/SteeltoeTrademarkGuidelines.pdf" NewWindow="true">Trademark&nbsp;Guidelines</Href>
&bull;&nbsp;<Href Class="text-muted ot-sdk-show-settings">Cookie&nbsp;Settings</Href>
</div>
</div>
</div>
</div>
@code {
private DocsSiteOptions docsSite;
protected override void OnInitialized()
{
docsSite = DocsSiteOptions?.Value ?? throw new ArgumentNullException(nameof(docsSite));
}
}
@using Microsoft.Extensions.Options
@inject IOptionsSnapshot<DocsSiteOptions> DocsSiteOptions
<div class="width-all bg-midnight-blue">
<div class="width-90 container" id="footer">
<div class="row bottom-bar">
<div class="col-sm-4 pl-5 text-center">
<Href href="/index">
<?xml version="1.0" encoding="utf-8" ?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="75px" preserveAspectRatio="xMidYMid meet" viewBox="0 0 617.6 180.5" xml:space="preserve">
<style type="text/css">
.logo-white {
fill: #FFFFFF;
}
</style>
<title>PVLG-Steeltoe-white-2019</title>
<polygon class="logo-white" points="70.7,176.2 35.4,115 0,135.4 " />
<polygon class="logo-white" points="78.2,96.2 5.2,54.1 39,112.8 78.2,180.5 156.3,135.4 119.8,72.2 " />
<polygon class="logo-white" points="78.2,0 0,45.1 78.2,90.2 78.2,90.2 156.3,45.1 " />
<path class="logo-white" d="M231.6,77c2.9,1.2,5.9,2.2,8.9,2.8c3.3,0.8,6.6,1.8,9.8,3c2.5,1,4.7,2.6,6.5,4.7c1.9,2.4,2.9,5.4,2.7,8.5
c0.1,4.2-1.8,8.2-5.1,10.9c-3.5,2.9-8.3,4.4-14.6,4.4c-6.5,0.1-12.9-1.5-18.6-4.6c-1.1-0.8-1.8-2.1-1.7-3.4c0-1.1,0.4-2.1,1.1-2.9
c0.7-0.8,1.8-1.3,2.9-1.2c0.6,0,1.3,0.1,1.9,0.4c2.1,0.9,4.3,1.7,6.5,2.2c2.4,0.6,4.9,0.9,7.4,0.8c7.6,0,11.4-2.4,11.4-7.3
c0-1.6-1.1-3.1-2.6-3.6c-2.8-1.2-5.6-2.1-8.6-2.8c-3.4-0.8-6.7-1.8-10-3c-2.6-1-4.9-2.6-6.8-4.7c-1.9-2.3-2.9-5.2-2.8-8.2
c-0.1-4.5,1.8-8.8,5.1-11.7c3.5-3,8.4-4.5,14.8-4.5c5.1,0,10.1,0.8,14.8,2.6c0.9,0.2,1.7,0.8,2.2,1.5c1.2,1.6,1,3.8-0.4,5.2
c-0.8,0.8-1.8,1.2-2.9,1.2c-0.4,0-0.9-0.1-1.3-0.2c-3.8-1.2-7.7-1.8-11.7-1.9c-3.7,0-6.6,0.6-8.6,2c-1.9,1-3.1,3-3.1,5.1
C228.7,74.3,229.8,76.1,231.6,77z" />
<path class="logo-white" d="M299.3,103c0.7,0.7,1.1,1.6,1.1,2.6c0,1.6-0.9,3-2.3,3.6c-2.7,1.2-5.6,1.9-8.5,1.9c-10,0-14.9-4.5-14.9-13.5
V65.8h-7.3c-1.1,0-1.9-0.8-1.9-1.9c0,0,0,0,0-0.1c0-0.7,0.3-1.3,0.9-1.7l13.9-13.6c0.4-0.5,1.1-0.8,1.7-0.9c0.5,0,1,0.2,1.4,0.6
c0.4,0.4,0.6,0.9,0.6,1.4v8.2h11.5c2.1-0.1,3.9,1.5,4,3.7c0,0.1,0,0.2,0,0.3c0,1-0.4,2.1-1.1,2.8c-0.7,0.8-1.8,1.2-2.9,1.2H284v30.9
c0,2.6,0.6,4.4,1.9,5.1c1.5,0.8,3.1,1.1,4.8,1.1c1.4,0,2.8-0.2,4.1-0.6c0.3-0.1,0.6-0.1,0.9-0.2c0.4-0.1,0.8-0.1,1.2-0.1
C297.8,101.9,298.7,102.3,299.3,103z" />
<path class="logo-white" d="M353.4,99.8c0.8,0.7,1.3,1.8,1.2,2.9c0,1.5-0.9,2.8-2.7,3.8c-2.5,1.4-5.1,2.6-7.9,3.4c-3.3,0.8-6.6,1.2-10,1.1
c-8.3,0-14.8-2.4-19.5-7.1s-7-11.4-7-20c-0.1-4.6,0.9-9.2,2.7-13.4c1.7-4,4.6-7.5,8.2-9.9c8.2-5,18.5-5.1,26.7-0.3
c3.6,2.3,6.5,5.6,8.4,9.4c1.9,4,2.9,8.4,2.9,12.9c0,1.2-0.4,2.4-1.3,3.3c-0.9,0.9-2.1,1.4-3.4,1.3H317c0.6,4.8,2.3,8.5,5.3,11.2
c3,2.7,7.2,4,12.6,4c2.5,0,5.1-0.2,7.5-0.8c2.2-0.6,4.3-1.4,6.3-2.3c0.6-0.3,1.2-0.4,1.9-0.4C351.6,98.8,352.6,99.1,353.4,99.8z
M325.1,66.2c-2.3,1.1-4.3,2.8-5.6,5c-1.6,2.5-2.5,5.4-2.5,8.4h30.2c-0.1-3-1-5.9-2.6-8.4c-1.4-2.1-3.4-3.9-5.7-5
c-2.1-1-4.5-1.6-6.8-1.6C329.7,64.7,327.3,65.2,325.1,66.2z" />
<path class="logo-white" d="M411.7,99.8c0.8,0.7,1.3,1.8,1.2,2.9c0,1.5-0.9,2.8-2.7,3.8c-2.5,1.4-5.1,2.6-7.9,3.4c-3.3,0.8-6.6,1.2-10,1.1
c-8.3,0-14.8-2.4-19.5-7.1s-7-11.4-7-20c-0.1-4.6,0.9-9.2,2.7-13.4c1.7-4,4.6-7.5,8.2-9.9c8.2-5,18.5-5.1,26.7-0.3
c3.6,2.3,6.5,5.6,8.4,9.4c1.9,4,2.9,8.4,2.9,12.9c0,1.2-0.4,2.4-1.3,3.3c-0.9,0.9-2.1,1.4-3.4,1.3h-34.7c0.6,4.8,2.3,8.5,5.3,11.2
c3,2.7,7.2,4,12.6,4c2.5,0,5.1-0.2,7.5-0.8c2.2-0.6,4.3-1.4,6.3-2.3c0.6-0.3,1.2-0.4,1.9-0.4C409.9,98.7,411,99.1,411.7,99.8z
M383.5,66.2c-2.3,1.1-4.2,2.8-5.6,5c-1.6,2.5-2.5,5.4-2.6,8.4h30.2c-0.1-3-1-5.9-2.6-8.4c-1.4-2.1-3.4-3.9-5.7-5
c-2.1-1-4.5-1.6-6.8-1.6C388,64.7,385.6,65.2,383.5,66.2z" />
<path class="logo-white" d="M436.1,36.1c0.9,0.9,1.4,2.1,1.3,3.4v66.4c0,1.2-0.5,2.4-1.4,3.3c-0.9,0.9-2.1,1.4-3.3,1.4
c-1.2,0-2.4-0.5-3.3-1.4c-0.9-0.9-1.4-2.1-1.3-3.3V39.5c0-1.2,0.5-2.5,1.3-3.3c0.9-0.9,2-1.4,3.3-1.4
C434,34.7,435.2,35.2,436.1,36.1z" />
<path class="logo-white" d="M482.4,103c0.7,0.7,1.1,1.6,1.1,2.6c0,1.6-0.9,3-2.3,3.6c-2.7,1.2-5.6,1.9-8.5,1.9c-10,0-14.9-4.5-14.9-13.5
V65.8h-7.3c-1.1,0-1.9-0.8-1.9-1.9c0,0,0,0,0-0.1c0-0.7,0.3-1.3,0.9-1.7l13.9-13.6c0.4-0.5,1.1-0.8,1.7-0.9c0.5,0,1,0.2,1.4,0.6
c0.4,0.4,0.6,0.9,0.6,1.4v8.2h11.6c2.1-0.1,3.9,1.5,4,3.7c0,0.1,0,0.2,0,0.3c0,1-0.4,2.1-1.1,2.8c-0.7,0.8-1.8,1.2-2.9,1.2h-11.6
v30.9c0,2.6,0.7,4.4,1.9,5.1c1.5,0.8,3.1,1.1,4.8,1.1c1.4,0,2.8-0.2,4.1-0.6c0.3-0.1,0.6-0.1,0.9-0.2c0.4-0.1,0.8-0.1,1.2-0.1
C480.9,101.9,481.8,102.3,482.4,103z" />
<path class="logo-white" d="M530.5,60.2c3.9,2.2,7.1,5.6,9.2,9.6c4.4,9,4.4,19.4,0,28.4c-2.1,4-5.3,7.3-9.2,9.6c-8.6,4.5-18.9,4.5-27.5,0
c-3.9-2.2-7.1-5.6-9.2-9.6c-4.3-9-4.3-19.4,0-28.4c2.1-4,5.3-7.3,9.2-9.6C511.6,55.6,521.9,55.6,530.5,60.2L530.5,60.2z
M524.8,100.6c2.7-1.4,4.9-3.5,6.4-6.1c1.8-3.3,2.7-6.9,2.5-10.6c0.1-3.7-0.7-7.3-2.5-10.6c-1.5-2.6-3.7-4.7-6.4-6.1
c-2.5-1.2-5.2-1.9-8-1.9c-2.8,0-5.6,0.6-8.1,1.9c-2.7,1.3-4.8,3.5-6.3,6.1c-1.8,3.2-2.6,6.9-2.5,10.6c-0.2,3.7,0.7,7.4,2.4,10.6
c1.4,2.6,3.6,4.8,6.3,6.1c2.5,1.3,5.3,2,8.1,2C519.5,102.6,522.3,101.9,524.8,100.6L524.8,100.6z" />
<path class="logo-white" d="M598.7,99.8c0.8,0.7,1.3,1.8,1.2,2.9c0,1.5-0.9,2.8-2.7,3.8c-2.5,1.4-5.1,2.6-7.9,3.4c-3.3,0.8-6.6,1.2-10,1.1
c-8.3,0-14.8-2.4-19.5-7.1s-7-11.4-7-20c-0.1-4.6,0.9-9.2,2.7-13.4c1.7-4,4.6-7.5,8.2-9.9c8.2-5,18.5-5.1,26.7-0.3
c3.6,2.3,6.5,5.6,8.4,9.4c1.9,4,2.9,8.4,2.8,12.9c0,1.2-0.4,2.4-1.3,3.3c-0.9,0.9-2.1,1.4-3.4,1.3h-34.7c0.6,4.8,2.3,8.5,5.3,11.2
c3,2.7,7.2,4,12.6,4c2.5,0,5.1-0.2,7.5-0.8c2.2-0.6,4.3-1.4,6.3-2.3c0.6-0.3,1.2-0.4,1.9-0.4C596.9,98.7,598,99.1,598.7,99.8z
M570.5,66.2c-2.3,1.1-4.2,2.8-5.6,5c-1.6,2.5-2.5,5.4-2.5,8.4h30.2c-0.1-3-1-5.9-2.6-8.4c-1.4-2.1-3.4-3.9-5.7-5
c-2.1-1-4.5-1.6-6.8-1.6C575,64.7,572.6,65.2,570.5,66.2z" />
<path class="logo-white" d="M611.3,69.5c-3.5,0-6.3-2.8-6.3-6.3c0-3.5,2.8-6.3,6.3-6.3c3.5,0,6.3,2.8,6.3,6.3c0,0,0,0,0,0
C617.6,66.6,614.7,69.5,611.3,69.5z M611.3,57.8c-3,0-5.4,2.4-5.4,5.3c0,3,2.4,5.4,5.4,5.4c3,0,5.3-2.4,5.3-5.3c0,0,0,0,0,0
C616.6,60.2,614.3,57.8,611.3,57.8C611.3,57.8,611.3,57.8,611.3,57.8z M613,66.8l-1.9-2.9h-1.2v2.9h-1v-7.2h2.9
c1.2-0.1,2.3,0.9,2.3,2.1c0,0,0,0,0,0.1c0,1.1-0.8,2-1.8,2.1l2,2.9L613,66.8z M611.8,60.5h-1.9v2.6h1.9c0.7,0,1.3-0.6,1.3-1.3
S612.5,60.5,611.8,60.5C611.8,60.5,611.8,60.5,611.8,60.5z" />
</svg>
</Href>
<Href href="https://dotnetfoundation.org/" NewWindow="true">
<img src="/images/dotnet_foundation_logo-white.webp" alt=".NET Foundation" style="margin-top:30px;max-width:199px;width:80%" />
</Href>
</div>
<div class="col" id="footer-why-col">
<div class="pb-2 font-weight-bold">Why Steeltoe</div>
<div><Href href="/why-steeltoe">Overview</Href></div>
<div><Href href="/microservices">Microservices</Href></div>
<div><Href href="/cloud">Cloud</Href></div>
<div><Href href="/web-applications">Web Applications</Href></div>
<div><Href href="/event-driven">Event Driven</Href></div>
</div>
<div class="col" id="footer-learn-col">
<div class="pb-2 font-weight-bold">Learn</div>
<div><Href href="https://start.steeltoe.io/" NewWindow="true">Steeltoe Initializr</Href></div>
<div><Href href="@(_docsSite.GuidesHome)">Guides</Href></div>
<div><Href href="@(_docsSite.DocsHome)">Documentation</Href></div>
<div><Href href="@(_docsSite.ApiBrowserHome)">API Browser</Href></div>
<div><Href href="@(_docsSite.BlogHome)">Blog</Href></div>
</div>
<div class="col" id="footer-projects-col">
<div class="pb-2 font-weight-bold">Projects</div>
<div><Href href="/app-configuration">Application Configuration</Href></div>
<div><Href href="/circuit-breakers">Circuit Breakers</Href></div>
<div><Href href="/logging">Dynamic Logging</Href></div>
<div><Href href="/cloud-management">Management</Href></div>
<div><Href href="/messaging">Messaging</Href></div>
<div><Href href="@(_docsSite.FileShareHome)">Network File Sharing</Href></div>
<div><Href href="/security-providers">Security</Href></div>
<div><Href href="/service-connectors">Service Connectors</Href></div>
<div><Href href="/service-discovery">Service Discovery</Href></div>
<div><Href href="@(_docsSite.DocsStreamHome)">Stream</Href></div>
</div>
<div class="col" id="footer-others-col">
@*<div class="pb-2 font-weight-bold"><Href href="/training">Training</Href></div>*@
<div class="pb-2 font-weight-bold"><Href href="/support">Support</Href></div>
<div class="pb-2 font-weight-bold"><Href href="/community">Community</Href></div>
</div>
</div>
<div class="row py-sm-0 py-4">
<div class="col text-right">
<Href href="https://github.com/SteeltoeOSS" title="Steeltoe on GitHub" NewWindow="true">
<svg id="github-icon" width="100px" height="50px" viewBox="0 0 1 75" xmlns="http://www.w3.org/2000/svg">
<defs>
<style>
#github-icon .cls-1 {
fill: #ffffff;
}
#github-icon .cls-2 {
fill: #000000;
fill-rule: evenodd;
}
</style>
</defs>
<path class="cls-1" d="M38,0a38,38,0,1,0,38,38A38,38,0,0,0,38,0Z"></path>
<path class="cls-2" d="M38,15.59A22.95,22.95,0,0,0,30.71,60.3c1.15.21,1.57-.5,1.57-1.11s0-2,0-3.9c-6.38,1.39-7.73-3.07-7.73-3.07A6.09,6.09,0,0,0,22,48.86c-2.09-1.42.15-1.39.15-1.39a4.81,4.81,0,0,1,3.52,2.36c2,3.5,5.37,2.49,6.67,1.91a4.87,4.87,0,0,1,1.46-3.07c-5.09-.58-10.45-2.55-10.45-11.34a8.84,8.84,0,0,1,2.36-6.15,8.29,8.29,0,0,1,.23-6.07s1.92-.62,6.3,2.35a21.82,21.82,0,0,1,11.49,0c4.38-3,6.3-2.35,6.3-2.35a8.29,8.29,0,0,1,.23,6.07,8.84,8.84,0,0,1,2.36,6.15c0,8.81-5.37,10.75-10.48,11.32a5.46,5.46,0,0,1,1.56,4.25c0,3.07,0,5.54,0,6.29s.42,1.33,1.58,1.1A22.94,22.94,0,0,0,38,15.59Z"></path>
</svg>
</Href>
</div>
<div class="col">
<Href href="https://twitter.com/steeltoeoss" title="Steeltoe on Twitter" NewWindow="true">
<svg id="twitter-icon" width="100px" height="50px" viewBox="0 0 115 75" xmlns="http://www.w3.org/2000/svg">
<defs>
<style>
#twitter-icon .cls-1 {
fill: #ffffff;
}
#twitter-icon .cls-2 {
fill: #000000;
}
</style>
</defs>
<circle class="cls-1" cx="37.97" cy="37.97" r="37.97"></circle>
<path class="cls-2" d="M55.2,22.73a15.43,15.43,0,0,1-4.88,1.91,7.56,7.56,0,0,0-5.61-2.49A7.78,7.78,0,0,0,37,30a7.56,7.56,0,0,0,.2,1.79,21.63,21.63,0,0,1-15.84-8.23,8,8,0,0,0,2.37,10.52,7.66,7.66,0,0,1-3.48-1v.09A7.84,7.84,0,0,0,26.45,41a7.54,7.54,0,0,1-2,.28A7.64,7.64,0,0,1,23,41.09a7.71,7.71,0,0,0,7.18,5.47,15.21,15.21,0,0,1-9.55,3.37,15.78,15.78,0,0,1-1.83-.11,21.41,21.41,0,0,0,11.78,3.54c14.13,0,21.86-12,21.86-22.42,0-.34,0-.68,0-1a15.67,15.67,0,0,0,3.83-4.08,14.9,14.9,0,0,1-4.41,1.24A7.8,7.8,0,0,0,55.2,22.73Z" data-name="Twitter" id="Twitter-2"></path>
</svg>
</Href>
</div>
</div>
<div class="row align-items-center no-gutters pt-0">
<div class="col text-center my-2 small text-muted">
Copyright &copy; 2005-@(DateTime.Now.Year) Broadcom. All Rights Reserved. The term &quot;Broadcom&quot; refers to Broadcom Inc. and/or its subsidiaries.<br />
&bull;&nbsp;<Href Class="text-muted" href="https://www.vmware.com/help/privacy.html" NewWindow="true">Privacy&nbsp;Policy</Href>
&bull;&nbsp;<Href Class="text-muted" href="https://www.vmware.com/help/privacy/california-privacy-rights.html" NewWindow="true">Your&nbsp;California&nbsp;Privacy&nbsp;Rights</Href>
&bull;&nbsp;<Href Class="text-muted" href="https://www.vmware.com/help/legal.html" NewWindow="true">Terms&nbsp;of&nbsp;Use</Href>
&bull;&nbsp;<Href Class="text-muted" href="/SteeltoeTrademarkGuidelines.pdf" NewWindow="true">Trademark&nbsp;Guidelines</Href>
&bull;&nbsp;<Href Class="text-muted ot-sdk-show-settings">Cookie&nbsp;Settings</Href>
</div>
</div>
</div>
</div>
@code {
private DocsSiteOptions _docsSite;
protected override void OnInitialized()
{
_docsSite = DocsSiteOptions?.Value ?? throw new ArgumentNullException(nameof(_docsSite));
}
}

Просмотреть файл

@ -1,76 +1,75 @@
@using Microsoft.Extensions.Options
@inject IOptions<DocsSiteOptions> DocsSiteOptions
<nav class="bg-white navbar navbar-expand-xl container py-xl-2 navbar-light">
<Href class="navbar-brand" href="/">
<img id="logo" class="svg" src="/images/logo.svg" alt="Steeltoe" style="width:211px">
</Href>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar">
<ul class=" navbar-nav text-center">
<li class="nav-item dropdown ml-xl-5 mr-xl-2">
<a class="nav-link dropdown-toggle open" href="#" id="why" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Why Steeltoe
</a>
<div class="dropdown-menu" aria-labelledby="why">
<Href class="dropdown-item" href="/why-steeltoe">Overview</Href>
<Href class="dropdown-item" href="/microservices">Microservices</Href>
<Href class="dropdown-item" href="/cloud">Cloud</Href>
<Href class="dropdown-item" href="/web-application">Web Applications</Href>
<Href class="dropdown-item" href="/event-driven">Event Driven</Href>
</div>
</li>
<li class="nav-item dropdown mx-xl-2">
<a class="nav-link dropdown-toggle" href="#" id="learn" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Get Started
</a>
<div class="dropdown-menu" aria-labelledby="learn">
<Href class="dropdown-item" href="https://start.steeltoe.io/" NewWindow>Steeltoe Initializr</Href>
<Href class="dropdown-item" href="@(_docsSite.GuidesHome)">Guides</Href>
<Href class="dropdown-item" href="@(_docsSite.DocsHome)">Documentation</Href>
<Href class="dropdown-item" href="@(_docsSite.ApiBrowserHome)">API Browser</Href>
<Href class="dropdown-item" href="@(_docsSite.BlogHome)">Blog</Href>
</div>
</li>
<li class="nav-item dropdown mx-xl-2">
<a class="nav-link dropdown-toggle" href="#" id="projects" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Projects
</a>
<div class="dropdown-menu" aria-labelledby="projects">
<Href class="dropdown-item" href="/app-configuration">Steeltoe Application Configuration</Href>
<Href class="dropdown-item" href="/circuit-breakers">Steeltoe Circuit Breakers</Href>
<Href class="dropdown-item" href="/cloud-management">Steeltoe Distributed Tracing</Href>
<Href class="dropdown-item" href="/docs/logging">Steeltoe Dynamic Logging</Href>
<Href class="dropdown-item" href="/cloud-management">Steeltoe Management</Href>
<Href class="dropdown-item" href="/messaging">Steeltoe Messaging</Href>
<Href class="dropdown-item" href="/fileshares">Steeltoe Network File Sharing</Href>
<Href class="dropdown-item" href="/security-providers">Steeltoe Security</Href>
<Href class="dropdown-item" href="/service-connectors">Steeltoe Service Connectors</Href>
<Href class="dropdown-item" href="/service-discovery">Steeltoe Service Discovery</Href>
<Href class="dropdown-item" href="@(_docsSite.DocsStreamHome)">Steeltoe Stream</Href>
</div>
</li>
@*<li class="nav-item mx-xl-2">
<Href class="nav-link" href="/training">Training</Href>
</li>*@
<li class="nav-item mx-xl-2">
<Href class="nav-link" href="/support">Support</Href>
</li>
<li class="nav-item mx-xl-2">
<Href class="nav-link" href="/community">Community</Href>
</li>
</ul>
</div>
</nav>
@code {
private DocsSiteOptions _docsSite;
protected override void OnInitialized()
{
_docsSite = DocsSiteOptions?.Value ?? throw new ArgumentNullException(nameof(_docsSite));
}
}
@using Microsoft.Extensions.Options
@inject IOptionsSnapshot<DocsSiteOptions> DocsSiteOptions
<nav class="bg-white navbar navbar-expand-xl container py-xl-2 navbar-light">
<Href class="navbar-brand" href="/">
<img id="logo" class="svg" src="/images/logo.svg" alt="Steeltoe" style="width:211px">
</Href>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar">
<ul class="navbar-nav text-center">
<li class="nav-item dropdown ml-xl-5 mr-xl-2">
<a class="nav-link dropdown-toggle" href="#" id="why" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" onclick="return false;">
Why Steeltoe
</a>
<div class="dropdown-menu" aria-labelledby="why">
<Href class="dropdown-item" href="/why-steeltoe">Overview</Href>
<Href class="dropdown-item" href="/microservices">Microservices</Href>
<Href class="dropdown-item" href="/cloud">Cloud</Href>
<Href class="dropdown-item" href="/web-application">Web Applications</Href>
<Href class="dropdown-item" href="/event-driven">Event Driven</Href>
</div>
</li>
<li class="nav-item dropdown mx-xl-2">
<a class="nav-link dropdown-toggle" href="#" id="learn" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" onclick="return false;">
Get Started
</a>
<div class="dropdown-menu" aria-labelledby="learn">
<Href class="dropdown-item" href="https://start.steeltoe.io/" NewWindow>Steeltoe Initializr</Href>
<Href class="dropdown-item" href="@(_docsSite.GuidesHome)">Guides</Href>
<Href class="dropdown-item" href="@(_docsSite.DocsHome)">Documentation</Href>
<Href class="dropdown-item" href="@(_docsSite.ApiBrowserHome)">API Browser</Href>
<Href class="dropdown-item" href="@(_docsSite.BlogHome)">Blog</Href>
</div>
</li>
<li class="nav-item dropdown mx-xl-2">
<a class="nav-link dropdown-toggle" href="#" id="projects" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" onclick="return false;">
Projects
</a>
<div class="dropdown-menu" aria-labelledby="projects">
<Href class="dropdown-item" href="/app-configuration">Steeltoe Application Configuration</Href>
<Href class="dropdown-item" href="/circuit-breakers">Steeltoe Circuit Breakers</Href>
<Href class="dropdown-item" href="/docs/logging">Steeltoe Dynamic Logging</Href>
<Href class="dropdown-item" href="/cloud-management">Steeltoe Management</Href>
<Href class="dropdown-item" href="/messaging">Steeltoe Messaging</Href>
<Href class="dropdown-item" href="@(_docsSite.FileShareHome)">Steeltoe Network File Sharing</Href>
<Href class="dropdown-item" href="/security-providers">Steeltoe Security</Href>
<Href class="dropdown-item" href="/service-connectors">Steeltoe Service Connectors</Href>
<Href class="dropdown-item" href="/service-discovery">Steeltoe Service Discovery</Href>
<Href class="dropdown-item" href="@(_docsSite.DocsStreamHome)">Steeltoe Stream</Href>
</div>
</li>
@*<li class="nav-item mx-xl-2">
<Href class="nav-link" href="/training">Training</Href>
</li>*@
<li class="nav-item mx-xl-2">
<Href class="nav-link" href="/support">Support</Href>
</li>
<li class="nav-item mx-xl-2">
<Href class="nav-link" href="/community">Community</Href>
</li>
</ul>
</div>
</nav>
@code {
private DocsSiteOptions _docsSite;
protected override void OnInitialized()
{
_docsSite = DocsSiteOptions?.Value ?? throw new ArgumentNullException(nameof(_docsSite));
}
}

Просмотреть файл

@ -1,58 +1,51 @@
@page "/community"
<Template Name="Community">
<Description>Connect with other developers and share your project with the Steeltoe community.</Description>
<OtherArea>
<div class="row no-gutters">
<div class="col">
<div class="component-whatis-title"><h2>Office Hours Meetup</h2></div>
<div class="my-5">
<div>The Steeltoe team hosts office hours meetup every other month. All of Steeltoe community is invited. It's a chance to discuss open issues, pull requests, review features in an upcoming release, and propose new ideas.</div>
<br />
<div>
<a href="site-data/SteeltoeCommunityMeetingInvite.ics" target="_blank">Add to Calendar (.ics)</a> - Occurs on the second Tuesday of every other month (January, March, May, July, September, November) at 10:30am ET <br />
<a href="https://docs.google.com/document/d/1Um9FmlgOb4QiU2bNdg9oXLadWyDgW1167QXH9HUG068/">Meeting Agenda and Notes link</a><br />
Zoom meeting ID: 926 8707 7667<br />
Passcode: 224068<br />
<a href="https://VMware.zoom.us/j/92687077667?pwd=NXpPWWxlMVlEREZuNHRta2JlS2dZdz09">Zoom invite link</a>
<br />
</div>
<br />
<div>Our previous community meetings are available on our <a href="https://www.youtube.com/channel/UC_H-y302UxKnjx_fRmrqBMA">Steeltoe OSS Channel</a></div>
<br />
</div>
</div>
</div>
<div class="row no-gutters mb-5">
<div class="col-6">
<div class="component-whatis-title"><h2>Developers</h2></div>
<div class="my-5">
<div><Href href="https://slack.steeltoe.io" NewWindow="true">Steeltoe Slack</Href></div>
<div>Slack is the best place to get your questions answered, contribute to conversations, and find the latest information about the Steeltoe project. If you have trouble joining, try <a href="https://join.slack.com/t/steeltoeteam/shared_invite/zt-1cd7lh4pi-BlfQsI6nEDEX2qbh5JrRZw">this link</a> or <a href="mailto:info@steeltoe.io?subject=Slack%20Invite">email us</a>.</div>
</div>
<div class="my-5">
<div><Href href="https://stackoverflow.com/questions/tagged/steeltoe" NewWindow="true">Stack Overflow</Href></div>
<div>Ask questions and get help with problems from the global Steeltoe community of users and practitioners.</div>
</div>
<div class="my-5">
<div class=""><Href href="https://github.com/steeltoeoss" NewWindow="true">Steeltoe on GitHub</Href></div>
<div>Find the code for Steeltoe projects, raise issues, suggest changes, and view milestones and releases.</div>
</div>
<div class="my-5">
<div class=""><Href href="https://twitter.com/steeltoeoss" NewWindow="true">Steeltoe on Twitter</Href></div>
<div>Stay up to date with the latest Steeltoe releases and blog posts.</div>
</div>
</div>
<div class="col offset-2">
<div class="component-whatis-title"><h2>New Projects</h2></div>
<div class="my-5">
<div class=""><Href href="https://github.com/steeltoeoss-incubator" NewWindow="true">Steeltoe Incubator</Href></div>
<div>A place to get your hands on some of the new projects or features being considered for Steeltoe or use with Steeltoe. If you have a new feature or component that you would like to be included in Steeltoe, start by discussing with the team on Steeltoe Slack.</div>
</div>
</div>
</div>
</OtherArea>
</Template>
@code{
}
@page "/community"
<Template Name="Community">
<Description>Connect with other developers and share your project with the Steeltoe community.</Description>
<OtherArea>
<div class="row no-gutters">
<div class="col">
<div class="component-whatis-title"><h2>Office Hours Meetup</h2></div>
<div class="my-5">
<div>The Steeltoe team hosts office hours meetup every other month. All of Steeltoe community is invited. It's a chance to discuss open issues, pull requests, review features in an upcoming release, and propose new ideas.</div>
<br />
<div>
<a href="site-data/SteeltoeCommunityMeetingInvite.ics" target="_blank">Add to Calendar (.ics)</a> - Occurs on the second Tuesday of every other month (January, March, May, July, September, November) at 10:30am ET <br />
<a href="https://docs.google.com/document/d/1Um9FmlgOb4QiU2bNdg9oXLadWyDgW1167QXH9HUG068/">Meeting Agenda and Notes link</a><br />
Zoom meeting ID: 926 8707 7667<br />
Passcode: 224068<br />
<a href="https://VMware.zoom.us/j/92687077667?pwd=NXpPWWxlMVlEREZuNHRta2JlS2dZdz09">Zoom invite link</a>
<br />
</div>
<br />
<div>Our previous community meetings are available on our <a href="https://www.youtube.com/channel/UC_H-y302UxKnjx_fRmrqBMA">Steeltoe OSS Channel</a></div>
<br />
</div>
</div>
</div>
<div class="row no-gutters mb-5">
<div class="col-6">
<div class="component-whatis-title"><h2>Developers</h2></div>
<div class="my-5">
<div><Href href="https://slack.steeltoe.io" NewWindow="true">Steeltoe Slack</Href></div>
<div>Slack is the best place to get your questions answered, contribute to conversations, and find the latest information about the Steeltoe project. If you have trouble joining, try <a href="https://join.slack.com/t/steeltoeteam/shared_invite/zt-1cd7lh4pi-BlfQsI6nEDEX2qbh5JrRZw">this link</a> or <a href="mailto:info@steeltoe.io?subject=Slack%20Invite">email us</a>.</div>
</div>
<div class="my-5">
<div><Href href="https://stackoverflow.com/questions/tagged/steeltoe" NewWindow="true">Stack Overflow</Href></div>
<div>Ask questions and get help with problems from the global Steeltoe community of users and practitioners.</div>
</div>
<div class="my-5">
<div class=""><Href href="https://github.com/SteeltoeOSS" NewWindow="true">Steeltoe on GitHub</Href></div>
<div>Find the code for Steeltoe projects, raise issues, suggest changes, and view milestones and releases.</div>
</div>
<div class="my-5">
<div class=""><Href href="https://twitter.com/steeltoeoss" NewWindow="true">Steeltoe on Twitter</Href></div>
<div>Stay up to date with the latest Steeltoe releases and blog posts.</div>
</div>
</div>
</div>
</OtherArea>
</Template>
@code{
}

Просмотреть файл

@ -1,24 +0,0 @@
@page "/logging/get-started"
@inject IHttpContextAccessor HttpContextAccessor
@inject IOptionsSnapshot<DocsSiteOptions> DocsSiteOptions
<Breadcrumbs NavName="Getting Started"
ParentLinkName="Logging"
ParentLinkUrl="/logging" />
<GetStarted>
<ComponentName>Logging</ComponentName>
<Tutorials>
<h1>This page has moved, find the new location <NavLink href="@(DocsSiteOptions.Value.BaseAddress + "/guides/")">here</NavLink></h1>
</Tutorials>
</GetStarted>
@code
{
protected override void OnInitialized()
{
if (HttpContextAccessor.HttpContext != null)
{
var uri = new Uri(DocsSiteOptions.Value.BaseAddress + "/guides/").ToString();
HttpContextAccessor.HttpContext.Response.Redirect(uri, true);
}
}
}

Просмотреть файл

@ -1,38 +1,27 @@
@page "/dynamic-logging"
@page "/steeltoe-logging"
<Template Name="Dynamic Logging" Features="@features" DocsURL="/docs/logging">
<Description>XXXXXXX</Description>
<WhatIs>XXXXXXX</WhatIs>
<WhyUse>XXXXXXX</WhyUse>
<FeatureTemplate Context="Feature">
<div class="row component-feature no-gutters">
<div class="col-6 text-center"><div class="component-feature-img"><img class="img-fluid" src="@Feature.Img" /></div></div>
<div class="col">
<div class="component-feature-title">@Feature.Title</div>
<div class="component-feature-desc">@Feature.Description</div>
</div>
</div>
</FeatureTemplate>
<AltFeatureTemplate Context="Feature">
<div class="row component-feature no-gutters">
<div class="col-6">
<div class="component-feature-title">@Feature.Title</div>
<div class="component-feature-desc">@Feature.Description</div>
</div>
<div class="col-6 text-center"><div class="component-feature-img"><img class="img-fluid" src="@Feature.Img" /></div></div>
</div>
</AltFeatureTemplate>
</Template>
@code{
private Feature[] features = new[] {
new Feature() {
Title = (MarkupString)"",
Description = (b => {
b.AddMarkupContent(1,"");
}),
Img = ""
}
};
}
@page "/logging/get-started"
@page "/dynamic-logging"
@page "/steeltoe-logging"
@inject IHttpContextAccessor HttpContextAccessor
@inject IOptionsSnapshot<DocsSiteOptions> DocsSiteOptions
<Breadcrumbs NavName="Getting Started"
ParentLinkName="Logging"
ParentLinkUrl="/logging" />
<GetStarted>
<ComponentName>Logging</ComponentName>
<Tutorials>
<h1>This page has moved, find the new location <NavLink href="@(DocsSiteOptions.Value.DynamicLoggingHome)">here</NavLink></h1>
</Tutorials>
</GetStarted>
@code
{
protected override void OnInitialized()
{
if (HttpContextAccessor.HttpContext != null)
{
var uri = new Uri(DocsSiteOptions.Value.DynamicLoggingHome).ToString();
HttpContextAccessor.HttpContext.Response.Redirect(uri, true);
}
}
}

Просмотреть файл

@ -1,4 +1,4 @@
@page "/event-driven"
@page "/event-driven"
<Template Name="Event Driven" Features="@features" NameIsPlural="false">
<Description>Event-driven systems reflect how modern businesses actually work, with thousands of small changes happening all day, every day. Steeltoes ability to handle events and enable developers to build applications around them, means your apps will stay in sync with your business. Steeltoe has event-driven options like streaming all the way to cloud functions, and data flows.</Description>
@ -61,7 +61,7 @@
Description = (b => {
b.AddMarkupContent(1,"Steeltoe Stream improves your productivity when working with RabbitMQ, providing three key abstractions to simplify your code. “Binders” integrate with external messaging systems. “Bindings” bridge the gap between the messaging systems and your code. “Messages” provide the structure that your code uses to send and receive data.<Br /><br />Steeltoe Stream also provides support for provisioning, content conversion, error handling, configuration management, consumer groups, partitioning, monitoring, and health checks.<Br /><br />");
b.OpenComponent<Href>(2);
b.AddAttribute(3, "href","https://docs.steeltoe.io/api/v3/stream/");
b.AddAttribute(3, "href","/docs/stream");
b.AddAttribute(4, "AsButton",true);
b.AddAttribute(5, "ChildContent", (RenderFragment)((b) => {b.AddContent(6, "Learn more");}));
b.CloseComponent();
@ -76,4 +76,4 @@
// Img = "/images/Icon_network.svg"
//}
};
}
}

Просмотреть файл

@ -1,152 +0,0 @@
@page "/get-started/basics"
<Breadcrumbs NavName="Steeltoe Basics"
ParentLinkName="Get Started"
ParentLinkUrl="/get-started"
ShowGetStarted="false" />
<Tutorial>
<Title>Building a basic ASP.NET Core app with Steeltoe</Title>
<Description>This tutorial takes you through setting up a .NET Core application that uses the essential Steeltoe packages, every microservice should have.</Description>
<TutorialSteps>
<div class="row">
<div class="col-12 getting-started-header">First, <b>create a .NET Core WebAPI</b></div>
</div>
<div class="row">
<div class="col-12 getting-started-ordered-list">
<ol>
<li>
In Visual Studio (2019) choose to create a new project
<img src="images/new-vs-proj/create-new-project.png" class="img-fluid" />
</li>
<li>
Configure the new project with the follow values
<img src="images/new-vs-proj/configure-new-project.png" class="img-fluid" />
<ul>
<li><b>Project Name:</b> @ProjectName</li>
<li><b>Solution Name:</b> @ProjectName</li>
<li><b>Framework:</b> (>= 4.5)</li>
</ul>
</li>
<li>
Choose to create a new Web API project type
<img src="images/new-vs-proj/create-new-asp_net-web-app.png" class="img-fluid" />
</li>
<li>
Once created, the project should be loaded
<img src="images/new-vs-proj/create-successful.png" class="img-fluid" />
</li>
</ol>
</div>
</div>
<div class="row">
<div class="col-12 getting-started-header">Next, <b>install packages</b> needed</div>
</div>
<div class="row">
<div class="col-12 getting-started-ordered-list">
<ol>
<li>
Open the package manager console
<img src="images/initializr/open-package-manager-console.png" class="img-fluid" />
</li>
<li>
Install NuGet distributed packages
<pre><code>Install-Package -Id Steeltoe.Security.Authentication.CloudFoundryOwin -Version @SteeltoeVersion
Install-Package -Id Steeltoe.Management.EndpointCore -Version @SteeltoeVersion
Install-Package -Id Steeltoe.Extensions.Logging.DynamicLogger -Version @SteeltoeVersion
Install-Package -Id Steeltoe.Management.TracingCore -Version @SteeltoeVersion</code></pre>
</li>
</ol>
</div>
</div>
<div class="row">
<div class="col-12 getting-started-header">Then, <b>add</b> the management endpoints to the host builder, and run the app</div>
</div>
<div class="row">
<ol class="col-12 getting-started-ordered-list">
<li>
Set the endpoints in <b>Program.cs</b>
<pre><code>using Steeltoe.Management.Endpoint;
...
public class Startup {
...
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup&lt;Startup&gt;();
})
.AddHealthActuator()
.AddInfoActuator()
.AddLoggersActuator();
}</code></pre>
</li>
<li>
Start distributed tracing in <b>Startup.cs</b>
<pre><code>using Steeltoe.Management.Tracing;
...
public class Startup {
...
public void ConfigureServices(IServiceCollection services){
services.AddDistributedTracing(Configuration);
...
}
...
}</code></pre>
</li>
<li>
Open the <b>Controllers\WeatherForecastController.cs</b> file and test logging messages
<pre><code>using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
...
[HttpGet]
public IEnumerable&lt;WeatherForecast&gt; Get() {
_logger.LogInformation("Hi there from the logger!");
...
}</code></pre>
</li>
<li>
<div>Run the application</div>
<div>
<TabSet>
<Steeltoe.Client.Components.RunAppTab.Local ProjectName="@ProjectName" IncludeNavigateToApp="true" />
</TabSet>
</div>
</li>
<li>
<div>Navigate to the health endpoint</div>
<div>
xxxxxx
</div>
</li>
<li>
<div>Observe the logs for trace and span information</div>
<div>
xxxxxx
</div>
</li>
</ol>
</div>
</TutorialSteps>
</Tutorial>
@code
{
//private string ServiceName = "Place Holder";
private const string ProjectName = "Steeltoe_Basics";
private const string SteeltoeVersion = "3.0";
}

Просмотреть файл

@ -1,45 +0,0 @@
@page "/initializr/get-started"
<Breadcrumbs NavName="Get Started"
ParentLinkName="Initializr"
ParentLinkUrl="/initializr"
ShowGetStarted="false" />
<Tutorial>
<Title>Steeltoe Initializr</Title>
<Description>This tutorial takes you through creating a .NET Core Microservice using Steeltoe Initializr.</Description>
<TutorialSteps>
<div class="row">
<div class="col-12 getting-started-header">First, <b>create a .NET Core WebAPI</b></div>
</div>
<div class="row">
<div class="col-12 getting-started-ordered-list">
<ol>
<li>
<Steeltoe.Client.Components.AppSettingsTab.Initiallizr ProjectName="@ProjectName" />
</li>
<li>Extract the zipped project and open in your IDE of choice (we use Visual Studio)</li>
<li>
<div>Run the application</div>
<div>
<TabSet>
<Steeltoe.Client.Components.RunAppTab.Local ProjectName="@ProjectName" />
<Steeltoe.Client.Components.RunAppTab.CloudFoundry ProjectName="@ProjectName" NoCFServices="true" />
<Steeltoe.Client.Components.RunAppTab.AzureAppService>
<AzureDeployHowToUrl>https://docs.microsoft.com/en-us/visualstudio/deployment/quickstart-deploy-to-azure?view=vs-2019</AzureDeployHowToUrl>
</Steeltoe.Client.Components.RunAppTab.AzureAppService>
<Steeltoe.Client.Components.RunAppTab.Kubernetes ProjectName="@ProjectName" />
</TabSet>
</div>
</li>
<li>
That's it! You have generated a .NET Core microservice using all the latest patterns. Go back and try adding a dependency or <Href href="/getstarted">try other tutorials</Href>
</li>
</ol>
</div>
</div>
</TutorialSteps>
</Tutorial>
@code
{
private const string ProjectName = "Initializr_Example";
}

Просмотреть файл

@ -1,69 +1,67 @@
@page "/initializr"
<Template Name="Steeltoe Initializr" GettingStartedURL="https://start.steeltoe.io" ShowBottomGetStarted="false">
<Description>
<div class="row no-gutters mb-4">
<div class="col-8 offset-2" style="font-size: 71%;">
<Banner Href="https://github.com/SteeltoeOSS/steeltoe/blob/master/roadmaps/3.0.0.md" BannerTypeName="beta">
<span class="font-weight-bold">Initializr is in beta development.</span> Version 1 is coming very soon! &gt; &nbsp;&nbsp;
</Banner>
</div>
</div>
One of the biggest secrets to highly productive .NET development teams is application generators. Enterprises have found that developers adopt platforms far quicker when everything they need to get started is right there, at their fingertips. Application generators help developers to get started quickly by providing useful guide rails that reduce toil and ease their burden. Application generators also encourage common approaches to common problems, which is particularly useful if you have lots of teams creating microservices at the same time.
</Description>
<WhyUse>
An application generator can help bond development teams and security teams to the same vision by making the right thing, the easy thing. Instead of developers using previous projects to start a new project they use the application generator. Now they can start with an up to date version of all required dependencies!
</WhyUse>
<WhatIs>
The Steeltoe Initializr project is an application generator meant to get cloud-native .NET developers going very quickly. But it doesnt stop there. Chances are your apps arent just using the typical .NET Core or Steeltoe libraries. Its also using internal custom libraries specific to your business. Every business has libraries: tools they rely on to simplify tasks or take care of the plumbing. These libraries are quite important and often include proprietary business logic thats both private and unique. Application generators can help developers to get easy access to these libraries without having to delve into docs, wade through wikis, or search in NuGet repositories.
</WhatIs>
<OtherArea>
<div class="row no-gutters">
<div class="col component-whyuse-title mt-0">
<h2>Using Initializr</h2>
</div>
</div>
<div class="row mb-5 no-gutters">
<div class="col component-whyuse-desc">
There are a few ways you can use Steeltoe Initializr. Every option gives you the same ready to go Visual Studio project. The typical use of Initializr is hosting the service in-house. Because it is a nuget distributed package included in an even simple'r .NET Core app, hosting and staying up to date doesn't come with a bunch of debt. Hosting in-house also gives teams the option to add their own private dependencies to the service, but stay up to date with the community.
</div>
</div>
<div class="row mb-5 no-gutters">
<div class="col component-whyuse-desc">
<h4>Hosted Service</h4>
<div>
As a hosted service, Initializr offers both API and browser interfaces. The service itself is distributed as a Nuget package which you include in a new .NET Core web project. From there you can run the project as a web-based service. Out of the box you'll get all the <Href href="https://github.com/SteeltoeOSS/initializr" NewWindow="true">default dependencies</Href> along with endpoints for interaction. Try the below curl command that uses our hosted Initializr service to get started.<br /><br />
<pre><code class="bash">curl https://start.steeltoe.io/starter.zip -d "dependencies=Actuators,DynamicLogger,SQL Server" -d "projectName=MyCompany.MySample" -o "myProject.zip"</code></pre>
</div>
</div>
<div class="col component-whyuse-desc">
<h4>Browser UI</h4>
<div>
Along with adding the Initializr package, you can optionally add a UI in the same .NET Core project. This gives developers an additional interaction with the Initializr service. We have created a <Href href="https://github.com/SteeltoeOSS/initializr" NewWindow="true">basic web project</Href> doing just that to help get started. If you'de like to see the UI in action head over to <Href href="https://start.steeltoe.io" NewWindow="true">https://start.steeltoe.io</Href> and create your first Initializr project now!
</div>
</div>
</div>
<div class="row no-gutters">
<div class="col component-whyuse-title mt-0">
<h2>About Dependencies</h2>
</div>
</div>
<div class="row mb-5 no-gutters">
<div class="col component-whyuse-desc">
No matter the way you choose to use Initializr, the value is in the distribution of pre-packaged dependencies. The <Href href="xxxx" target="_blank">default dependencies</Href> included in Initializr are mostly Steeltoe focused. Things like database connectors, a Spring config client, a Consul discovery client, and many others. But this is a community driven project, so it only makes sense to offer ways for the .NET community to contribute.<br /><br />
<h4>Creating private dependencies</h4>
Running Initializr in-house isnt just about limited network connections. The Steeltoe Initializr is meant to be extended. While having the ability to generate Steeltoe projects automatically is super awesome, what if you could also add in your own dependencies? What if your organization could offer a starting place for all developers, that (safely) includes your best practices and secret sauce?<br /><br />
<h4>Creating for public use on start.steeltoe.io</h4>
If you would like for your Initializr dependency to be a part of the publicly hosted service, please review the <Href href="https://github.com/SteeltoeOSS/initializr/blob/master/THIRD-PARTY-CONTRIBUTIONS.md" NewWindow="true">guidelines</Href>. Once you have everything in place, <Href href="https://github.com/SteeltoeOSS/initializr/issues" NewWindow="true">open an enhancement issue in GitHub</Href>.<br /><br />
<h4>Getting listed in the incubator</h4>
Sometimes you have a great idea for a very useful dependency but don't have the time to maintain it. If that's the case, follow the <Href href="https://github.com/SteeltoeOSS/initializr/blob/master/THIRD-PARTY-CONTRIBUTIONS.md" target="_blank">guidelines</Href> as closely as possible, and request a new repo in Steeltoe's <Href href="https://github.com/SteeltoeOSS-incubator" target="_blank">incubator org</Href>. This is a place to share Steeltoe based ideas with the community, giving them the option to use.
</div>
</div>
<div class="col text-center m-5">
<div class="mb-5"><h2>Ready to get started?</h2></div>
<div class=""><Href href="https://start.steeltoe.io" AsButton="true" NewWindow="true">GET STARTED</Href></div>
</div>
</OtherArea>
</Template>
@code{
}
@page "/initializr"
<Template Name="Steeltoe Initializr" GettingStartedURL="https://start.steeltoe.io" ShowBottomGetStarted="false">
<Description>
<div class="row no-gutters mb-4">
<div class="col-8 offset-2" style="font-size: 71%;">
<Banner Href="https://github.com/SteeltoeOSS/steeltoe/blob/master/roadmaps/3.0.0.md" BannerTypeName="beta">
<span class="font-weight-bold">Initializr is in beta development.</span> Version 1 is coming very soon! &gt; &nbsp;&nbsp;
</Banner>
</div>
</div>
One of the biggest secrets to highly productive .NET development teams is application generators. Enterprises have found that developers adopt platforms far quicker when everything they need to get started is right there, at their fingertips. Application generators help developers to get started quickly by providing useful guide rails that reduce toil and ease their burden. Application generators also encourage common approaches to common problems, which is particularly useful if you have lots of teams creating microservices at the same time.
</Description>
<WhyUse>
An application generator can help bond development teams and security teams to the same vision by making the right thing, the easy thing. Instead of developers using previous projects to start a new project they use the application generator. Now they can start with an up to date version of all required dependencies!
</WhyUse>
<WhatIs>
The Steeltoe Initializr project is an application generator meant to get cloud-native .NET developers going very quickly. But it doesnt stop there. Chances are your apps arent just using the typical .NET Core or Steeltoe libraries. Its also using internal custom libraries specific to your business. Every business has libraries: tools they rely on to simplify tasks or take care of the plumbing. These libraries are quite important and often include proprietary business logic thats both private and unique. Application generators can help developers to get easy access to these libraries without having to delve into docs, wade through wikis, or search in NuGet repositories.
</WhatIs>
<OtherArea>
<div class="row no-gutters">
<div class="col component-whyuse-title mt-0">
<h2>Using Initializr</h2>
</div>
</div>
<div class="row mb-5 no-gutters">
<div class="col component-whyuse-desc">
There are a few ways you can use Steeltoe Initializr. Every option gives you the same ready to go Visual Studio project. The typical use of Initializr is hosting the service in-house. Because it is a nuget distributed package included in an even simple'r .NET Core app, hosting and staying up to date doesn't come with a bunch of debt. Hosting in-house also gives teams the option to add their own private dependencies to the service, but stay up to date with the community.
</div>
</div>
<div class="row mb-5 no-gutters">
<div class="col component-whyuse-desc">
<h4>Hosted Service</h4>
<div>
As a hosted service, Initializr offers both API and browser interfaces. The service itself is distributed as a Nuget package which you include in a new .NET Core web project. From there you can run the project as a web-based service. Out of the box you'll get all the <Href href="https://github.com/SteeltoeOSS/initializr" NewWindow="true">default dependencies</Href> along with endpoints for interaction. Try the below curl command that uses our hosted Initializr service to get started.<br /><br />
<pre><code class="bash">curl https://start.steeltoe.io/starter.zip -d "dependencies=Actuators,DynamicLogger,SQL Server" -d "projectName=MyCompany.MySample" -o "myProject.zip"</code></pre>
</div>
</div>
<div class="col component-whyuse-desc">
<h4>Browser UI</h4>
<div>
Along with adding the Initializr package, you can optionally add a UI in the same .NET Core project. This gives developers an additional interaction with the Initializr service. We have created a <Href href="https://github.com/SteeltoeOSS/initializr" NewWindow="true">basic web project</Href> doing just that to help get started. If you'de like to see the UI in action head over to <Href href="https://start.steeltoe.io" NewWindow="true">https://start.steeltoe.io</Href> and create your first Initializr project now!
</div>
</div>
</div>
<div class="row no-gutters">
<div class="col component-whyuse-title mt-0">
<h2>About Dependencies</h2>
</div>
</div>
<div class="row mb-5 no-gutters">
<div class="col component-whyuse-desc">
No matter the way you choose to use Initializr, the value is in the distribution of pre-packaged dependencies. The <Href href="xxxx" target="_blank">default dependencies</Href> included in Initializr are mostly Steeltoe focused. Things like database connectors, a Spring config client, a Consul discovery client, and many others. But this is a community driven project, so it only makes sense to offer ways for the .NET community to contribute.<br /><br />
<h4>Creating private dependencies</h4>
Running Initializr in-house isnt just about limited network connections. The Steeltoe Initializr is meant to be extended. While having the ability to generate Steeltoe projects automatically is super awesome, what if you could also add in your own dependencies? What if your organization could offer a starting place for all developers, that (safely) includes your best practices and secret sauce?<br /><br />
<h4>Creating for public use on start.steeltoe.io</h4>
If you would like for your Initializr dependency to be a part of the publicly hosted service, please review the <Href href="https://github.com/SteeltoeOSS/initializr/blob/master/THIRD-PARTY-CONTRIBUTIONS.md" NewWindow="true">guidelines</Href>. Once you have everything in place, <Href href="https://github.com/SteeltoeOSS/initializr/issues" NewWindow="true">open an enhancement issue in GitHub</Href>.<br /><br />
</div>
</div>
<div class="col text-center m-5">
<div class="mb-5"><h2>Ready to get started?</h2></div>
<div class=""><Href href="https://start.steeltoe.io" AsButton="true" NewWindow="true">GET STARTED</Href></div>
</div>
</OtherArea>
</Template>
@code{
}

Просмотреть файл

@ -1,45 +0,0 @@
@page "/local/get-started"
<Breadcrumbs NavName="Get Started"
ParentLinkName="Tooling"
ParentLinkUrl="/tooling"
ShowGetStarted="false" />
<Tutorial>
<Title>Steeltoe Tooling CLI</Title>
<Description>This tutorial takes you through running a .NET Core microservice with 2 other backing services locally, using the CLI.</Description>
<TutorialSteps>
<div class="row">
<div class="col-12 getting-started-header">First, <b>create a .NET Core WebAPI</b></div>
</div>
<div class="row">
<div class="col-12 getting-started-ordered-list">
<ol>
<li>
<Steeltoe.Client.Components.AppSettingsTab.Initiallizr ProjectName="@ProjectName" />
</li>
<li>Extract the zipped project and open in your IDE of choice (we use Visual Studio)</li>
<li>
<div>Run the application</div>
<div>
<TabSet>
<Steeltoe.Client.Components.RunAppTab.Local ProjectName="@ProjectName" />
<Steeltoe.Client.Components.RunAppTab.CloudFoundry ProjectName="@ProjectName" NoCFServices="true" />
<Steeltoe.Client.Components.RunAppTab.AzureAppService>
<AzureDeployHowToUrl>https://docs.microsoft.com/en-us/visualstudio/deployment/quickstart-deploy-to-azure?view=vs-2019</AzureDeployHowToUrl>
</Steeltoe.Client.Components.RunAppTab.AzureAppService>
<Steeltoe.Client.Components.RunAppTab.Kubernetes ProjectName="@ProjectName" />
</TabSet>
</div>
</li>
<li>
That's it! You have generated a .NET Core microservice using all the latest patterns. Go back and try adding a dependency or <Href href="/getstarted">try other tutorials</Href>
</li>
</ol>
</div>
</div>
</TutorialSteps>
</Tutorial>
@code
{
private const string ProjectName = "Initializr_Example";
}

Просмотреть файл

@ -1,55 +0,0 @@
@page "/local"
@page "/steeltoe-local"
<Template Name="Steeltoe Local" GettingStartedURL="/local/get-startedd" DocsURL="/docs/developer-tools/local">
<Description>Cloud platforms boast many gains in productivity, but applications dont start there. They are developed locally and then pushed.
<br /><br />
Steeltoe Local helps developers recreate how their app will be deployed in production, locally. The worst practice one can have is coding in decisions based on the environment the app is running in. This complicates testing by adding too many possible scenarios. Its true you cant account for every option and feature in every environment, but you can create an application that is resilient to those changes. You can create something that expects that change.</Description>
<OtherArea>
<div class="row no-gutters">
<div class="col component-whyuse-title mt-0">
<h2>Installing the CLI</h2>
</div>
</div>
<div class="row mb-5 no-gutters">
<div class="col component-whyuse-desc">
To install the CLI, use the <Href href="https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools" target="_blank">dotnet global tools</Href> feature of the <Href href="https://docs.microsoft.com/en-us/dotnet/core/tools" target="_blank">dotnet cli</Href>.
<pre><code>PS C:\> dotnet tool install --global --version 1.0.0-m1 Steeltoe.Cli</code></pre>
<Note><Message>To use the CLI you will need to have Docker running. For Windows we suggest Docker Desktop using the linux containers option. For OSX, the defaults for Docker are good.</Message></Note>
</div>
</div>
<div class="row no-gutters">
<div class="col component-whyuse-title mt-0">
<h2>Using the CLI</h2>
</div>
</div>
<div class="row mb-5 no-gutters">TODO!!!
@*<div class="col component-whyuse-desc">
The CLI is an executable that can be run with the “st” command in a terminal or powershell.
<pre><code>PS C:\> st --version</code></pre>
It has 3 features: init, target, and deploy. Init starts a yaml manifest (steeloe.yml) that will hold all your desired settings. Run this at the root of a csproj. The CLI uses this manifest to track what your deployment environment should look like. It holds descriptions for things like what services your app is expecting. To see the list of supported services, go here.
<br /><br />
The target feature tells the CLI the type of platform your app will be pushed to. Examples are Kubernetes and Cloud Foundry. See the list of supported platforms here. With a combination of the Steeltoe manifest and the type of platform targeted, the CLI has enough information to automatically create a platform specific manifest.It knows how to format the yaml manifest for each supported platform! No need for you to spend time with the little things.
<br /><br />
Deploy means you want to simulate what will happens when the app is pushed to its platform. Steeltoe CLI creates this simulation using Docker. It creates and configures containers running the services detailed in steeloe.yml, along with your application. Once everything is validated, the CLI creates a network between the containers, opening the relevant ports. This is a very similar design to how your app will be running in the cloud.
<br /><br />
Specifically with your apps container, the CLI allows dynamic refresh. Which means you can keep everything running and iterate on your running application live, from IDEs like Visual Studio and VS Code!
</div>
<div class="col component-whyuse-desc">
<h4>Pushing to the cloud</h4>
When you have everything running just right, its time to push to the platform. Along with your application you also need to push a manifest, telling the platform how to configure the environment and what services to bind to.
<br /><br />
Steeltoe CLI has written this manifest for you at the root of the project. Tweak any customizations you might want to include and use this in a manual push command like “cf push -f..” or “kubectl apply -f..”, or check-in the manifest with your code for use in a pipeline.
</div>*@
</div>
<div class="col text-center m-5">
<div class="mb-5"><h2>Ready to get started?</h2></div>
<div class=""><Href href="/local/get-started" role="button" class="border border-dark font-weight-bold btn btn-default border-black p-3 nav-link">TRY THIS TUTORIAL</Href></div>
</div>
</OtherArea>
</Template>
@code {
}

Просмотреть файл

@ -1,4 +1,4 @@
@page "/cloud-management"
@page "/cloud-management"
@page "/steeltoe-management"
@page "/management"
@ -36,13 +36,6 @@
}),
Img = "/images/Icon_connector.svg"
},
new Feature() {
Title = (MarkupString)"Distributed Tracing",
Description = (b => {
b.AddMarkupContent(1,"Use the OpenCensus project capture request tracing data and display it visually in the dashboard or send it to a remote collector.");
}),
Img = "/images/Icon_device-exchange.svg"
},
new Feature() {
Title = (MarkupString)"Management Tasks",
Description = (b => {
@ -51,4 +44,4 @@
Img = "/images/Icon_box.svg"
}
};
}
}

Просмотреть файл

@ -1,4 +1,4 @@
@page "/messaging"
@page "/messaging"
<Template Name="Messaging" Features="@features" DocsURL="/docs/messaging">
<Description>Build highly scalable event-driven microservices connected to shared messaging systems.</Description>
@ -47,4 +47,4 @@
Img = "/images/Icon_keys.svg"
}
};
}
}

Просмотреть файл

@ -1,38 +1,24 @@
@page "/network-file-sharing"
@page "/steeltoe-smb"
<Template Name="Network File Sharing" Features="@features" GettingStartedURL="/network-file-sharing/get-started" DocsURL="/docs/fileshares">
<Description>XXXXXXX</Description>
<WhatIs>XXXXXXX</WhatIs>
<WhyUse>XXXXXXX</WhyUse>
<FeatureTemplate Context="Feature">
<div class="row component-feature no-gutters">
<div class="col-6 text-center"><div class="component-feature-img"><img class="img-fluid" src="@Feature.Img" /></div></div>
<div class="col">
<div class="component-feature-title">@Feature.Title</div>
<div class="component-feature-desc">@Feature.Description</div>
</div>
</div>
</FeatureTemplate>
<AltFeatureTemplate Context="Feature">
<div class="row component-feature no-gutters">
<div class="col-6">
<div class="component-feature-title">@Feature.Title</div>
<div class="component-feature-desc">@Feature.Description</div>
</div>
<div class="col-6 text-center"><div class="component-feature-img"><img class="img-fluid" src="@Feature.Img" /></div></div>
</div>
</AltFeatureTemplate>
</Template>
@code{
private Feature[] features = new[] {
new Feature() {
Title = (MarkupString)"",
Description = (b => {
b.AddMarkupContent(1,"");
}),
Img = ""
}
};
}
@page "/fileshares"
@page "/network-file-sharing"
@page "/steeltoe-smb"
@inject IHttpContextAccessor HttpContextAccessor
@inject IOptionsSnapshot<DocsSiteOptions> DocsSiteOptions
<GetStarted>
<ComponentName>Network File Sharing</ComponentName>
<Tutorials>
<h1>This page has moved, find the new location <NavLink href="@(DocsSiteOptions.Value.FileShareHome)">here</NavLink></h1>
</Tutorials>
</GetStarted>
@code
{
protected override void OnInitialized()
{
if (HttpContextAccessor.HttpContext != null)
{
var uri = new Uri(DocsSiteOptions.Value.FileShareHome).ToString();
HttpContextAccessor.HttpContext.Response.Redirect(uri, true);
}
}
}

Просмотреть файл

@ -1,168 +0,0 @@
@page "/quickstart"
<Breadcrumbs NavName="Quickstart"
ShowGetStarted="false" />
<Tutorial>
<Title>Steeltoe Quickstart</Title>
<Description>Get starter quickly ans easily with Steeltoe.</Description>
<TutorialSteps>
<div class="row">
<div class="col-12 getting-started-header bold">Prerequisites.</div>
</div>
<div class="row">
<div class="col-12">
You'll need access to Tanzu Application Services to complete this guide. If you don't already have credentials and the URL to app manager, create a free account <Href href="https://run.pivotal.io/" target="_blank">here</Href>.
</div>
</div>
<div class="row">
<div class="col-12 getting-started-header">First, <b>start a Zipkin instance</b>.</div>
</div>
<div class="row">
<div class="col-12">
<TabSet>
<Steeltoe.Client.Components.StartInstanceTab.CloudFoundry InstanceName="@InstanceName" ServiceName="Zipkin" ShowServiceLookup="false">
<CfCreateServiceCmd>cf push @InstanceName --docker-image steeltoeoss/zipkin</CfCreateServiceCmd>
<AdditionalSteps>
<li>Once the app is deployed and the Zipkin server is started, the cf cli will print out the public route. An example route would be <code>mytracingexample.cfapps.io</code>. You will need this value below.</li>
</AdditionalSteps>
</Steeltoe.Client.Components.StartInstanceTab.CloudFoundry>
</TabSet>
</div>
</div>
<div class="row">
<div class="col-12 getting-started-header">Next, <b>create a .NET Core WebAPI</b> with the correct Steeltoe dependencies.</div>
</div>
<div class="row">
<div class="col-12 getting-started-ordered-list">
<ol>
<li>
<Steeltoe.Client.Components.AppSettingsTab.Initiallizr ImageName="actuators.png" ProjectName="@ProjectName" DependencyName="Actuators, DynamicLogging" />
</li>
<li>Extract the zipped project and open in your IDE of choice (we use Visual Studio)</li>
<li>
Add the other needed actuators in <b>startup.cs</b>
<pre><code>using Steeltoe.Management.Endpoint.Metrics;
using Steeltoe.Management.Tracing;
using Steeltoe.Management.Exporter.Tracing;
...
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddPrometheusActuator(Configuration);
services.AddMetricsActuator(Configuration);
services.AddDistributedTracing(Configuration);
services.AddZipkinExporter(Configuration);
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UsePrometheusActuator();
app.UseMetricsActuator();
app.UseTracingExporter();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}</code></pre>
</li>
<li>
Set the actuator path, exposure, and zipkin server address in <b>appsettings.json</b>
<pre><code>{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"spring": {
"application": {
"name": "@ProjectName"
}
},
"management": {
"endpoints": {
"actuator": {
"exposure": {
"include": [ "*" ]
}
},
"path": "/",
"cloudfoundry": {
"validateCertificates": false
}
},
"metrics": {
"exporter": {
"cloudfoundry": {
"validateCertificates": false
}
}
},
"tracing": {
"alwaysSample": true,
"useShortTraceIds ": true,
"exporter": {
"zipkin": {
"endpoint": "http://&lt;ZIPKIN_SERVER_ROUTE&gt;/api/v2/spans",
"validateCertificates": false
}
}
}
}
}</code></pre>
</li>
<li>
<div>Run the application</div>
<div>
<TabSet>
<Steeltoe.Client.Components.RunAppTab.CloudFoundry ProjectName="@ProjectName" InstanceName="@InstanceName" NoCFServices="true" NoPackageManager="true">
<AdditionalSteps>
<li>
With the application successfully pushed, navigate to App Manager to see the new features enabled.
<img src="images/initializr/actuators-app-manager.png" class="img-fluid" />
</li>
</AdditionalSteps>
</Steeltoe.Client.Components.RunAppTab.CloudFoundry>
</TabSet>
</div>
</li>
<li>
Now that you have successfully run a request through the app, navigate back to the zipkin dashboard and click the "Find Traces" button. This will search for recent traces. The result should show the trace for your request.
<img src="images/initializr/zipkin-search.png" class="img-fluid" />
</li>
<li>
Clicking on that trace will drill into the details. Then clicking on a specific action within the trace will give you even more detail.
<img src="images/initializr/zipkin-detail.png" class="img-fluid" />
</li>
</ol>
</div>
</div>
</TutorialSteps>
</Tutorial>
@code
{
//private string ServiceName = "appmanager";
private const string InstanceName = "myappmanagerservice";
private const string ProjectName = "TAS_Observability";
}

Просмотреть файл

@ -1,7 +1,7 @@
@page "/service-connectors"
@page "/service-connectors"
@page "/steeltoe-connectors"
<Template Name="Service Connectors" Features="@features" DocsURL="/docs/configuration">
<Template Name="Service Connectors" Features="@features" DocsURL="/docs/connectors">
<Description>One of the many advantages of running applications on the cloud is the easy availability of a variety of backing services. Steeltoe simplifies using those services by automatically configuring and wiring up connections to common services like Redis, RabbitMQ, MySQL, MS SQL, and more.</Description>
<WhatIs>Backing services are must when creating cloud-native .NET applications, but managing the connections can be time consuming and annoying. Steeltoe Service Connectors takes that pain away and let you get back to doing what you love.</WhatIs>
<WhyUse>
@ -51,4 +51,4 @@
Img = "/images/Icon_keys.svg"
}
};
}
}

Просмотреть файл

@ -1,4 +1,4 @@
@page "/support"
@page "/support"
<Template Name="Support" Features="@features">
<Description>Contact the team directly to get answers about how to best implement every component and feature within Steeltoe, as well as the best cloud-native .NET practices.</Description>
@ -42,7 +42,7 @@
Description = (b => {
b.AddMarkupContent(1,"Search past issues and community questions, request a new feature, or donate your custom features to a project.<br /><br />");
b.OpenComponent<Href>(2);
b.AddAttribute(3, "href","https://github.com/steeltoeoss");
b.AddAttribute(3, "href","https://github.com/SteeltoeOSS");
b.AddAttribute(4, "NewWindow",true);
b.AddAttribute(5, "AsButton",true);
b.AddAttribute(6, "ChildContent", (RenderFragment)((b) => {b.AddContent(7, "GO NOW");}));
@ -55,7 +55,7 @@
Description = (b => {
b.AddMarkupContent(1,"Search and learn more about each Steeltoe package, its version history, statistics, and installation options.<br /><br />");
b.OpenComponent<Href>(2);
b.AddAttribute(3, "href","https://www.nuget.org/profiles/steeltoe");
b.AddAttribute(3, "href","https://www.nuget.org/profiles/SteeltoeOSS");
b.AddAttribute(4, "NewWindow",true);
b.AddAttribute(5, "AsButton",true);
b.AddAttribute(6, "ChildContent", (RenderFragment)((b) => {b.AddContent(7, "GO NOW");}));
@ -64,4 +64,4 @@
Img = "https://miro.medium.com/max/700/1*OH_L2dLIKDl_n5QknfONqw.png"
}
};
}
}

Просмотреть файл

@ -1,14 +0,0 @@
<Tab Title="Azure App Service">
Follow Microsoft's guide to deploying on Azure App Service. Read more <a href="@AzureDeployHowToUrl" target="_blank">here</a>.
</Tab>
@ChildContent
@code {
[Parameter]
public RenderFragment AzureDeployHowToUrl { get; set; }
//[Parameter]
//public string ServiceName { get; set; } = "";
[Parameter]
public RenderFragment ChildContent { get; set; }
}

Просмотреть файл

@ -1,78 +0,0 @@
<Tab Title="Cloud Foundry">
<ol>
<li class="@(NoCFProvider || NoPackageManager?"hide":"")">
Open the package manager console
<img src="images/initializr/open-package-manager-console.png" class="img-fluid" />
</li>
<li class="@(NoCFProvider || NoPackageManager?"hide":"")">
Add the Cloud Foundry package to the project
<code class="inline-no-ps">PM&gt; Install-Package Steeltoe.Extensions.Configuration.CloudFoundryCore</code>
</li>
<li class="@(NoCFProvider?"hide":"")">
Add the Cloud Foundry configuration provider in <b>Program.cs</b>
<pre><code class="csharp">using Steeltoe.Extensions.Configuration.CloudFoundry;
...
var builder = WebHost.CreateDefaultBuilder(args)
...
.AddCloudFoundry()
.UseStartup&lt;Startup&gt;();
</code></pre>
</li>
<li>
Publish the application locally using the .NET cli. The following command will create a publish folder automatically.
<pre><code class="powershell">dotnet publish -o .\publish &lt;PATH_TO&gt;\@(ProjectName).csproj</code></pre>
</li>
<li>
Create <b>manifest.yml</b> in the same folder as @(ProjectName).csproj
<pre><code class="yaml">---
applications:
- name: @(ProjectName)
buildpacks:
- </code>@if (AsDotNetFramework) {
<code>hwc_buildpack</code>
} else {
<code>dotnet_core_buildpack</code>
}<code> stack: </code>@if (AsDotNetFramework) {
<code>windows</code>
} else {
<code>cflinuxfs3</code>
}
@if(!NoCFServices && !string.IsNullOrEmpty(InstanceName)){
<code> services:
- @InstanceName</code>
}</pre>
</li>
<Tip><Message>With yaml files indention and line endings matter. Use an IDE like VS Code to confirm spacing and that line endings are set to <code>LF</code> (not the Windows default <code>CR LF</code>)</Message></Tip>
<li>
Push the app to Cloud Foundry
<pre><code class="powershell">cf push -f &lt;PATH_TO&gt;\manifest.yml -p .\publish</code></pre>
</li>
@if (IncludeNavigateToApp) {
<li>Navigate to the application endpoint <code>https://&lt;APP_ROUTE&gt;/api/values</code></li>
}
@AdditionalSteps
</ol>
</Tab>
@code {
[Parameter]
public string ProjectName { get; set; } = "";
[Parameter]
public string InstanceName { get; set; } = "";
[Parameter]
public bool NoCFProvider { get; set; } = false;
[Parameter]
public bool NoCFServices { get; set; } = false;
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public bool NoPackageManager { get; set; } = false;
[Parameter]
public bool IncludeNavigateToApp { get; set; } = true;
[Parameter]
public bool AsDotNetFramework { get; set; } = false;
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
}

Просмотреть файл

@ -1,68 +0,0 @@
<Tab Title="Local">
<ol>
<li>
Create <b>Dockerfile</b> in the same folder as @(ProjectName).csproj
<pre><code class="dockerfile">FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "@(ProjectName).dll"]
</code></pre>
</li>
<li>Change into the folder that contains the project file (.csproj)
<pre><code class="powershell">cd &lt;PATH_TO_CSPROJ_FOLDER&gt;</code></pre>
</li>
<li>Build the image using the Dockerfile and output of the publish
<pre><code class="powershell">docker build -t @(ImageName) .</code></pre>
</li>
@*<Tip><Message>With the container image built, you can test locally by running <code>docker run -p 80:80 &lt;YOUR_DOCKER_NAME&gt;/@(ProjectName.ToLower())</code>. Then navigate to <a href="http://localhost:8080/api/values" target="_blank">http://localhost/api/values</a>.</Message></Tip>*@
@if(IncludeCreateNetworkStep == true){
<li>Create a docker network for all the containers to run within
<pre><code class="powershell">docker network create "@NetworkName"</code></pre>
</li>
}
<li>Run the image as a container
<pre><code class="powershell">docker run --name "@ContainerName" @(!string.IsNullOrEmpty(NetworkName) ? "--network \""+NetworkName+"\"" : "") -d -p @ContainerPort:@PublicPort @ImageName</code></pre>
</li>
@AdditionalSteps
</ol>
</Tab>
@code {
[Parameter]
public string ProjectName { get; set; }
[Parameter]
public string ImageName { get; set; }
[Parameter]
public string ContainerName { get; set; }
[Parameter]
public string ContainerPort { get; set; } = "8080";
[Parameter]
public string PublicPort { get; set; } = "8080";
[Parameter]
public bool IncludeCreateNetworkStep { get; set; } = false;
[Parameter]
public string NetworkName { get; set; } = null;
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
protected override void OnInitialized()
{
if(IncludeCreateNetworkStep == true)
NetworkName = "steeltoe";
base.OnInitializedAsync();
}
}

Просмотреть файл

@ -1,19 +0,0 @@
<Tab Title="Local">
<ol>
<li>Build the image using the provided docker-compose file
@if (string.IsNullOrEmpty(TerminalPromptPrefix)) {
<pre><code class="powershell">docker-compose up -d</code></pre>
} else {
<pre><code class="powershell">PS @(TerminalPromptPrefix)&gt; docker-compose up -d</code></pre>
}
</li>
@AdditionalSteps
</ol>
</Tab>
@code {
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
[Parameter]
public string TerminalPromptPrefix { get; set; }
}

Просмотреть файл

@ -1,105 +0,0 @@
<Tab Title="Kubernetes">
<ol>
<li>
Create a <b>DockerFile</b> in the same folder as @(ProjectName).csproj.
<pre><code class="dockerfile">FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "@(ProjectName).dll"]
</code></pre>
</li>
<li>
Buld the Docker image
<pre><code class="powershell">docker build -t &lt;YOUR_DOCKER_NAME&gt;/@(ProjectName.ToLower()) &lt;PATH_TO_PROJECT_FOLDER&gt;</code></pre>
</li>
<Tip><Message>With the container image built, you can test locally by running <code>docker run -p 80:80 &lt;YOUR_DOCKER_NAME&gt;/@(ProjectName.ToLower())</code>. Then navigate to <a href="http://localhost:8080/api/values" target="_blank">http://localhost/api/values</a>.</Message></Tip>
<li>
Push the new docker image to the Docker <a href="http://hub.docker.com" target="_blank">container registry hub</a>
<pre><code class="powershell">docker push &lt;YOUR_DOCKER_NAME&gt;/@(ProjectName.ToLower())</code></pre>
</li>
<li>
Create a Kubernetes <b>manifest.yml</b> in the same folder as @(ProjectName).csproj.
<pre><code class="yaml">---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: @(ProjectName.Replace("_","-").ToLower())
name: @(ProjectName.Replace("_","-").ToLower())
spec:
replicas: 1
template:
metadata:
labels:
app: @(ProjectName.Replace("_","-").ToLower())
name: @(ProjectName.Replace("_","-").ToLower())
spec:
containers:
- name: @(ProjectName.Replace("_","-").ToLower())
imagePullPolicy: IfNotPresent
image: &lt;YOUR_DOCKER_NAME&gt;/@(ProjectName.ToLower())
---
apiVersion: v1
kind: Service
metadata:
name: @(ProjectName.Replace("_","-").ToLower())
labels:
app: @(ProjectName.Replace("_","-").ToLower())
spec:
ports:
- port: 80
targetPort: 80
selector:
app: @(ProjectName.Replace("_","-").ToLower())
type: NodePort
</code></pre>
<Tip><Message>This manifest is using a specific <code>apiVersion</code>. Your K8 cluster version might differ. Learn more about api versions <Href href="https://kubernetes.io/docs/reference/using-api/api-overview/" target="_blank">here</Href>.</Message></Tip>
</li>
<li>
Using the manifest, create the pod deployment.
<pre><code class="powershell">kubectl apply -f &lt;PATH_TO&gt;\manifest.yml</code></pre>
</li>
@*<li>
Expose the new app for access.
<pre><code class="powershell">kubectl expose deployment @(ProjectName.Replace("_","-").ToLower()) --type=NodePort --name=@(ProjectName.Replace("_","-").ToLower()) --port 80</code>
</li>*@
@if (IncludeNavigateToApp) {
<li>
Along with deploying the app, the manifest also exposed a port for accessing the app external of the customer. To retrieve the assigned port look up the service info.
<pre><code class="powershell">kubectl get svc @(ProjectName.Replace("_", "-").ToLower()) -o jsonpath='{.spec.ports[0].nodePort}'</code></pre>
</li>
<li>
You'll also need any one of the node IP addresses. To look them up retrieve node details and note the EXTERNAL-IP of the first node.
<pre><code class="powershell">kubectl get nodes -o wide</code></pre>
</li>
<li>
Using the IP address from <code>https://&lt;EXTERNAL_IP_ADDRESS&gt;:&lt;PORT&gt;/api/values</code> to run the app.
</li>
}
@AdditionalSteps
</ol>
<Tip><Message>Once finished, to remove the deployment simply run <code>kubectl delete pod,service,deployment @(ProjectName.Replace("_", "-").ToLower())</code></Message></Tip>
</Tab>
@code {
[Parameter]
public string ProjectName { get; set; } = "";
[Parameter]
public bool IncludeNavigateToApp { get; set; } = true;
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
}

Просмотреть файл

@ -1,43 +0,0 @@
<Tab Title="Local">
<ol>
@if (!string.IsNullOrEmpty(ProjectName) && !string.IsNullOrEmpty(LocalEndpointAddress))
{
<li>
Using the .NET cli
<pre><code class="powershell">dotnet run &lt;PATH_TO&gt;\@(ProjectName).csproj</code></pre>
@if (IncludeNavigateToApp) {
<div>Navigate to the endpoint (you may need to change the port number) <a href="@LocalEndpointAddress" target="_blank">@LocalEndpointAddress</a></div>
}
</li>
}
@if (!string.IsNullOrEmpty(ProjectName) && !string.IsNullOrWhiteSpace(VSEndpointAddress))
{
<li>
Using Visual Studio
<div class="bg-light p-2">Choose the top <span class="font-italic">Debug</span> menu, then choose <span class="font-italic">Start Debugging (F5)</span>. This should bring up a browser with the app running.</div>
@if (IncludeNavigateToApp){
<div>Navigate to the endpoint (you may need to change the port number) <a href="@VSEndpointAddress" target="_blank">@VSEndpointAddress</a></div>
}
</li>
}
@AdditionalSteps
</ol>
</Tab>
@code {
[Parameter]
public string ProjectName { get; set; } = null;
[Parameter]
public string LocalEndpointAddress { get; set; } = "http://localhost:5000/api/values";
[Parameter]
public string VSEndpointAddress { get; set; } = "http://localhost:8080/api/values";
[Parameter]
public bool IncludeNavigateToApp { get; set; } = true;
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
}

Просмотреть файл

@ -1,22 +0,0 @@
<Tab Title="Azure">
<ol>
<li>
Follow the Azure <a href="@AzureGettingStartedUrl" target="_blank">getting started guide</a> to get a @ServiceName instance started
</li>
<li>Name the instance @InstanceName </li>
<li>As you set up the instance, note the credentials and connection string created. You'll need this in the following steps.</li>
@AdditionalSteps
</ol>
</Tab>
@code {
[Parameter]
public string InstanceName { get; set; } = "";
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public RenderFragment AzureGettingStartedUrl { get; set; }
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
}

Просмотреть файл

@ -1,27 +0,0 @@
<Tab Title="Cloud Foundry">
<ol>
<li>
Start an instance of @ServiceName, named @InstanceName
<pre><code class="powershell">@CfCreateServiceCmd</code></pre>
</li>
<li class="@(ShowServiceLookup == false ? "hide" : "")">
Wait for service to be ready
<pre><code class="powershell">cf services</code></pre>
</li>
@AdditionalSteps
</ol>
</Tab>
@code {
[Parameter]
public string InstanceName { get; set; } = "";
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public RenderFragment CfCreateServiceCmd { get; set; }
[Parameter]
public bool ShowServiceLookup { get; set; } = true;
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
}

Просмотреть файл

@ -1,33 +0,0 @@
<Tab Title="Kubernetes">
<ol>
<li>
Using Helm Charts, start the <Href href="@HelmGettingStartedUrl" target="_blank">@ServiceName chart</Href> providing connecting values. Learn more about using Helm <a href="https://helm.sh/docs/using_helm/" target="_blank">here</a>.
<pre><code class="powershell">@HelmCmd</code></pre>
</li>
@*<AdditionalSteps>
<li>
Expose the port, for connecting outside the cluster
<pre><code class="powershell">kubectl port-forward svc/@InstanceName @Portnumber</code>
</li>
</AdditionalSteps>*@
<li>
Once deployed, Helm will give feedback how to "connect to your instance directly from outside the K8s cluster". You'll need the host IP and port # in the following steps.
</li>
@AdditionalSteps
</ol>
<Tip><Message>Once finished, to remove the deployment simply run <code>helm del --purge @InstanceName</code></Message></Tip>
</Tab>
@code {
[Parameter]
public string InstanceName { get; set; } = "";
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public RenderFragment HelmGettingStartedUrl { get; set; }
[Parameter]
public RenderFragment HelmCmd { get; set; }
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
}

Просмотреть файл

@ -1,21 +0,0 @@
<Tab Title="Local">
<ol>
<li>
Using the <a href="https://github.com/steeltoeoss/dockerfiles" target="_blank">Steeltoe dockerfile</a>, start a local instance of @ServiceName. The dockerfile will choose the correct image based on your OS.
<pre><code class="powershell">@DockerCmd</code></pre>
</li>
@AdditionalSteps
</ol>
</Tab>
@code {
[Parameter]
public string InstanceName { get; set; } = "";
[Parameter]
public string ServiceName { get; set; } = "";
[Parameter]
public RenderFragment DockerCmd { get; set; }
[Parameter]
public RenderFragment AdditionalSteps { get; set; }
}

Просмотреть файл

@ -1,40 +0,0 @@
@using Steeltoe.Client.Components.UIInterfaces
@implements ITab
@inject IJSRuntime JSRuntime
<li class="nav-item @TitleCssClass">
<a @onclick="Activate" role="tab">
@Title
</a>
</li>
@code {
[CascadingParameter]
public TabSet ContainerTabSet { get; set; }
[Parameter]
public string Title { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
private string TitleCssClass => ContainerTabSet.ActiveTab == this ? "active" : null;
protected override void OnInitialized()
{
ContainerTabSet.AddTab(this);
base.OnInitialized();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await JSRuntime.InvokeVoidAsync("highlightCode",true);
await base.OnAfterRenderAsync(firstRender);
}
private void Activate()
{
ContainerTabSet.SetActivateTab(this);
}
}

Просмотреть файл

@ -1,45 +0,0 @@
@using Steeltoe.Client.Components.UIInterfaces
<!-- Display the tab headers -->
<CascadingValue Value="this">
<ul class="nav nav-tabs">
@ChildContent
</ul>
</CascadingValue>
<!-- Display body for only the active tab -->
<div class="nav-tabs-body">
@ActiveTab?.ChildContent
</div>
@code {
[Parameter]
public RenderFragment ChildContent { get; set; }
public ITab ActiveTab { get; private set; }
public void AddTab(ITab tab)
{
if (ActiveTab == null)
{
SetActivateTab(tab);
}
}
public void RemoveTab(ITab tab)
{
if (ActiveTab == tab)
{
SetActivateTab(null);
}
}
public void SetActivateTab(ITab tab)
{
if (ActiveTab != tab)
{
ActiveTab = tab;
StateHasChanged();
}
}
}

Просмотреть файл

@ -25,8 +25,6 @@
</div>
}
</div>
@if (WhatIs != null) {
}
</div>
</div>
<div class="width-all">
@ -142,14 +140,4 @@
[Parameter]
public RenderFragment OtherArea { get; set; }
protected override async Task OnAfterRenderAsync(bool first) {
if(first) {
await JSRuntime.InvokeVoidAsync("highlightCode",true);
StateHasChanged();
}
await base.OnAfterRenderAsync(first);
return;
}
}

Просмотреть файл

@ -1,9 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace Steeltoe.Client.Components.UIInterfaces
{
public interface ITab
{
RenderFragment ChildContent { get; }
}
}

Просмотреть файл

@ -1,31 +1,35 @@
using System.ComponentModel.DataAnnotations;
namespace Steeltoe.Client.Models
{
public class DocsSiteOptions
{
[Required]
public string BaseAddress { get; set; }
public string ApiBrowserHome { get; set; }
public string BlogHome { get; set; }
public string DocsHome { get; set; }
public string DocsStreamHome { get; set; }
public string GuidesHome { get; set; }
public void SetUrls()
{
ApiBrowserHome = ConfigureIfMissing(ApiBrowserHome, $"{BaseAddress}/api/browser/v3/all");
BlogHome = ConfigureIfMissing(BlogHome, $"{BaseAddress}/articles/");
DocsHome = ConfigureIfMissing(DocsHome, $"{BaseAddress}/api/v3/welcome/");
DocsStreamHome = ConfigureIfMissing(DocsStreamHome, $"{BaseAddress}/api/v3/stream/");
GuidesHome = ConfigureIfMissing(GuidesHome, $"{BaseAddress}/guides/");
}
private static string ConfigureIfMissing(string value, string defaultValue)
{
return !string.IsNullOrWhiteSpace(value) ?
value : defaultValue;
}
}
}
using System.ComponentModel.DataAnnotations;
namespace Steeltoe.Client.Models
{
public class DocsSiteOptions
{
[Required]
public string BaseAddress { get; set; }
public string ApiBrowserHome { get; set; }
public string BlogHome { get; set; }
public string DocsHome { get; set; }
public string DocsStreamHome { get; set; }
public string GuidesHome { get; set; }
public string FileShareHome { get; set; }
public string DynamicLoggingHome { get; set; }
public void SetUrls()
{
ApiBrowserHome = ConfigureIfMissing(ApiBrowserHome, $"{BaseAddress}/api/browser/v3/all");
BlogHome = ConfigureIfMissing(BlogHome, $"{BaseAddress}/articles/");
DocsHome = ConfigureIfMissing(DocsHome, $"{BaseAddress}/api/v3/welcome/");
DocsStreamHome = ConfigureIfMissing(DocsStreamHome, $"{BaseAddress}/api/v3/stream/");
GuidesHome = ConfigureIfMissing(GuidesHome, $"{BaseAddress}/guides/");
FileShareHome = ConfigureIfMissing(FileShareHome, $"{BaseAddress}/api/v3/fileshares/");
DynamicLoggingHome = ConfigureIfMissing(DynamicLoggingHome, $"{BaseAddress}/api/v3/logging/");
}
private static string ConfigureIfMissing(string value, string defaultValue)
{
return !string.IsNullOrWhiteSpace(value) ?
value : defaultValue;
}
}
}

Просмотреть файл

@ -4,9 +4,5 @@
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Markdig" Version="0.30.3" />
</ItemGroup>
</Project>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -1,3 +1,5 @@
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
@font-face {
font-family: 'Metropolis';
font-style: normal;

Просмотреть файл

@ -1,5 +1,3 @@
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
/* DEVELOP WIDTH = 1400px */
html,
body {
@ -403,7 +401,7 @@ a,
margin-right: 0 !important;
}
..component-dark .title {
.component-dark .title {
color: white;
}
@ -411,7 +409,7 @@ a,
color: #00376e;
}
..component-dark .desc {
.component-dark .desc {
color: white;
margin: 3% 0 3% 0;
min-height: 90px;

Просмотреть файл

@ -1,24 +1,3 @@
function setPageTitle(title) {
function setPageTitle(title) {
document.title = title;
}
function highlightCode(includeCopyBadge) {
//console.info('highlighting code');
document.querySelectorAll('pre code').forEach((block) => { hljs.highlightBlock(block); });
if (!includeCopyBadge)
return;
var options = {
contentSelector: "#main",
loadDelay: 10,
// CSS class(es) used to render the copy icon.
copyIconClass: "oi oi-document",
// CSS class(es) used to render the done icon.
checkIconClass: "oi oi-check text-success",
// hook to allow modifying the text before it's pasted
onBeforeTextCopied: function (text, codeElement) {
return text; // you can fix up the text here
}
};
window.highlightJsBadge(options);
}

Просмотреть файл

@ -1,441 +0,0 @@
"use strict";
/*
----------------------------------------
highlightJs Badge
----------------------------------------
A copy code and language display badge
for the highlightJs Syntax highlighter.
by Rick Strahl, 2019-2020
License: MIT
Make sure this script is loaded last in your
script loading.
Usage:
------
Load `highlightjs-badge.js` after `highlight.js`:
```js
<link href="highlightjs/styles/vs2015.css" rel="stylesheet">
<script src="highlighjs/highlight.pack.js"></script>
<script src="highlightjs-badge.js"></script>
<script>
setTimeout(function () {
var pres = document.querySelectorAll("pre>code");
for (var i = 0; i < pres.length; i++) {
hljs.highlightBlock(pres[i]);
}
var options = {
contentSelector: "#ArticleBody",
// Delay in ms used for `setTimeout` before badging is applied
// Use if you need to time highlighting and badge application
// since the badges need to be applied afterwards.
// 0 - direct execution (ie. you handle timing
loadDelay:0,
// CSS class(es) used to render the copy icon.
copyIconClass: "fa fa-copy",
// CSS class(es) used to render the done icon.
checkIconClass: "fa fa-check text-success"
};
window.highlightJsBadge(options);
},10);
</script>
```
The script contains the template and CSS so nothing
else is needed to run it.
Customization:
--------------
This code automatically embeds styling and the template.
If you want to customize you can either create a template
in your HTML **using the code at the end of this file**.
Alternately you can customize the `getTemplate()` function
that renders the code from a string and keep it self contained
within this script.
Requirements:
-------------
Uses some ES6 features so won't work in IE without shims:
* Object.assign
* String.trim
*/
// module header
(function (global, factory) {
if (typeof module === "object" && typeof module.exports === "object") {
// For CommonJS and CommonJS-like environments where a proper `window`
// is present, execute the factory
module.exports = global.document ?
factory(global, true) :
function (w) {
if (!w.document) {
throw new Error("A window with a document is required");
}
return factory(w);
};
} else {
factory(global);
}
// Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
if (typeof highlightJsBadgeAutoLoad !== 'boolean')
var highlightJsBadgeAutoLoad = false;
function highlightJsBadge(opt) {
var options = {
// the selector for the badge template
templateSelector: "#CodeBadgeTemplate",
// base content selector that is searched for snippets
contentSelector: "body",
// Delay in ms used for `setTimeout` before badging is applied
// Use if you need to time highlighting and badge application
// since the badges need to be applied afterwards.
// 0 - direct execution (ie. you handle timing
loadDelay: 0,
// CSS class(es) used to render the copy icon.
copyIconClass: "fa fa-copy",
// optional content for icons class (<i class="fa fa-copy"></i> or <i class="material-icons">file_copy</i>)
copyIconContent: "",
// CSS class(es) used to render the done icon.
checkIconClass: "fa fa-check text-success",
checkIconContent: "",
// function called before code is placed on clipboard
// Passed in text and returns back text function(text, codeElement) { return text; }
onBeforeCodeCopied: null
};
function initialize(opt) {
Object.assign(options, opt);
if (document.readyState == 'loading')
document.addEventListener("DOMContentLoaded", load);
else
load();
}
function load() {
if (options.loadDelay)
setTimeout(addCodeBadge, options.loadDelay);
else
addCodeBadge();
}
function addCodeBadge() {
// first make sure the template exists - if not we embed it
if (!document.querySelector(options.templateSelector)) {
var node = document.createElement("div");
node.innerHTML = getTemplate();
var style = node.querySelector("style");
var template = node.querySelector(options.templateSelector);
document.body.appendChild(style);
document.body.appendChild(template);
}
var hudText = document.querySelector(options.templateSelector).innerHTML;
var $codes = document.querySelectorAll("pre>code.hljs");
for (var index = 0; index < $codes.length; index++) {
var el = $codes[index];
if (el.querySelector(".code-badge"))
continue; // already exists
var lang = "";
for (var i = 0; i < el.classList.length; i++) {
var cl = el.classList[i];
// class="hljs language-csharp"
if (cl.substr(0, 9) === 'language-') {
lang = el.classList[i].replace('language-', '');
break;
}
// class="hljs lang-cs" // docFx
else if (cl.substr(0, 5) === 'lang-') {
lang = el.classList[i].replace('lang-', '');
break;
}
// class="kotlin hljs" (auto detected)
if (!lang) {
for (var j = 0; j < el.classList.length; j++) {
if (el.classList[j] == 'hljs')
continue;
lang = el.classList[j];
break;
}
}
}
if (lang)
lang = lang.toLowerCase();
else
lang = "text";
// Language Name overrides so it displays nicer
if (lang == "ps")
lang = "powershell";
else if (lang == "cs")
lang = "csharp";
else if (lang == "js")
lang = "javascript";
else if (lang == "ts")
lang = "typescript";
else if (lang == "fox")
lang = "foxpro";
var html = hudText.replace("{{language}}", lang)
.replace("{{copyIconClass}}", options.copyIconClass)
.trim();
// insert the Hud panel
var $newHud = document.createElement("div");
$newHud.innerHTML = html;
$newHud = $newHud.querySelector(".code-badge");
// make <pre> tag position:relative so positioning keeps pinned right
// even with scroll bar scrolled
var pre = el.parentElement;
pre.classList.add("code-badge-pre")
if (options.copyIconContent)
$newHud.querySelector(".code-badge-copy-icon").innerText = options.copyIconContent;
pre.insertBefore($newHud, el);
}
var $content = document.querySelector(options.contentSelector);
// single copy click handler
$content.addEventListener("click",
function (e) {
var $clicked = e.srcElement;
if ($clicked.classList.contains("code-badge-copy-icon")) {
e.preventDefault();
e.cancelBubble = true;
copyCodeToClipboard(e);
}
return false;
});
}
function copyCodeToClipboard(e) {
// walk back up to <pre> tag
var $origCode = e.srcElement.parentElement.parentElement.parentElement;
// select the <code> tag and grab text
var $code = $origCode.querySelector("pre>code");
var text = $code.textContent || $code.innerText;
if (options.onBeforeCodeCopied)
text = options.onBeforeCodeCopied(text, $code);
// Create a textblock and assign the text and add to document
var el = document.createElement('textarea');
el.value = text.trim();
document.body.appendChild(el);
el.style.display = "block";
// select the entire textblock
if (window.document.documentMode)
el.setSelectionRange(0, el.value.length);
else
el.select();
// copy to clipboard
document.execCommand('copy');
// clean up element
document.body.removeChild(el);
// show the check icon (copied) briefly
swapIcons($origCode);
}
function swapIcons($code) {
var copyIcons = options.copyIconClass.split(' ');
var checkIcons = options.checkIconClass.split(' ');
var $fa = $code.querySelector(".code-badge-copy-icon");
$fa.innerText = options.checkIconContent;
for (var i = 0; i < copyIcons.length; i++)
$fa.classList.remove(copyIcons[i]);
for (var i = 0; i < checkIcons.length; i++)
$fa.classList.add(checkIcons[i]);
setTimeout(function () {
$fa.innerText = options.copyIconContent;
for (var i = 0; i < checkIcons.length; i++)
$fa.classList.remove(checkIcons[i]);
for (var i = 0; i < copyIcons.length; i++)
$fa.classList.add(copyIcons[i]);
}, 2000);
}
function getTemplate() {
var stringArray =
[
"<style>",
"@media print {",
" .code-badge { display: none; }",
"}",
" .code-badge-pre {",
" position: relative;",
" }",
" .code-badge {",
" display: flex;",
" flex-direction: row;",
" white-space: normal;",
" background: transparent;",
" background: #333;",
" color: white;",
" font-size: 0.875em;",
" opacity: 0.5;",
" transition: opacity linear 0.5s;",
" border-radius: 0 0 0 7px;",
" padding: 5px 8px 5px 8px;",
" position: absolute;",
" right: 0;",
" top: 0;",
" }",
" .code-badge.active {",
" opacity: 0.8;",
" }",
"",
" .code-badge:hover {",
" opacity: .95;",
" }",
"",
" .code-badge a,",
" .code-badge a:hover {",
" text-decoration: none;",
" }",
"",
" .code-badge-language {",
" margin-right: 10px;",
" font-weight: 600;",
" color: goldenrod;",
" }",
" .code-badge-copy-icon {",
" font-size: 1.2em;",
" cursor: pointer;",
" padding: 0 7px;",
" margin-top:2;",
" }",
" .fa.text-success:{ color: limegreen !important }",
"</style>",
"<div id=\"CodeBadgeTemplate\" style=\"display:none\">",
" <div class=\"code-badge\">",
" <div class=\"code-badge-language\" >{{language}}</div>",
" <div title=\"Copy to clipboard\">",
" <i class=\"{{copyIconClass}} code-badge-copy-icon\"></i></i></a>",
" </div>",
" </div>",
"</div>"
];
var t = "";
for (var i = 0; i < stringArray.length; i++)
t += stringArray[i] + "\n";
return t;
}
initialize(opt);
}
// global reference Window
window.highlightJsBadge = highlightJsBadge;
// module export
if (window.module && window.module.exports)
window.module.exports.highlightJsBadge = highlightJsBadge;
if (highlightJsBadgeAutoLoad)
highlightJsBadge();
}));
// You can embed the following into your HTML document
// to provide your own custom styling.
/*
<style>
"@media print {
.code-badge { display: none; }
}
.code-badge-pre {
position: relative;
}
.code-badge {
display: flex;
flex-direction: row;
white-space: normal;
background: transparent;
background: #333;
color: white;
font-size: 0.875em;
opacity: 0.5;
border-radius: 0 0 0 7px;
padding: 5px 8px 5px 8px;
position: absolute;
right: 0;
top: 0;
}
.code-badge.active {
opacity: 0.8;
}
.code-badge:hover {
opacity: .95;
}
.code-badge a,
.code-badge a:hover {
text-decoration: none;
}
.code-badge-language {
margin-right: 10px;
font-weight: 600;
color: goldenrod;
}
.code-badge-copy-icon {
font-size: 1.2em;
cursor: pointer;
padding: 0 7px;
margin-top:2;
}
.fa.text-success:{ color: limegreen !important}
</style>
<div id="CodeBadgeTemplate" style="display:none">
<div class="code-badge">
<div class="code-badge-language">{{language}}</div>
<div title="Copy to clipboard">
<i class="{{copyIconClass}} code-badge-copy-icon"></i>
</div>
</div>
</div>
*/

Просмотреть файл

@ -1 +0,0 @@
"use strict"; !function (e, o) { "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? o(e, !0) : function (e) { if (!e.document) throw new Error("A window with a document is required"); return o(e) } : o(e) }("undefined" != typeof window ? window : this, function (y, e) { if ("boolean" != typeof o) var o = !1; function t(e) { var o, m = { templateSelector: "#CodeBadgeTemplate", contentSelector: "body", loadDelay: 0, copyIconClass: "fa fa-copy", copyIconContent: "", checkIconClass: "fa fa-check text-success", checkIconContent: "", onBeforeCodeCopied: null }; function t() { m.loadDelay ? setTimeout(n, parseInt(m.loadDelay)) : n() } function n() { if (!document.querySelector(m.templateSelector)) { var e = document.createElement("div"); e.innerHTML = function () { for (var e = ["<style>", "@media print {", " .code-badge { display: none; }", "}", " .code-badge-pre {", " position: relative;", " }", " .code-badge {", " display: flex;", " flex-direction: row;", " white-space: normal;", " background: transparent;", " background: #333;", " color: white;", " font-size: 0.875em;", " opacity: 0.5;", " transition: opacity linear 0.5s;", " border-radius: 0 0 0 7px;", " padding: 5px 8px 5px 8px;", " position: absolute;", " right: 0;", " top: 0;", " }", " .code-badge.active {", " opacity: 0.8;", " }", "", " .code-badge:hover {", " opacity: .95;", " }", "", " .code-badge a,", " .code-badge a:hover {", " text-decoration: none;", " }", "", " .code-badge-language {", " margin-right: 10px;", " font-weight: 600;", " color: goldenrod;", " }", " .code-badge-copy-icon {", " font-size: 1.2em;", " cursor: pointer;", " padding: 0 7px;", " margin-top:2;", " }", " .fa.text-success:{ color: limegreen !important }", "</style>", '<div id="CodeBadgeTemplate" style="display:none">', ' <div class="code-badge">', ' <div class="code-badge-language" >{{language}}</div>', ' <div title="Copy to clipboard">', ' <i class="{{copyIconClass}} code-badge-copy-icon"></i></i></a>', " </div>", " </div>", "</div>"], o = "", t = 0; t < e.length; t++)o += e[t] + "\n"; return o }(); var o = e.querySelector("style"), t = e.querySelector(m.templateSelector); document.body.appendChild(o), document.body.appendChild(t) } for (var n = document.querySelector(m.templateSelector).innerHTML, c = document.querySelectorAll("pre>code.hljs"), a = 0; a < c.length; a++) { var r = c[a]; if (!r.querySelector(".code-badge")) { for (var d = "", l = 0; l < r.classList.length; l++) { var i = r.classList[l]; if ("language-" === i.substr(0, 9)) { d = r.classList[l].replace("language-", ""); break } if ("lang-" === i.substr(0, 5)) { d = r.classList[l].replace("lang-", ""); break } if (!d) for (var s = 0; s < r.classList.length; s++)if ("hljs" != r.classList[s]) { d = r.classList[s]; break } } "ps" == (d = d ? d.toLowerCase() : "text") ? d = "powershell" : "cs" == d ? d = "csharp" : "js" == d ? d = "javascript" : "ts" == d ? d = "typescript" : "fox" == d && (d = "foxpro"); var p = n.replace("{{language}}", d).replace("{{copyIconClass}}", m.copyIconClass).trim(), u = document.createElement("div"); u.innerHTML = p, u = u.querySelector(".code-badge"); var g = r.parentElement; g.classList.add("code-badge-pre"), m.copyIconContent && (u.querySelector(".code-badge-copy-icon").innerText = m.copyIconContent), g.insertBefore(u, r) } } document.querySelector(m.contentSelector).addEventListener("click", function (e) { return e.srcElement.classList.contains("code-badge-copy-icon") && (e.preventDefault(), e.cancelBubble = !0, function (e) { var o = e.srcElement.parentElement.parentElement.parentElement, t = o.querySelector("pre>code"), n = t.textContent || t.innerText; m.onBeforeCodeCopied && (n = m.onBeforeCodeCopied(n, t)); var c = document.createElement("textarea"); c.value = n.trim(), document.body.appendChild(c), c.style.display = "block", y.document.documentMode ? c.setSelectionRange(0, c.value.length) : c.select(); document.execCommand("copy"), document.body.removeChild(c), function (e) { var o = m.copyIconClass.split(" "), t = m.checkIconClass.split(" "), n = e.querySelector(".code-badge-copy-icon"); n.innerText = m.checkIconContent; for (var c = 0; c < o.length; c++)n.classList.remove(o[c]); for (c = 0; c < t.length; c++)n.classList.add(t[c]); setTimeout(function () { n.innerText = m.copyIconContent; for (var e = 0; e < t.length; e++)n.classList.remove(t[e]); for (e = 0; e < o.length; e++)n.classList.add(o[e]) }, 2e3) }(o) }(e)), !1 }) } o = e, Object.assign(m, o), "loading" == document.readyState ? document.addEventListener("DOMContentLoaded", t) : t() } y.highlightJsBadge = t, y.module && y.module.exports && (y.module.exports.highlightJsBadge = t), o && t() });

Просмотреть файл

@ -1,797 +0,0 @@
<!DOCTYPE html>
<!-- saved from url=(0048) -->
<html class="gr__steeltoe_io">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"
name="viewport">
<!-- Use title if it's in the page YAML frontmatter -->
<link href="images/favicon.png" rel="icon" type="image/png">
<link rel="stylesheet" href="/stylesheets/css.css">
<link href="/stylesheets/fonts.css" rel="stylesheet">
<link href="/stylesheets/site.css" rel="stylesheet">
<link href="/stylesheets/tocbot.css" rel="stylesheet">
</head>
<body class="reference reference_reference-release-notes reference_reference-release-notes_index"
data-gr-c-s-loaded="true">
<div class="max-width-4 mx-auto">
<div class="p2">
<div class="sm-flex">
<div class="col-12 sm-col-3 sm-pr3">
<div id="toc" class="">
<div class="toc-link border-bottom border-silver js-toc">
<ul class="toc-list ">
<li class="toc-list-item"><a href="#ga-releases"
class="toc-link node-name--H1 is-active-link">GA Releases</a>
<ul class="toc-list is-collapsible">
<li class="toc-list-item"><a href="#2-3-0"
class="toc-link node-name--H2 ">2.3.0</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a href="#infrastructure"
class="toc-link node-name--H3 ">Infrastructure</a></li>
<li class="toc-list-item"><a href="#connectors"
class="toc-link node-name--H3 ">Connectors</a></li>
<li class="toc-list-item"><a href="#logging"
class="toc-link node-name--H3 ">Logging</a></li>
<li class="toc-list-item"><a href="#management"
class="toc-link node-name--H3 ">Management</a></li>
<li class="toc-list-item"><a href="#configuration"
class="toc-link node-name--H3 ">Configuration</a></li>
<li class="toc-list-item"><a href="#contributions"
class="toc-link node-name--H3 ">Contributions</a></li>
</ul>
</li>
<li class="toc-list-item"><a href="#2-2-0"
class="toc-link node-name--H2 ">2.2.0</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a href="#connectors"
class="toc-link node-name--H3 ">Connectors</a></li>
<li class="toc-list-item"><a href="#security"
class="toc-link node-name--H3 ">Security</a></li>
<li class="toc-list-item"><a href="#management"
class="toc-link node-name--H3 ">Management</a></li>
<li class="toc-list-item"><a href="#discovery"
class="toc-link node-name--H3 ">Discovery</a></li>
<li class="toc-list-item"><a href="#configuration"
class="toc-link node-name--H3 ">Configuration</a></li>
<li class="toc-list-item"><a href="#health-contributors"
class="toc-link node-name--H3 ">Health Contributors</a></li>
<li class="toc-list-item"><a href="#load-balancer"
class="toc-link node-name--H3 ">Load Balancer</a></li>
<li class="toc-list-item"><a href="#other-features"
class="toc-link node-name--H3 ">Other Features</a></li>
</ul>
</li>
<li class="toc-list-item"><a href="#2-1-0"
class="toc-link node-name--H2 ">2.1.0</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a href="#management"
class="toc-link node-name--H3 ">Management</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a
href="#additional-spring-boot-compatible-actuator-endpoints"
class="toc-link node-name--H4 ">Additional Spring
Boot-compatible Actuator Endpoints</a></li>
<li class="toc-list-item"><a
href="#out-of-box-health-contributors"
class="toc-link node-name--H4 ">Out-of-box Health
Contributors</a></li>
</ul>
</li>
<li class="toc-list-item"><a href="#application-metrics"
class="toc-link node-name--H3 ">Application Metrics</a></li>
<li class="toc-list-item"><a href="#distributed-tracing"
class="toc-link node-name--H3 ">Distributed Tracing</a></li>
<li class="toc-list-item"><a href="#asp-net-4-x"
class="toc-link node-name--H3 ">ASP.NET 4.x</a></li>
<li class="toc-list-item"><a href="#net-core-2-1"
class="toc-link node-name--H3 ">.NET Core 2.1</a></li>
</ul>
</li>
<li class="toc-list-item"><a href="#2-0-0"
class="toc-link node-name--H2 ">2.0.0</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a href="#circuitbreaker"
class="toc-link node-name--H3 ">CircuitBreaker</a></li>
<li class="toc-list-item"><a href="#common"
class="toc-link node-name--H3 ">Common</a></li>
<li class="toc-list-item"><a href="#configuration"
class="toc-link node-name--H3 ">Configuration</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a href="#config-server-settings"
class="toc-link node-name--H4 ">Config Server
Settings</a></li>
<li class="toc-list-item"><a href="#config-server-vault-support"
class="toc-link node-name--H4 ">Config Server Vault
support</a></li>
<li class="toc-list-item"><a href="#known-issues"
class="toc-link node-name--H4 ">Known Issues</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a
href="#unstructured-data-files"
class="toc-link node-name--H5 ">Unstructured
data files</a></li>
<li class="toc-list-item"><a
href="#client-decryption-option"
class="toc-link node-name--H5 ">Client
decryption option</a></li>
<li class="toc-list-item"><a
href="#server-initiated-reload"
class="toc-link node-name--H5 ">Server initiated
reload</a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-list-item"><a href="#connectors"
class="toc-link node-name--H3 ">Connectors</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a href="#mysql-connector"
class="toc-link node-name--H4 ">MySql Connector</a></li>
<li class="toc-list-item"><a href="#postgres-connector"
class="toc-link node-name--H4 ">Postgres Connector</a>
</li>
<li class="toc-list-item"><a href="#rabbitmq-connector"
class="toc-link node-name--H4 ">RabbitMQ Connector</a>
</li>
<li class="toc-list-item"><a href="#redis-connector"
class="toc-link node-name--H4 ">Redis Connector</a></li>
</ul>
</li>
<li class="toc-list-item"><a href="#discovery"
class="toc-link node-name--H3 ">Discovery</a>
<ul class="toc-list is-collapsible is-collapsed">
<li class="toc-list-item"><a href="#eureka-version"
class="toc-link node-name--H4 ">Eureka Version</a></li>
<li class="toc-list-item"><a href="#eureka-aws-support"
class="toc-link node-name--H4 ">Eureka AWS Support</a>
</li>
<li class="toc-list-item"><a href="#eureka-client-configuration"
class="toc-link node-name--H4 ">Eureka Client
Configuration</a></li>
<li class="toc-list-item"><a href="#cloud-foundry-c2c-support"
class="toc-link node-name--H4 ">Cloud Foundry C2C
Support</a></li>
</ul>
</li>
<li class="toc-list-item"><a href="#logging"
class="toc-link node-name--H3 ">Logging</a></li>
<li class="toc-list-item"><a href="#management"
class="toc-link node-name--H3 ">Management</a></li>
<li class="toc-list-item"><a href="#security"
class="toc-link node-name--H3 ">Security</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div class="col-12 sm-col-9 js-toc-content">
<h1 class="js-toc-ignore regular">Release Notes</h1>
<h1 id="ga-releases">GA Releases</h1>
<hr>
<h2 id="2-3-0">2.3.0</h2>
<ul>
<li>RC1 - <a href="https://github.com/SteeltoeOSS/steeltoe/milestone/1?closed=1">Closed issues
in RC1</a></li>
<li>RC2 - <a href="https://github.com/SteeltoeOSS/steeltoe/milestone/3?closed=1">Closed issues
in RC2</a></li>
<li>GA - <a href="https://github.com/SteeltoeOSS/steeltoe/milestone/4?closed=1">Closed issues in
GA release</a> </li>
</ul>
<p><strong>Notable additions in 2.3.0:</strong></p>
<h3 id="infrastructure">Infrastructure</h3>
<ul>
<li>Restructure of Github repositories into a single repository: <a
href="https://github.com/SteeltoeOSS/steeltoe">Steeltoe Mono Repository</a> </li>
<li>
Moved all CI/CD to Azure DevOps: <a
href="https://dev.azure.com/SteeltoeOSS/Steeltoe">Steeltoe on Azure DevOps</a>
<ul>
<li>Added test coverage monitoring</li>
<li>Added code coverage monitoring</li>
</ul>
</li>
<li>
Created the <a href="http://github.com/SteeltoeOSS-incubator">Steeltoe Incubator</a>
<ul>
<li>Allows community members to introduce new features, enhancements, and projects to be
considered for inclusion in the SteeltoeOSS framework. </li>
</ul>
</li>
</ul>
<h3 id="connectors">Connectors</h3>
<ul>
<li>New <a
href="https://steeltoe.io/docs/steeltoe-connectors/#8-0-apache-geode-gemfire-pivotal-cloud-cache">Apache
Geode/GemFire/Pivotal Cloud Cache</a> connector</li>
<li>New Oracle Database connector </li>
<li>Support for launching CloudFoundry tasks bundles with applications</li>
<li>Additional property support for Microsoft SQL Server connection strings</li>
</ul>
<h3 id="logging">Logging</h3>
<ul>
<li>Serilog is now supported</li>
</ul>
<h3 id="management">Management</h3>
<ul>
<li>Added support for <a
href="https://steeltoe.io/docs/steeltoe-connectors/#using-asp-net-core-health-checks">ASP.NET
Core Community Health Checks</a></li>
<li>Added ability to apply EF migrations using <code>cf task</code></li>
</ul>
<h3 id="configuration">Configuration</h3>
<ul>
<li>Added ability to disable vault renewal for config server</li>
</ul>
<h3 id="contributions">Contributions</h3>
<ul>
<li><a href="https://dotnetfoundation.org/projects?searchquery=Steeltoe&amp;type=project">Pivotal
Steeltoe team</a></li>
<li><a href="https://github.com/macsux">Andrew Stakov</a></li>
<li><a href="https://github.com/kishoreallwynraj">@kishoreallwynraj</a></li>
<li><a href="https://github.com/kadkins-pivotal">Kendall Adkins</a></li>
<li><a href="https://github.com/pengweiqhca">@pengweiqhca</a></li>
<li>Everyone that found the time to test and report any issues.<br></li>
</ul>
<h2 id="2-2-0">2.2.0</h2>
<p><strong>The new features in Steeltoe 2.2.0</strong></p>
<h3 id="connectors">Connectors</h3>
<ul>
<li>New MongoDB Connector</li>
</ul>
<h3 id="security">Security</h3>
<ul>
<li>OpenIDConnect support added</li>
<li>
Refactor of .NET Framework Security
<ul>
<li>Separated common components into Base library</li>
<li>Enabled HttpClient injection</li>
</ul>
</li>
</ul>
<h3 id="management">Management</h3>
<ul>
<li>
Enhanced support for Spring Boot 2.0 Actuator Endpoints
<ul>
<li>Actuators in Cloud Foundry can be accessed outside cloudfoundry, while also
maintaining AppsManager integration</li>
<li>Actuators now have default path /actuator when no path is specified</li>
<li>Control the exposure level of actuator endpoints</li>
<li>Show Details configuration options for the health endpoint (<em>always</em>,
<em>never</em>, and <em>when-authorized</em>)</li>
<li>Sanitizing of sensitive information from <code>/env</code> actuator endpoint</li>
</ul>
</li>
</ul>
<h3 id="discovery">Discovery</h3>
<blockquote>
<p>IMPORTANT: The <code>Pivotal.Discovery.*</code> packages have been deprecated in Steeltoe 2.2
and will be removed in a future release. All functionality provided in those packages has
been pushed into the corresponding <code>Steeltoe.Discovery.*</code> packages.</p>
</blockquote>
<ul>
<li>
Eureka client supports additional HA features
<ul>
<li>Allow multiple Eureka server URLs to be configured</li>
<li>Added configurable retry logic when communicating with Eureka servers</li>
<li>Added retry/recovery logic during registration or renew failures</li>
</ul>
</li>
<li>Eureka client supports configuring Proxy settings (host, port, username, password)</li>
<li>Eureka client supports configuring GZip settings</li>
<li>
New Eureka based management health check contributors
<ul>
<li>EurekaServerHealthContributor - contributes health of Eureka server connection</li>
<li>EurekaApplicationsHealthContributor - contributes health of a configurable list of
applications</li>
</ul>
</li>
<li>
New Eureka health check handler which computes health of the app based on management health
contributor health check
<ul>
<li>Added dynamic updating of the apps health (e.g. UP, DOWN, etc.) in the registry as
it changes</li>
</ul>
</li>
<li>
HashiCorp Consul supported added
<ul>
<li>Supports common Steeltoe <code>IDiscoveryClient</code> abstraction</li>
</ul>
</li>
</ul>
<h3 id="configuration">Configuration</h3>
<blockquote>
<p>IMPORTANT: The <code>Pivotal.Extensions.Configuration.ConfigServer*</code> packages have been
deprecated in Steeltoe 2.2 and will be removed in a future release. All functionality
provided in those packages has been pushed into the corresponding
<code>Steeltoe.Extensions.Configuration.ConfigServer*</code> packages.</p>
</blockquote>
<ul>
<li>
New <code>Placeholder</code> configuration provider supporting placeholder resolution
<ul>
<li>Use placeholders like <code>${key:key1:key2?default_value}</code> as configuration
values</li>
<li>Configuration placeholders can be used when configuring Steeltoe components</li>
</ul>
</li>
<li>
New <code>RandomValue</code> configuration provider supporting random value generation
<ul>
<li>Use keys like <code>random:int</code>, <code>random:long</code>,
<code>random:uuid</code>, <code>random:string</code>, etc. to access random values
</li>
</ul>
</li>
<li>New <code>ConfigureCloudFoundryServices&lt;TOption&gt;()</code> Cloud Foundry extension
method for binding <code>VCAP_SERVICES</code> configuration data to user defined
<code>C#</code> objects</li>
<li>
Config Server client supports <code>Discovery First</code> configuration
<ul>
<li>Supports basic auth user/pass metadata values used by Spring Cloud Config Server
(java)</li>
</ul>
</li>
<li>Config Server client supports HA by allowing multiple config servers URLs to be configured
</li>
<li>New Config Server management health check contributor</li>
</ul>
<h3 id="health-contributors">Health Contributors</h3>
<ul>
<li>Config Server health contributor</li>
<li>Discovery Client health contributor</li>
</ul>
<h3 id="load-balancer">Load Balancer</h3>
<ul>
<li>Client-side load balancer</li>
<li>Support for random and round-robin load balancer implementations out-of-the-box</li>
<li>API for custom load balancer implementations</li>
<li>Integration with Eureka</li>
</ul>
<h3 id="other-features">Other Features</h3>
<ul>
<li>Reference Application <a
href="https://github.com/SteeltoeOSS/eShopOnContainers">eShopOnContainers</a> using
Steeltoe components</li>
<li>Released NuGet packages are now signed</li>
<li>All packages include <a href="https://github.com/dotnet/sourcelink">Source Link</a>, with
symbols published to the <a
href="https://docs.microsoft.com/en-us/nuget/create-packages/symbol-packages-snupkg#nugetorg-symbol-server">NuGet.org
symbol server</a></li>
</ul>
<h2 id="2-1-0">2.1.0</h2>
<p><strong>The new features in Steeltoe 2.1.0</strong></p>
<ul>
<li>Management and Monitoring (M&amp;Ms)</li>
<li>ASP.NET 4.x</li>
<li>.NET Core &amp; ASP.NET Core 2.1</li>
</ul>
<h3 id="management">Management</h3>
<p>So whats new in 2.1 Management?</p>
<ul>
<li>Additional Spring Boot-compatible endpoints</li>
<li>Out-of-box health contributors</li>
<li>Application metrics</li>
<li>Distributed tracing</li>
</ul>
<h4 id="additional-spring-boot-compatible-actuator-endpoints">Additional Spring Boot-compatible
Actuator Endpoints</h4>
<p>In addition to the existing endpoints in 2.0, weve added several new ones. Each one is available
as additional REST endpoints you can expose in your applications:</p>
<ul>
<li>/env - returns keys and values from the app configuration.</li>
<li>/mappings - returns ASP.NET routes and route templates exposed by the application.</li>
<li>/refresh - causes the apps configuration to be reloaded and returned.</li>
<li>/metrics - returns current metrics for the app (more on metrics below.)</li>
</ul>
<h4 id="out-of-box-health-contributors">Out-of-box Health Contributors</h4>
<p>One of the key Spring Boot-compatible Management endpoints provided in Steeltoe 2.0 was
/health. But, in 2.0 we provided a limited number of out-of-the-box contributors to run health
checks. While it was fairly easy to write your own, you still had to do the coding yourself.</p>
<p>So in 2.1 we now include several new contributors which you can easily reference. They include:
</p>
<ul>
<li>Redis</li>
<li>RabbitMQ</li>
<li>MySQL</li>
<li>Microsoft SQL Server</li>
<li>Postgres</li>
</ul>
<p>Each of these new contributors has been added to the Steeltoe Connectors package. This allows you
to easily make use of the corresponding health contributor when using a connector.</p>
<h3 id="application-metrics">Application Metrics</h3>
<p>Support for collecting application metrics is completely new this release. Heres the
functionality implemented so far:</p>
<ul>
<li>Weve implemented the OpenCensus Stats APIs for instrumentation. You can also use those APIs
in your code to collect your own custom metrics.</li>
<li>Weve implemented the OpenCensus Tags APIs for tagging metrics and adding
multi-dimensionality to the metrics collected.</li>
<li>Collect .NET runtime metrics automatically, for example,, heap, thread, and GC usage. Stay
tuned for more enhancements in this area, as we build upon the work Microsoft is doing in
this area.</li>
<li>Automatically collect ASP.NET metrics, like request counts, response times, and others.
Theres more to come here as well.</li>
<li>Automatically collect HttpClient metrics, for example,, request counts, response times, etc.
</li>
<li>Expose metrics via the Spring Boot compatible REST endpoint /metrics (mentioned earlier.)
</li>
<li>For Cloud Foundry users, you can export collected metrics to the Loggregator Firehose using
Metrics Forwarder. Just as with Java Spring apps, developers can send their .NET apps
metrics to any one of several backend services for collection and reporting, for example,
PCF Metrics.</li>
</ul>
<h3 id="distributed-tracing">Distributed Tracing</h3>
<p>Also completely new in 2.1 is distributed tracing support. Heres what were delivering in 2.1:
</p>
<ul>
<li>Implemented OpenCensus Trace APIs for instrumenting your code.</li>
<li>Instrumented ASP.NET Core so that spans are automatically started, stopped, or joined at
common ingress and egress points.</li>
<li>Instrumented HttpClient such that traces and spans are joined with already existing spans.
</li>
<li>Add trace and span IDs to the log messages produced by your app so you can use log
correlation by trace ID when diagnosing problems.</li>
<li>Automatically propagate trace context (in Zipkin format) to downstream processes or
microservices.</li>
<li>Provide a Zipkin exporter which you can optionally use to send your captured spans to a
backend Zipkin server.</li>
</ul>
<h3 id="asp-net-4-x">ASP.NET 4.x</h3>
<p>In Steeltoe 2.0, we took first steps to add better 4.x support by enabling the Config Server,
Eureka Server, and Connectors to be used within a 4.x application. In 2.1, we have continued
that work by adding Steeltoe Security &amp; Management to the list.</p>
<p>With Steeltoe 2.1, you can easily drop the Management endpoints into a 4.x application. We have
implemented the endpoints using both OWIN middleware, and by using an HttpModule. You can pick
the method that works best for your app. You can configure or add each endpoint individually, or
you can add them all.</p>
<p>Since Steeltoe 1.0, we have offered two security providers for use in ASP.NET Core applications.
With these two providers, you are able to log in to your apps using OAuth 2.0 flows with
credentials provided from Cloud Foundry. Youre also able to secure microservice endpoints using
JWT tokens also provided by Cloud Foundry.</p>
<p>With Steeltoe 2.1, we extended that same security functionality to 4.x applications. We support
OWIN-based middleware for both MVC and WebAPI-based applications. We also added a Cloud Foundry
<code>ServiceAuthorizationManager</code> which can be used in WCF-based applications for
securing WCF endpoints.</p>
<h3 id="net-core-2-1">.NET Core 2.1</h3>
<p>In addition to supporting .NET Core 2.0, ASP.NET Core 2.0, and .NET 4.6.1+, we are also adding
support for .NET Core 2.1 and ASP.NET Core 2.1. Compatibility with .NET Core/ASP.NET core 2.0 in
general has been preserved, though you will see a few <code>Microsoft.Extensions</code> packages
(for example: <code>Logging</code>, <code>Options</code>, <code>Configuration</code>) that will
update to 2.1. Your ASP.NET Core dependencies should not be impacted.</p>
<p>One new feature added in Steeltoe 2.1 is dependent on Core 2.1: support for the new
<code>HttpClientFactory</code>. We have added a new <code>DelegatingHandler</code> that will
carry out service discovery lookups and random load balancing when used with an
<code>HttpClient</code>. This functionality is similar to what we already offered in 2.0, but
now provides a seamless experience when using the <code>HttpClientFactory</code>.</p>
<h2 id="2-0-0">2.0.0</h2>
<p>A large focus of Steeltoe version 2.0 is compatibility with .NET Standard 2.0. As part of this
initiative, virtually all packages have been reorganized and renamed to minimize hard
dependencies on other libraries and also help differentiate between packages with full-framework
support and those for .NET Core. Most Steeltoe libraries now include a package ending with
“Base” that provides the majority of the functionality. Packages ending with “Core” provide
extra methods for working with Microsofts Dependency Injection Framework, with the naming
intended to coincide with .NET Core development. Full-framework support to date has been focused
on Autofac. The relevant Steeltoe packages have names ending in “Autofac”.</p>
<h3 id="circuitbreaker">CircuitBreaker</h3>
<p>As described earlier in the general <a href="#2-0-release-notes">release notes</a>, Steeltoe
Circuit breaker packages now have the following names:
<code>Steeltoe.CircuitBreaker.HystrixBase</code>,
<code>Steeltoe.CircuitBreaker.HystrixCore</code>,
<code>Steeltoe.CircuitBreaker.HystrixAutofac</code>,
<code>Steeltoe.CircuitBreaker.Hystrix.MetricsEventsCore</code>, and
<code>Steeltoe.CircuitBreaker.Hystrix.MetricsStreamCore</code>.</p>
<h3 id="common">Common</h3>
<p>New for Steeltoe 2.0 is a set of libraries with code shared between our libraries. You can use
this code as well, but these libraries are not likely to receive much attention in this
documentation.</p>
<h3 id="configuration">Configuration</h3>
<p>In Steeltoe version 1.x, there are 3 packages for Configuration. As of 2.0.0, each of those
packages now has a *Base, a *Core, and an *Autofac (for example:
<code>Steeltoe.Extensions.Configuration.ConfigServerBase</code>,
<code>Steeltoe.Extensions.Configuration.ConfigServerCore</code>, and so on) for a total of 9
packages. If you deploy your application to Pivotal Cloud Foundry, be sure to use the
<code>Pivotal.&amp;ast;</code> packages.</p>
<h4 id="config-server-settings">Config Server Settings</h4>
<p>Starting with version 1.1.0 of Steeltoe, you can now configure the timeout value the Steeltoe
client uses when making Http requests to the Config Server.</p>
<h4 id="config-server-vault-support">Config Server Vault support</h4>
<p>Starting with version 1.1.0 of Steeltoe, the Config Server client is compatible with Spring Cloud
and Spring Cloud Services Config Server deployments that support using HashiCorp Vault as
back-ends.</p>
<h4 id="known-issues">Known Issues</h4>
<h5 id="unstructured-data-files">Unstructured data files</h5>
<p>Unlike the Java version of the Config Server client, the Steeltoe client currently supports only
property and yaml files, not plain text.</p>
<h5 id="client-decryption-option">Client decryption option</h5>
<p>Unless SSL/TLS is being used between the client and server, the Steeltoe client supports only
clear text communication with the configuration server. Client decryption is not currently
supported.</p>
<h5 id="server-initiated-reload">Server initiated reload</h5>
<p>Currently, the client must initiate reloads. Steeltoe has not implemented handlers to listen for
server change events.</p>
<h3 id="connectors">Connectors</h3>
<p>As of version 2.0.0, all of the individual connectors have been rolled up into a single package:
<code>Steeltoe.CloudFoundry.ConnectorBase</code>. Helper methods for ASP.NET Core/Microsoft DI
have been moved to <code>Steeltoe.CloudFoundry.ConnectorCore</code>,
<code>Steeltoe.CloudFoundry.Connector.EF6Core</code> (Entity Framework 6), and
<code>Steeltoe.CloudFoundry.Connector.EFCore</code> (Entity Framework Core). Version 2.0.0 now
includes a Microsoft SQL Server Connector. Classes and namespaces related to RabbitMQ have been
renamed from <code>*Rabbit</code> to <code>*RabbitMQ</code>.</p>
<h4 id="mysql-connector">MySql Connector</h4>
<p>Starting with version 1.0.1 of Steeltoe, the direct dependency on all of Oracles MySql packages
has been removed. This change lets the connector become more flexible in terms of which MySql
ADO.NET providers and versions it supports. With this release, the connector is able to work
with <a href="https://dev.mysql.com/downloads/connector/net/">Oracles MySql Provider</a> and
the open source <a href="https://mysql-net.github.io/MySqlConnector/">MySqlConnector</a>
providers.</p>
<p>Additionally, as it relates to Entity Framework support, the connector has been updated to
support <a href="https://dev.mysql.com/downloads/connector/net/">Oracles Entity Framework
Provider</a> and the open source <a
href="https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql">Pomelo Entity
Framework Provider</a>.</p>
<p>For more detail on how to use these providers, see the MySql connector documentation.</p>
<blockquote>
<p>CAUTION: This is a BREAKING change, as it now requires that you MUST explicitly include the
packages and versions of the MySql/Entity framework code you wish to use in your
application.</p>
</blockquote>
<h4 id="postgres-connector">Postgres Connector</h4>
<p>Starting with version 1.0.1 of Steeltoe, the direct dependency on the open source Npgsql package
has been removed. This change lets the connector become more flexible in what Postgres ADO.NET
providers and versions it supports.</p>
<p>For more detail on how to use the connector, see the Postgres connectors documentation.</p>
<blockquote>
<p>CAUTION: This is a BREAKING change, as it now requires that you MUST explicitly include the
packages and versions of the Postgres/Entity framework code wish to use in your application.
</p>
</blockquote>
<h4 id="rabbitmq-connector">RabbitMQ Connector</h4>
<p>In version 2.0.0, all namespaces, classes and methods with <code>Rabbit</code> in the name were
changed to <code>RabbitMQ</code> (for example, <code>AddRabbitConnection()</code> is now
<code>AddRabbitMQConnection()</code>)</p>
<p>Starting with version 1.0.1 of Steeltoe, the direct dependency on the open source RabbitMQ Client
package has been removed. This change lets the connector become more flexible in what version of
the client it supports.</p>
<p>For more detail on how to use the connector, see the RabbitMQ connectors documentation.</p>
<blockquote>
<p>CAUTION: This is a BREAKING change, as it now requires that you MUST explicitly include the
packages and versions of the RabbitMQ code you wish to use in your application.</p>
</blockquote>
<p>Also, with this release, the connector has been updated to properly work with SSL/TLS based
connections. Prior to this release, the connector did not support using the amqps URL scheme.
</p>
<h4 id="redis-connector">Redis Connector</h4>
<p>Starting with version 2.0.0 of Steeltoe, the direct dependencies on Redis packages have been
removed. The Steeltoe connector works with the StackExchange libraries or
<code>Microsoft.Extensions.Caching.Redis</code>. You include the package and version you prefer
and use the appropriate methods to connect it. See the Redis Connector documentation for more
information.</p>
<h3 id="discovery">Discovery</h3>
<p>In version 1.x of Steeltoe, there were three packages. In version 2.0.0 there are six packages:
</p>
<ul>
<li><code>Steeltoe.Discovery.ClientAutofac</code></li>
<li><code>Steeltoe.Discovery.ClientCore</code></li>
<li><code>Steeltoe.Discovery.Eureka.ClientBase</code></li>
<li><code>Pivotal.Discovery.ClientCore</code></li>
<li><code>Pivotal.Discovery.ClientAutofac</code></li>
<li><code>Pivotal.Discovery.Eureka.ClientBase</code>.</li>
</ul>
<p>Be sure to use the <code>Pivotal.*.*</code> packages if you deploy your application to Pivotal
Cloud Foundry. Version 2.0.0 also includes support for dynamic update of configuration options.
</p>
<h4 id="eureka-version">Eureka Version</h4>
<p>Steeltoe has implemented a <a href="https://github.com/Netflix/eureka/wiki">Eureka 1.0
client</a>, not a 2.0 client. Eureka 2.0 is still a work in progress and is expected to have
significant updates to its architecture and public API. At some point in time, we may examine a
2.0 implementation.</p>
<h4 id="eureka-aws-support">Eureka AWS Support</h4>
<p>The Eureka client for Java contains features that enable operation on AWS. The Steeltoe version
does not currently implement those features. Instead, this version has been optimized for Cloud
Foundry environments. We may look at adding AWS cloud features at a future point in time.</p>
<h4 id="eureka-client-configuration">Eureka Client Configuration</h4>
<p>Not all configuration properties found in the Java client are available for configuration. Those
that are supported and provided by the Steeltoe implementation have been documented in this
guide.</p>
<h4 id="cloud-foundry-c2c-support">Cloud Foundry C2C Support</h4>
<p>Starting with version 1.1.0 of Steeltoe, the Steeltoe Eureka client lets you configure what
hostname/address gets registered with the Eureka server for your service registrations. This
feature is provided by using a new setting:
<code>spring:cloud:discovery:registrationMethod</code>. By using this setting, you can now make
use of Cloud Foundry Container to Container (C2C) networking support.</p>
<h3 id="logging">Logging</h3>
<p>As of version 2.0.0, <code>Steeltoe.Extensions.Logging.CloudFoundry</code> is renamed to
<code>Steeltoe.Extensions.Logging.DynamicLogger</code></p>
<h3 id="management">Management</h3>
<p>As of version 2.0.0, all of the individual management endpoints have been rolled up into a single
package: <code>Steeltoe.Management.EndpointBase</code>. Helper methods for ASP.NET
Core/Microsoft DI have been moved to <code>Steeltoe.Management.EndpointCore</code>. Convenience
helpers to set up all endpoints at once are available in
<code>Steeltoe.Management.CloudFoundryCore</code>. Additionally in 2.0.0, actuators identify
themselves to PCF as Steeltoe, resulting in a Steeltoe icon in Pivotal Apps Manager. Also,
certificate validation can be disabled on management endpoints.</p>
<h3 id="security">Security</h3>
<p>New features for Steeltoe Security 2.0.0 include a client for <a
href="https://github.com/cloudfoundry-incubator/credhub">CredHub</a>, support for using
Cloud Foundry as an authentication provider in .NET Framework 4.x applications, and a JWT
Provider for WCF applications.</p>
<a class="repo-link"
href="https://github.com/steeltoeoss/steeltoe-site/tree/dev/source/reference/reference-release-notes.html.markdown">Create
a pull request or raise an issue on the source for this page in GitHub</a>
</div>
</div>
</div>
</div>
<script src="/javascripts/vendor/gumshoe.js"></script>
<script src="/javascripts/vendor/highlight.min.js"></script>
<script src="/javascripts/vendor/jquery-3.1.1.slim.min.js"></script>
<script src="/javascripts/vendor/particles.min.js"></script>
<script src="/javascripts/vendor/smooth-scroll.js"></script>
<script src="/javascripts/vendor/sticky-kit.min.js"></script>
<script src="/javascripts/vendor/svg-injector.min.js"></script>
<script src="/javascripts/vendor/tocbot.min.js"></script>
<script src="/javascripts/all.js"></script>
<script src="/javascripts/docs.js"></script>
<script>
function viewV1() {
window.location.href = '/1x/steeltoe-configuration/';
}
//document.getElementById('docselector').style.display = "inline";
</script>
</body>
</html>

Просмотреть файл

@ -1,143 +0,0 @@
# Tech Tutorial: Use Kubernetes for Modern .NET Apps? Steeltoe and Project Tye are Your Path to Productivity
I recently went through training to get my [Kubernetes Application Developer certification](https://www.cncf.io/certification/ckad/) (CKAD). I went into it with a decent amount of K8s knowledge and an even greater understanding of microservices. In fact my understanding of proper microservice architectures has raised my expectations for the tech I use.
For example, I expect my selected platform to automatically provide some of the [12 factors](https://12factor.net/) I use in my design patterns. It should capture my streamed logs. It should allow me to autoscale app instances. It should allow for dynamic port binding. Everything should be immutable. And (the biggest one on my list) it should be architected in a way where I can recreate it locally while developing. Do these may seem like tall expectations? Perhaps, but any modern platform should do this.
I (honestly) set my expectations of the training low. After all, Kubernetes is awesome for managing infrastructure. But its a little raw for developers.
In an ideal world, a developer isn't interacting directly with infrastructure. They interact with GIT, which interacts with a CI/CD pipeline, which interacts with the runtime. But we live in the real world, and it's never going to be ideal.
Having accepted an inevitable fate of yaml and dockerfile, my training taught me about all the developer tools in Kubernetes. Operators, controllers, namespaces, configmaps, secrets, and of course pods. My training took me through attaching disks and providing configurations to my app. It showed me how apps can interact with other apps in the same cluster through a DNS-like pattern. Powerful stuff!
As I digested all this Kubernetes magic, a realization dawned on me. I don't want to follow Kubernetes patterns in my .NET application. I want to follow .NET patterns in my .NET application. How can I have a better developer experience using Kubernetes, and follow best practices for .NET? And how can I do it without having to create everything from scratch?
Turns out, lots of other developers are wrestling with the same thing. But it gets better - the community has developed a project to deal with this exact scenario: [Steeltoe](https://steeltoe.io).
Steeltoe 3.0 brings in Kubernetes goodies that abstract much of this toil away. When I coupled Steeltoe 3 with Microsofts [Project Tye](https://devblogs.microsoft.com/aspnet/introducing-project-tye/), my sky-high developer expectations are met.
Let's look at how the combination of Steeltoe and Tye make consuming Kubernetes a whole lot easier.
## Microservices should be given their configuration (and secrets)
When you think of an applications configuration value, a connection string is probably top of mind. It could really be anything. Typically microservices can't successfully start (or atleast run) without being fed proper values.
As a microservice moves through its environments (local, staging, production) configuration values change, but the labels of the values are consistent. A microservice stays resilient to these changes by simply consuming the value it is fed.
Further, configuration values come from different sources in different environments. A microservice should be smart enough to check every possible source and decide what value should be used.
.NET Core introduced [configuration providers](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1#configuration-providers) and a hierarchy to them. So it's natural that a Kubernetes configmap (which is just another key/value store) should be a config source in a .NET microservice.
[Steeltoe offers a Kubernetes provider](https://steeltoe.io/docs/3/configuration/kubernetes-providers) to do just this! To add the client all you need to do is let the HostBuilder know about it.
```csharp
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
})
.AddKubernetesConfiguration()
```
This little bit of code packs a powerful punch. Behind the scenes Steeltoe will use the key mappings to create a custom configuration provider and add it into the hierarchy. In turn all this will be added into the IConfiguration interface which is a part of dependency injection. This makes retrieving the values very straight forward.
```csharp
private readonly IConfiguration config;
public WeatherForecastController(IConfiguration config){
_config = config;
//To reference a specific value
//_config["my-setting"];
}
```
Also included is the option to automatically refresh values. When enabled, your application will poll (or maintain an open connection) with the Kubernetes API server. Whenever a value in the ConfigMap is changed, your apps values will also change -- no restart needed. Whenever a value is added or removed from the ConfigMap (or Secret) your app will automatically see those changes -- also no restart required. That's some cloud-native ninja action!
Getting the value(s) of Kubernetes secrets to the application follows the same pattern as ConfigMaps. Additionally you can pick and choose which source should be made available to the application. [Learn more in the docs](https://steeltoe.io/docs/3/configuration/kubernetes-providers).
## If all the services are in the same cluster...
When your applications are running within the same Kubernetes cluster there is quite a bit to take advantage of. Load balancing, routing, and DNS services are a few. As it just so happens these are also the things needed for a very popular cloud-native pattern called service discovery.
Things lined up even more for Steeltoe as it already has a discovery client that lets you abstract the provider away. So naturally including the option to use a Kubernetes cluster as a discovery provider was a quick and easy thing.
To implement the Steeltoe discovery client, add the `Steeltoe.Discovery.Kubernetes` nuget package to the application and implement the general discovery client in program.cs…
```csharp
using Steeltoe.Discovery.Client;
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
})
.AddDiscoveryClient()
```
The combination of adding a specific discovery clients package and generally implementing the discovery client tells Steeltoe exactly what the app wants to do. Under the covers Steeltoe will manage all the interactions with the Kubernetes API.
> [TIP] You can also include the Eureka or Consul client package along with generally implementing the discovery client. Steeltoe will add in the appropriate provisions for the desired provider.
Steeltoe actively discovers endpoints for all applications registered in the cluster. Because registration is automatic in Kubernetes theres really no work to be done. That's a very nice cloud-native gimme!
An example to discover a service named fortuneService that has an endpoint prefix of /api/fortunes we can follow .NET best practices using an HTTPClient factory...
```csharp
public void ConfigureServices(IServiceCollection services) {
services.AddHttpClient("fortunes", c => {
c.BaseAddress = new Uri("http://fortuneService/api/fortunes/");
})
.AddServiceDiscovery()
.AddTypedClient<IFortuneService, FortuneService>();
}
```
Steeltoe will take care of reading the registry behind the scenes. To use the clients built in factory use constructor injection and get on with life!
```csharp
private readonly HttpClient _httpClient;
public FortuneService(HttpClient httpClient, ILoggerFactory logFactory){
_httpClient = httpClient;
//To then call the service using provided HTTPclient
//Fortune[] fortunes = await _httpClient.GetJsonAsync<Fortune>("random-fortunes");
}
```
[Customizable load-balancing](https://steeltoe.io/docs/3/discovery/load-balancing) between multiple application instances of the same service? Done. Automatic service registration? Done. Steeltoe and Kubernetes are like peanut butter and jelly. They were made for one another.
## Teach Kubernetes what a healthy application is
Any proper platform running containers is going to have a concept of health reporting. An application reports its heartbeat (usually as an HTTP endpoint) and is checked on some interval by its platform. If there are complications then the platform acts accordingly.
In Kubernetes, there are two deeper probes offered named `readiness` and `liveness`. Readiness is about ensuring the application is ready to start receiving traffic. While liveness is about making sure the application is still healthy over time.
Fortunately, Steeltoe is here to help set up both of these probes. Using new IHealthContributors and support for grouping, Steeltoes [health actuator endpoint](https://steeltoe.io/docs/3/management/health) builds several different views of the apps dependencies.
A view is a collection of decisions that reflect the current state of the application. For example if an application depends on a service and it (for some reason) goes offline, then the view should return a negative state. When the service is back up, then the views state should update to positive.
The current state of the views are a part of the response body in the health actuator endpoint. Kubernetes uses this to know how the app is doing.
Learn more about Steeltoes health endpoint with documentation and code snippets, [here](https://steeltoe.io/docs/3/management/health).
## Develop locally, as if youre already in production
Just like the old saying “dance as if no one is watching”, an application should not care whos watching (ie: which environment). It should start and run exactly the same everywhere. The ability to run the same type cluster no matter the [physical] environment is definitely one of Kubernetes super powers. And you have all kinds of options to run local K8s clusters (like Docker Desktop or Kind).
But the question I ask myself before going down this path is, what am I really accomplishing? Its a natural instinct to want to develop on the same platform that the app will be using, but is it worth the time needed for setup? Under the covers there are really just a few primities that enable your application and its dependent services to do their job - container management and request routing with some sort of DNS. Yes there are all kinds of other fancy ingress, egress, service mesh, etc etc things going on in Kubernetes. And yes they are all a part of deciding if your app is actually going to work on the platform, but should they be a part of development? Youre never going to recreate all the firewalls, reverse proxies, certificates, and switches that requests have to traverse. And if were doing microservices the right way, the application shouldnt care one bit about any of that stuff.
The local development needs are:
* The ability to build and run containers (ie: Docker)
* The ability to create a distinct container subnet and resolve names within
* The ability for an IDE running the application (in debugging mode) to interact with that subnet
Say hello to [Project Tye](https://github.com/dotnet/tye). With Tye the environment is software defined as a manifest. Port assignment and container networking are done for you. You can run the application and all its services in individual containers. Or you could run the application from its IDE and just have Tye run the backing services. Most notably you can have Tye target Kubernetes as the intended platform. In fact you could switch between a local cluster and a hosted cluster with no change to the application!
Project Tye solves a cloud-native developers biggest challenge, environment parity. Its super friendly to all your existing .NET habits and doesnt have much bias about an IDE. All you need is the [tool installed in the dotnet cli](https://github.com/dotnet/tye/blob/master/docs/getting_started.md) and Docker running… and maybe a little yaml skill.
## Learn more and get started today
To get started with any Steeltoe projects, head over to the [getting started guides](https://steeltoe.io/get-started). Combine this with the samples in the [Steeltoe GitHub repo](https://github.com/SteeltoeOSS/Samples), and youll have .NET microservices up and running before you know it!
Want to get deeper into creating cloud-native .NET apps? Attend the VMware Pivotal Labss [4 -day .NET developer course](https://pivotal.io/platform-acceleration-lab/pal-for-developers-net). Youll get hands-on cloud-native .NET training learn best practices when creating microservices and become a Steeltoe ninja!