当前位置: 首页 > news >正文

网站icp备案地鞍山做网站专业公司

网站icp备案地,鞍山做网站专业公司,深圳谷歌seo公司,wordpress 首页循环目录 前言 什么是微服务 微服务的优势 微服务的原则 创建项目 在Docker中运行服务 客户端调用 简单的集群服务 前言 写这篇文章旨在用最简单的代码阐述一下微服务 什么是微服务 微服务描述了从单独可部署的服务构建分布式应用程序的体系结构流程#xff0c;同时这些…目录 前言 什么是微服务 微服务的优势 微服务的原则 创建项目 在Docker中运行服务 客户端调用 简单的集群服务 前言 写这篇文章旨在用最简单的代码阐述一下微服务 什么是微服务 微服务描述了从单独可部署的服务构建分布式应用程序的体系结构流程同时这些服务会执行特定业务功能并通过 Web 接口进行通信DevOps 团队通过将微服务如构建块组合在一起从而将单个功能纳入微服务中以及构建更大的系统。 微服务的优势 微服务采用了某一开放/封闭原则 它们会开放以便进行扩展使用它们公开的接口它们会关闭以便进行修改每个修改都会独立执行并进行版本控制 微服务为整体体系结构提供了众多优势 它们可以通过确保一个服务中的问题不会崩溃或影响应用程序的其他部分来移除单一故障点 (SPOF)。可独立扩展单个微服务以提供额外的可用性和容量。DevOps 团队可通过添加新微服务来扩展功能而无需不必要的影响应用程序的其他部分。 使用微服务可提高团队速度。微服务通过允许软件开发团队利用事件驱动的编程和自动缩放等场景很好地补充基于云的应用程序体系结构。 微服务组件通常会通过 REST 协议公开 API应用程序编程接口以便与其他服务通信。 微服务的原则 顾名思义微服务体系结构是一种将服务器应用程序生成为一组小型服务的方法。 这意味着微服务体系结构主要面向后端虽然该方法也会用于前端。 每个服务都在自己的进程中运行并使用 HTTP/HTTPS、WebSocket 或 AMQP 等协议与其他进程进行通信。 每个微服务在特定的上下文边界内实现特定的端到端域或业务功能每个微服务都必须自主开发并且可以独立部署。 最后每个微服务都应拥有其自己的相关域数据模型和域逻辑主权和分散式数据管理并且可以基于不同的数据存储技术SQL、NoSQL和不同的编程语言。 微服务应该有多大 在开发微服务时大小不应成为重点。 相反重点应该是创建松散耦合的服务以便自主地为每个服务进行开发、部署和缩放。 当然在标识和设计微服务时只要与其他微服务不存在过多的直接依赖项就应尝试让它们尽可能地小。 比微服务的大小更重要的是它必须具有内部内聚并且独立于其他服务。 创建项目 我们在项目中新建两个文件夹Client跟Service。Client文件夹用于管理我们的客户端Service文件夹用于管理我们的Api. 项目结构目录如下 三个项目都是Asp.Net Core Web API。 我们为ForumProductApi以及ForumOrderApi添加一些基础代码我们返回接口名称以及当前时间服务的IP地址端口等信息以让我们更好的区分接口。 我们修改OrderApi的代码如下 [ApiController] [Route(order)] public class OrderController : ControllerBase {private readonly ILoggerOrderController _logger;public OrderController(ILoggerOrderController logger){_logger logger;}[HttpGet(Name GetOrder)]public TaskOrderEntity GetOrder(){return Task.FromResult(new OrderEntity(){date_time DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss),ip_address Request.HttpContext.Connection.LocalIpAddress?.ToString(),ip_port Request.HttpContext.Connection.LocalPort.ToString(),service_name 订单服务});} }public class OrderEntity {/// summary/// 当前时间/// /summarypublic string? date_time { get; set; }/// summary/// Ip地址/// /summarypublic string? ip_address { get; set; }/// summary/// Ip端口/// /summarypublic string? ip_port { get; set; }/// summary/// 服务名称/// /summarypublic string? service_name { get; set; }} 同理我们修改ProductApi的代码如下 [ApiController] [Route(product)] public class ProductController : ControllerBase {private readonly ILoggerProductController _logger;public ProductController(ILoggerProductController logger){_logger logger;}[HttpGet(Name GetOrder)]public TaskProductEntity GetOrder(){return Task.FromResult(new ProductEntity(){date_time DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss),ip_address Request.HttpContext.Connection.LocalIpAddress?.ToString(),ip_port Request.HttpContext.Connection.LocalPort.ToString(),service_name 产品服务});} }public class ProductEntity {/// summary/// 当前时间/// /summarypublic string? date_time { get; set; }/// summary/// Ip地址/// /summarypublic string? ip_address { get; set; }/// summary/// Ip端口/// /summarypublic string? ip_port { get; set; }/// summary/// 服务名称/// /summarypublic string? service_name { get; set; }} 在Docker中运行服务 发布Product服务。 修改Dockerfile如下 #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed. #For more information, please see https://aka.ms/containercompatFROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443COPY ./ ./ENTRYPOINT [dotnet, ForumProductApi.dll] 打开prowershell使用Docker编译项目并发布 进入发布目录build Api docker build -t productcontainer:1.0 . 这就表示编译成功。 然后我们运行容器 docker run -d -p 8050:80 --name productapi productcontainer:1.0 然后我们在浏览器中访问该项目 http://localhost:8050/swagger/index.html 访问结果如下 我们以同样的方式部署Order服务。 同样我们也需要修改Dockerfile如下 #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed. #For more information, please see https://aka.ms/containercompatFROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443COPY ./ ./ENTRYPOINT [dotnet, ForumOrderApi.dll] 打开prowershell使用Docker编译项目并发布 进入发布目录build Api docker build -t ordercontainer:1.0 . 运行项目 docker run -d -p 8060:80 --name ordertapi ordercontainer:1.0 然后我们在浏览器中访问该项目 http://localhost:8060/swagger/index.html 访问结果如下  客户端调用 客户端我们需要http请求服务端接口所以我们需要http请求这里我使用了HttpClientFactory代码很简单可用于参考 Program代码 var builder WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();#region 注册IHttpClientFactorybuilder.Services.AddHttpClient(local, config {config.BaseAddress new Uri(http://localhost); }); builder.Services.AddHttpClient();#endregionvar app builder.Build();// Configure the HTTP request pipeline. //if (app.Environment.IsDevelopment()) //{app.UseSwagger();app.UseSwaggerUI(); //}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();ClientController代码如下 [ApiController] [Route(client)] public class ClientController:ControllerBase {private readonly ILoggerClientController _logger;private readonly IHttpClientFactory _httpClientFactory;public ClientController(IHttpClientFactory httpClientFactory, ILoggerClientController logger){_httpClientFactory httpClientFactory;_logger logger;}[HttpGet(Name GetData)]public async Taskstring GetData(){var client _httpClientFactory.CreateClient(local); //string order_url http://localhost:8060/order;string product_url http://localhost:8050/product;var order_result await client.GetStringAsync(order_url);var product_result await client.GetStringAsync(product_url);return $订单服务{order_result}产品服务{product_result};} } 直接运行看结果 我们的接口都可以请求成功。 一切正常进行到这里各个服务都可以独立运行客户端也可以正常调用貌似我们已经完成一个简易的微服务了但是微服务架构最重要的原则是高可用以上的做法并不能满足高可用性因为我么的服务一旦挂掉所有依赖这个服务的业务系统就会受到影响。 如我们现在停止订单服务。 docker stop orderapi 我们再次使用客户端请求获取数据的接口 出现如下结果 要解决这个问题我们很容易想到的解决方案就是集群。 简单的集群服务 既然单个服务有挂掉的风险那么部署多个服务实例就好了只要大家不同时挂掉我们的请求就没有问题。 ok我们使用docker运行多个服务实例 我们的Order服务运行三个实例端口从60到62 docker run -d -p 8060:80 --name orderapi1 ordercontainer:1.0docker run -d -p 8061:80 --name orderapi2 ordercontainer:1.0docker run -d -p 8062:80 --name orderapi3 ordercontainer:1.0 同样的我们的product服务也运行三个实例端口从50到52 docker run -d -p 8050:80 --name productapi1 productcontainer:1.0docker run -d -p 8051:80 --name productapi2 productcontainer:1.0docker run -d -p 8052:80 --name productapi3 productcontainer:1.0 那么也稍稍的改动一下我们的Client代码吧 [ApiController] [Route(api/[controller]/[action])] public class ClientController:ControllerBase {private readonly ILoggerClientController _logger;private readonly IHttpClientFactory _httpClientFactory;public ClientController(IHttpClientFactory httpClientFactory, ILoggerClientController logger){_httpClientFactory httpClientFactory;_logger logger;}public async Taskstring GetProduct(){var client _httpClientFactory.CreateClient(local); //string[] arr_product_url { http://localhost:8050/product, http://localhost:8051/product, http://localhost:8052/product } ;var product_result await client.GetStringAsync(arr_product_url[new Random().Next(0, 3)]);return $产品服务{product_result};}public async Taskstring GetOrder() {var client _httpClientFactory.CreateClient(local); //string[] arr_order_url { http://localhost:8060/order, http://localhost:8061/order, http://localhost:8062/order };var order_result await client.GetStringAsync(arr_order_url[new Random().Next(0, 3)]);return $订单服务{order_result};} } 当然拿到这些服务地址可以自己做复杂的负载均衡策略比如轮询随机权重等等 都行甚至在中间弄个nginx也可以。这些不是重点所以就简单做一个随机吧每次请求来了随便访问一个服务实例。 我们尝试多次调用该接口发现我们已经实现了随机的效果。 但是这种做法依然不安全如果随机访问到的实例刚好挂掉那么业务依然会出现问题简单处理思路是什么呢 1.如果某个地址请求失败了那么换一个地址接着执行。 2.如果某个地址的请求连续多次失败了那么就移除这个地址下次就不会访问到它了。 业务系统实现以上逻辑基本上风险就很低了也算是大大增加了系统可用性了。 然而 实际应用中上层的业务系统可能非常多为了保证可用性每个业务系统都去考虑服务实例挂没挂掉吗 而且实际应用中服务实例的数量或者地址大多是不固定的例如双十一来了流量大了增加了一堆服务实例这时候每个业务系统再去配置文件里配置一下这些地址吗双十一过了又去把配置删掉吗显然是不现实的服务必须要做到可灵活伸缩。 这时候就需要引入一个问题服务注册与发现。
http://www.pierceye.com/news/372455/

