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

2020-09-25  本文已影响0人  zxws1009

采用循序的方式演变的程序架构:
单一进程的单体架构 > 局域网分布式架构 > 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分布式集群架构+负载均衡

上一篇下一篇

猜你喜欢

热点阅读