采用循序的方式演变的程序架构:
单一进程的单体架构 > 局域网分布式架构 > Nginx分布式集群架构+负载均衡 > Consul高可用性,高伸缩性的集群架构
demo环境:windows10 + VS 2019 + .net core 3.1
继上一篇.net core 微服务demo笔记-单体架构,本篇讲解局域网分布式架构
一、新建UserService微服务demo程序
上一篇我们新建了一个Mvc程序,本次咱们新建一个微服务的API项目,这个微服务仅处理用户相关的接口服务。
- 新建一个asp .net core的web api项目取名叫UserService
- 新建一个UsersController并新增一个Get请求
- 修改配置文件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" // 端口号
}
- 修改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>();
});
}
- 新增一个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()}";
}
}
}
- 找到程序的debug目录,使用命令启动程序
命令行启动:dotnet MicroService.UserService.dll
image.png
此刻服务已启动, 访问 http://localhost:6201/api/users,得到结果如下:
一、MallApp调用部署在局域网的UserService提供的接口服务
- 新建一个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;
}
- 修改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分布式集群架构+负载均衡
网友评论