ASP.NET Core分布式项目实战

默认教学计划
1085人加入学习
(33人评价)
价格 ¥398.00
教学计划

聚合服务:处理跨多个服务调用

[展开全文]

微服务特点:

  1. 一组小的服务,
  2. 独立进程,
  3. 轻量级通讯(Json/grpc),
  4. 基于业务的能力,
  5. 独立部署,
  6. 无集中式管理

微服务架构产生的问题:

  1. 问题追踪,
  2. 测试,
  3. 部署,
  4. 监控,
  5. 分布式事务,
  6. 服务治理,
  7. 开发难度加大(聚合查询),
  8. 分布式事务
[展开全文]

docker commands

docker --version 查看但前的版本

docker ps 查看本地的正在运行的容器

docker images 查看本地所有的镜像

docker run 运行一个容器

docker pull 用来拉取一个镜像到本地

[展开全文]
//针对视频中的代码做的部分调整,改为最新
static async Task Main(string[] args)
        {
            var client=new HttpClient();
            var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000");
            if (disco.IsError)
            {
                Console.WriteLine(disco.Error);
                return;
            }

            var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest()
            {
                Address = disco.TokenEndpoint,
                ClientId = "client",
                ClientSecret = "secret",
                Scope = "api"
            });
            if (tokenResponse.IsError)
            {
                Console.WriteLine(tokenResponse.Error);
                return;
            }
            Console.WriteLine(tokenResponse.Json);
            
            client.SetBearerToken(tokenResponse.AccessToken);
            var response = await client.GetAsync("http://localhost:5001/WeatherForecast");
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine(await response.Content.ReadAsStringAsync());
            }
        }

 

[展开全文]

产品MVP的含义;

  1. 以用户问题为中心,而不是已解决方案为中心;
  2. 要先满足客户基本的需求通过客户反馈,逐步修正产品设计和实现;
  3. 在各个迭代过程中,做出来的产品始终是为客户所用的产品;
[展开全文]

2.3 版本移除了CAP 中间件注册

https://www.cnblogs.com/savorboard/p/cap-2-3.html

[展开全文]

Image :软件安装包

Container :在电脑上安装好的软件

镜像仓库:AppStore

start container :打开软件

stop container :关闭软件

rm container :卸载软件

[展开全文]

    Auth2仅仅是授权部分(授权并获取token),不包括获取用户资料,Open ID Connect则在授权的同时,将用户资料跟token一次性返回
    OIDC-Open ID Connect是在Auth2之上构建的一套流程,丰富了获取资料的一些步骤

[展开全文]

var address = query.ResolveService("service.consul", options.Value.UserServiceName);
            var addressList = address.First().AddressList;
            var host = addressList.Any() ?
                addressList.First().ToString() : address.First().HostName.Substring(0, address.First().HostName.Length - 1);
            var port = address.First().Port;

 

host 如果通过hostname去取,会多一个点,这里注意下

[展开全文]

.net core 2.2下会找不到UseInMemoryDatabase方法

 

解决方法:

添加这个包

Microsoft.EntityFrameworkCore.InMemory

[展开全文]
using System;
using System.Net.Http;
using IdentityModel.Client;

namespace ThirdPartyDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ConnectServer();

            var token = GetToken();

            AccessApi(token);

            Console.WriteLine("Hello World!");
            Console.ReadLine();
        }

        private static void ConnectServer()
        {
            // 连接IdentityServer服务端
            var httpClient = new HttpClient();
            var disco = httpClient.GetDiscoveryDocumentAsync("http://localhost:5005").Result;
            if (disco.IsError)
            {
                Console.WriteLine(disco.Exception);
            };
        }

        private static string GetToken()
        {
            var httpClient = new HttpClient();
            var response = httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
            {
                Address = "http://localhost:5005/connect/token",
                ClientId = "123",
                ClientSecret = "pwd"
            }).Result;

            if (response.IsError)
            {
                Console.WriteLine(response.Exception);
                return null;
            }
            else
            {
                Console.WriteLine(response.AccessToken);
                return response.AccessToken;
            }
        }

        private static void AccessApi(string token)
        {
            if (string.IsNullOrEmpty(token)) { return;}

            var httpClient = new HttpClient();
            httpClient.SetBearerToken(token);
            var response = httpClient.GetAsync("https://localhost:5001/api/values").Result;
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine(response.Content.ReadAsStringAsync().Result);
            }
            else
            {
                Console.WriteLine("error");
            }
        }
    }
}

 

[展开全文]

老师这节视频中的做法是没有问题的。但是这里更新下eshop新的使用方式。

ResilientHttpClient是基于NetCore2.1的做法,在2.2出来之后,随着 HttpClientFactory 的发布eShopOnContainers

项目已经弃用了这样的构建。

各位小伙伴可以参考https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly

或者直接下载eshop的代码参考。

个人笔记记录,不足之处请指正。

[展开全文]

static void Main(string[] args)
{
    //DiscoveryClient已过时了,用HttpClient代替
    //官方文档:https://identitymodel.readthedocs.io/en/latest/client/discovery.html
    HttpClient hc = new HttpClient();
    var diso = hc.GetDiscoveryDocumentAsync("http://localhost:5000").Result;

    if (diso.IsError)
    {
        Console.WriteLine(diso.Error);
    }
    else
    {
        //TokenClient已过时,用HttpClient代替
        //官方文档:https://identitymodel.readthedocs.io/en/latest/client/token.html
        var tokenResponse = hc.RequestTokenAsync(new ClientCredentialsTokenRequest
        {
            Address = diso.TokenEndpoint,
            GrantType = "client_credentials",
            ClientId = "Client1",
            ClientSecret = "secret",
            Scope = "api1"
        }).Result;
        if (tokenResponse.IsError)
        {
            Console.WriteLine(tokenResponse.Error);
        }
        else
        {
            Console.WriteLine(tokenResponse.Json);
            hc.SetBearerToken(tokenResponse.AccessToken);
            var response=hc.GetAsync("http://localhost:5001/api/values").Result;
            if (response.IsSuccessStatusCode)
            {
                string result=response.Content.ReadAsStringAsync().Result;
                Console.WriteLine(result);
            }
            else
            {
                Console.WriteLine(response.StatusCode);
            }
        }
                
    }
    Console.ReadKey();
}

[展开全文]

AddIdentityServerAuthentication 无法使用

添加:IdentityServer4.AccessTokenValidation包,引用

public void ConfigureServices(IServiceCollection services)
{
    var authenticationProviderKey = "TestKey";
    Action<IdentityServerAuthenticationOptions> options = o =>
        {
            o.Authority = "https://whereyouridentityserverlives.com";
            o.ApiName = "api";
            o.SupportedTokens = SupportedTokens.Both;
            o.ApiSecret = "secret";
        };

    services.AddAuthentication()
        .AddIdentityServerAuthentication(authenticationProviderKey, options);

    services.AddOcelot();
}
[展开全文]

gitlab cl tags

搭建一个自动化平台

自动测试脚本
ui

性能测试
自动发布

gitlab cli 持续集成

 

[展开全文]

授课教师

程序员

课程特色

下载资料(2)
视频(144)
讨论(1)
图文(2)