美文网首页
.net core 微服务demo笔记-局域网分布式架构

.net core 微服务demo笔记-局域网分布式架构

作者: zxws1009 | 来源:发表于2020-09-25 23:06 被阅读0次

    采用循序的方式演变的程序架构:
    单一进程的单体架构 > 局域网分布式架构 > Nginx分布式集群架构+负载均衡 > Consul高可用性,高伸缩性的集群架构

    demo环境:windows10 + VS 2019 + .net core 3.1

    继上一篇.net core 微服务demo笔记-单体架构,本篇讲解局域网分布式架构

    一、新建UserService微服务demo程序

    上一篇我们新建了一个Mvc程序,本次咱们新建一个微服务的API项目,这个微服务仅处理用户相关的接口服务。

    1. 新建一个asp .net core的web api项目取名叫UserService
    2. 新建一个UsersController并新增一个Get请求
    3. 修改配置文件appsettings.json, 新增3个设置
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      "AllowedHosts": "*",
      "AppUrls": "http://localhost:6201", // 服务地址
      "Ip": "127.0.0.1", // ip地址
      "Port": "6201" // 端口号
    }
    
    1. 修改Program.cs, 设置程序启动的url
    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
                            .AddJsonFile("appsettings.json")
                            .Build();
        var url = configuration["AppUrls"]; // 从配置文件中获取url地址
        return  Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseUrls(url); // 使用该url地址
                webBuilder.UseStartup<Startup>();
            });
    }
    
    1. 新增一个Get请求
    namespace MicroService.UserService.Controllers
    {
        [ApiController]
        [Route("api/[controller]")]
        public class UsersController : ControllerBase
        {
            private readonly ILogger<UsersController> _logger;
            public UsersController(ILogger<UsersController> logger)
            {
                _logger = logger;
            }
    
            [HttpGet]
            public string Get()
            {
                var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
                      .AddJsonFile("appsettings.json")
                      .Build();
                var url = configuration["AppUrls"];
                return $"MicroService.UserService服务地址:{ url }{Request.Path}  响应时间:{DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()}";
            }
        }
    }
    
    1. 找到程序的debug目录,使用命令启动程序
    命令行启动:dotnet MicroService.UserService.dll
    
    image.png

    此刻服务已启动, 访问 http://localhost:6201/api/users,得到结果如下:

    image.png

    一、MallApp调用部署在局域网的UserService提供的接口服务

    1. 新建一个HttpHelper.cs帮助类,使用该类发起api请求
    /// <summary>
    /// 公共方法—— 发送http get 请求
    /// <para>最终以url参数的方式提交</para>
    /// </summary>
    /// <param name="parameters">参数字典,可为空</param>
    /// <param name="requestUri">例如/api/Files/UploadFile</param>
    /// <returns></returns>
    public static string Client_Get(Dictionary<string, string> parameters, string requestUri)
    {
        using var httpClientHandler = new HttpClientHandler
        {
            ClientCertificateOptions = ClientCertificateOption.Manual,
            SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls,
            ServerCertificateCustomValidationCallback = (x, y, z, m) => true,
        };
        using var httpClient = new HttpClient(httpClientHandler);
        httpClient.DefaultRequestHeaders.Accept.Clear();
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        //拼接地址
        if (parameters != null)
        {
            var strParam = string.Join("&", parameters.Select(o => o.Key + "=" + o.Value));
            requestUri = string.Concat(requestUri, '?', strParam);
        }
        httpClient.BaseAddress = new Uri(requestUri);
        return httpClient.GetStringAsync(requestUri).Result;
    }
    
    1. 修改HomeController的Index action
    public IActionResult Index()
    {
        //分布式架构-user微服务实例独立出来部署到局域网中,通过http协议访问
        //该方式仅单个服务,对于架构来说高可用性很低,一旦崩溃将整个服务不可用
        var re = HttpHelper.Client_Get(null, "http://localhost:6201/api/users", "");
        var model = new HomeViewModel()
        {
            Name = "MallApp",
            NowDate = $"{DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()}",
            IP = $"{ Request.Scheme}://{Request.Host}{Request.Path}",
            Info = re
        };
        return View(model);
    }
    

    启动MallApp程序,结果如下


    image.png

    以上基本就是实现了一个最简单的分布式架构,将业务逻辑较复杂的模块拆分成一个单独的服务进程中,降低主系统服务的压力;

    局域网分布式架构的缺点
    可用性不高,该方式仅单个服务,对于架构来说高可用性很低,一旦崩溃将整个服务不可用;因此我们可以用分布式集群+负载均衡来解决这个问题

    上一篇:.net core 微服务demo笔记-单体架构
    下一篇: .net core 微服务demo笔记-Nginx分布式集群架构+负载均衡

    相关文章

      网友评论

          本文标题:.net core 微服务demo笔记-局域网分布式架构

          本文链接:https://www.haomeiwen.com/subject/mlsquktx.html