相关文章:

  • 定制网站建设服务公司摄影设计师招聘
  • 地图 添加到网站观点网站
  • 给分管领导网站建设情况汇报怎么写企业网站的发展历史
  • 佛山营销网站建设费用app制作器下载软件
  • 如何将优酷视频上传到自己网站万能网
  • 域名销售网站wordpress 数据库配置文件
  • 广州营销型网站建设怎么样做网站必须要认证吗
  • 网站开发主要内容免费商城平台
  • 青岛建站方案海兴县网站建设公司
  • 网站文案框架兰州网页制作公司网站
  • 专业网站有哪些平台wordpress那个版本
  • 网站建设按钮详情页设计图
  • 杭州公司注册代理中介深圳关键词优化软件
  • 乐清网站制作公司电话免费做初中试卷的网站
  • 注册一个网站的流程反向代理服务器做wordpress外网
  • 沁阳网站建设tomcat建网站
  • 品牌网站建设公司推荐网站建设公司3lue
  • 装修公司网站模版徐州品牌网站建设
  • 医疗网站建设计划书一级消防工程师考试科目
  • 信誉好的网站建设公司网站关停公告怎么做
  • 画图在什么网站上做兼职广告词
  • 昆明购物网站建设企业网络设计方案预算
  • 浙江省建设工程质监站网站什么是营销型网站建设
  • 做网站需要云数据库吗企业做网页还是网站
  • wordpress手机网站插件wordpress编辑器添加按钮弹出窗口
  • 网站建设验收单格式建筑工具网站
  • 比较简洁大方的网站伊春住房和城乡建设网站
  • 电商网站开发prd免费个人网页模板
  • 西安 网站开发 招聘响应式网站代理
  • 浙江建设干部学校网站免费wordpress搭建