从技术角度讨论微服务

本文希望从技术角度来探讨下微服务,因此,不会过多地谈及如何根据业务进行微服务划分,更多是介绍微服务的相关技术,微服务的业务划分方法可参考“领域驱动设计“相关方法论。

 

微服务的两个程度

一、服务化

  复杂的单体架构会有以下的挑战:

  (1)项目启动初期,需要寻找一个能尽量涵盖所有需求的开发语言,技术选型难度高;

  (2)工程庞大,组件、中间件繁多,编译时间长;开发环境复杂,需要安装大量的辅助软件,环境准备时间长;

  (3)团队无效沟通多,沟通成本高;

  (4)部署环境依赖大,某个组件的问题可能导致整个系统无法运行;

  (5)新功能添加或者bug修复的时候,会影响现有功能,引发新的(未知)问题,添加单元测试难度大;

  (6)版本回滚颗粒度大,灵活性差。

 

  以上几点都是实际项目中遇到的问题,如果你也遇到了同样的问题,那么服务化是较好的解决方案。

  服务化解耦后:

  (1)微服务可以根据自身业务特征选择合适的开发语言或数据库;

  (2)微服务的开发者只需要安装该服务相关的辅助软件;

  (3)沟通多集中在微服务团队中,与周边(或公共)微服务有交集时才产生相应的沟通;

  (4)部署环境依赖小,某个微服务部署失败仅影响该微服务(或周边几个微服务);

  (5)功能调整,如果接口没有调整,基本不会影响其它微服务,添加单元测试、接口测试难度低,自动化(回归)测试覆盖率高;

  (6)版本回归最小单位为某个微服务,颗粒度小,可更好地实现蓝绿部署、A/B测试、灰度(金丝雀)发布。

 

二、容器化

  容器(docker)具有轻量、环境依赖低、启动速度快等特点;

  虚拟化技术(openstack)负责IaaS层(存储、计算、网络)资源的调度;

  容器治理平台(Kubernetes、docker swarm)配合资源监控对容器进行灵活调度;

  以上3种技术极大地提高了微服务的横向(弹性)伸缩以及高可用的能力,使微服务具备更好的高并发处理能力。

  配合DevOps,CI/CD等工具及技术提升了团队快速响应、持续交付的能力。

 

  我认为,团队应该基于产品或项目实际情况选择合适的微服务程度。

 

微服务基础技术架构

   

 

  我认为,当前使用前后端分离的开发模式还是十分有好处的,关于前后端分离的描述,可参考我之前的《浅谈开发模式及架构发展》。

  Web A/B/C/...是几个纯前端项目,可以根据实际情况在不同项目中使用Angularjs、Vuejs或Reactjs等框架进行开发;

  API X/Y/Z/...是几个API项目,供Web或者App调用,可以根据实际情况使用.Net Core、Java或python等语言进行开发;

  也可以根据带宽或性能需要,让Web或API启动多份示例。

 

  基本交互:

  浏览器经过网关从服务端获取网站的html及js(橙色箭头);

  Web通过url或ajax经过网关访问服务端API,App通过类Http Client方式经过网关访问服务端API(灰色箭头);

  API X/Y/Z/...注册到服务中心(蓝色箭头);

  Web A/B/C/...、API X/Y/Z/...从配置中心读取各自的配置(紫色箭头);

  API X通过服务中心调用API Z(绿色箭头)。

 

  因此,微服务的三个基础组成部分分别是服务注册发现,配置管理以及网关。

 

服务注册发现

 一、最简单的服务注册发现

  

  我认为最简单的服务注册发现是直接通过IP端口进行访问,这种方式适用于单个实例的服务,但如果API Y是多个实例,那么需要借助类似虚拟IP(VIP)等技术。

 

 二、基于中间件的服务注册发现

  

  API Y实例1/2/.../n启动时,会把自己的信息注册到服务中心(自上报);API X需要调用API Y,会先从服务中心中获取API Y服务实例的IP端口列表;然后根据特定的策略(随机,网络情况,权重等)筛选出一个实例进行调用,负载均衡是在客户端(调用方)实现的。

  这种方式的典型代表是Spring Cloud Eureka,如果服务中心down掉了,那么会影响整个系统,因此,要保证服务中心的高可用;另外,需要有特定的jdk/sdk和服务中心进行交互,如Java的FeignClient(集成了ribbon实现服务的负载均衡),steeltoe的DiscoveryHttpClientHandler(随机选择实现服务的负载均衡),有一定的语言侵入性。

  

三、基于容器治理平台的服务注册发现

  

   API Y实例1/2/.../n部署启动时,治理平台会给它们分配IP端口,并记录在服务中心;API X需要调用API Y,会基于dns,通过API Y的服务名或集群 IP(Cluster IP,类似于Virtual IP)加端口进行访问。负载均衡由治理平台负责,是在服务端(平台)实现的。

   这种方式的典型代表是docker swarm以及Kubernetes,服务注册发现的高可用由平台保证,因为基于dns,普通的http客户端就可以进行Api访问,如java的restTemplate或C#的HttpClient,无语言侵入性,但负载均衡的灵活性比中间件的方式稍微低一些。

 

配置管理

 一、最简单的配置管理

  最简单的配置管理就是平时常用的配置管理,如java的application.properties、.net的web.config、.net core的appsettings.json等,基本是和应用程序一起,能够兼容多个环境(开发、测试、生产)。

  但当我们的程序需要启用多份的时候,这种简单的配置管理方式遇到了挑战,配置的更新需要手动更新各个实例的配置文件,繁琐且容易出错(遗漏、修改错误或环境依赖)。

  这也是微服务中面临的一个主要挑战。

 

二、基于中间件的配置管理

   

 

  这种方式的典型代表是Spring Cloud Config Server。

  API X、Y...会通过Url访问配置中心,通过心跳(2s)来确认配置中心的健康以及检测配置内容的更新。

  其中,application.yaml用于保存各个微服务的公共配置,{服务名}.yaml用于保存微服务的私有配置。

  和Eureka一样,使用者需要自己保证Config Server的高可用,否则,配置中心down掉的话,整个系统的配置信息就会乱套;另外,也需要有特定的jdk/sdk和配置中心进行交互;配置文件的格式基本也限制于yaml格式。

 

三、基于容器治理平台的配置管理

   

  这种方式的典型代表是Kubernetes ConfigMap。

  部署、升级、增加API X、Y...实例时,Kubernetes会按照设置,把对应的配置文件放置到容器(docker)指定的位置,也可以是环境变量。

  配置中心的高可用由治理平台保证,微服务不需要使用特定的jdk/sdk和配置中心交互,只需要解析本地路径的某些文件,文件格式可以根据需要选择(json,xml,yaml,properties)。

  微服务公共配置与私有配置也可以实现,但需要语言支持,比如.net core,详细的可以参考我之前的文章《你可能不知道的.Net Core Configuration》。

 

网关

  

  网关作为微服务的统一出口,一般需要完成以下任务:反向代理,跨域处理,负载均衡,流量控制,缓存,日志,公共功能(如认证)等,常用的网关中间件有Nginx,Spring Cloud Zuul,Kong,Ocelot等。

  或许有人会问,像公共功能(如认证)这些,在过滤器(filter)里做就好了啊,为什么要在网关做,没看出什么优势。I think it is a good call.

  确实,像认证这些功能的确可以在过滤器里做,但是,如果过滤器需要升级,那么每个微服务都要进行升级;另外一种情况是,如果微服务是使用不同语言编写的,那么还需要提供多个版本的filter;更为恶劣的可能是该语言不支持filter,或者像单点登录这些公共模块没有提供该语言的jdk或sdk;还有一种比较特殊的情况是,可能在不同的环境系统需要有不同的认证机制,如对接第三方的认证系统。使用网关就能比较好的解决以上问题。

 

下一代微服务

  既然可以通过部署一个网关,让所有请求都经过它来实现一些公共的功能,那么有没有可能使微服务的请求经过一个特定的“层”,来实现一些特定的功能(如调用链、熔断,服务调用认证,请求限制等)呢?答案是肯定的。

  我认为Kubernetes其中一个强大的设计是,它的最小单位是pod,而不是容器(container);一个pod里面可以有多个容器,而且它们可以共享网络,共享存储。

  可以通过在pod里面部署一个业务容器,同时也部署一个小型的sidecar容器,让请求到达业务容器之前,先经过sidecar容器(起到了filter的作用),在sidecar容器中实现调用链、熔断,服务调用认证,请求限制等功能,这样就可以通过基于部署的方式解决语言限制的问题。

  目前可以选择Istio或Linkerd来实现上述效果。

 

简单总结

  我认为,从架构的层面来看微服务架构,应该是这样的:

  扩展性:降低复杂系统的耦合度、沟通成本以及系统复杂度,需求快速响应;

  伸缩性:可以通过增加资源的方式来快速应对海量并发(仅仅是并发层面,大数据量还是需要根据业务进行分片或分割);

  稳定性:微服务治理平台,PaaS平台保证了系统的高可用性,可以降低业务的中断时间;

  安全性:和传统架构的要求差别不大,但是由于网关和网格(Service Mesh)的存在,使得安全处理,APM等的实现更加简单。

 

  另外,我认为微服务可以通过部署的方式来实现功能或模块的复用,一定程度上代替了过往通过jdk/sdk来实现共用的方式;使得开发更加灵活,也使得开发可以更加关注于业务,而非各种边边角角的公共(轮子)功能。

相关文章:

  • 微服务的概念——《微服务设计》读书笔记

  • 微服务架构师的职责——《微服务设计读书笔记》

  • 建模:确定服务的边界——《微服务设计》读书笔记

  • 微服务集成——《微服务设计》读书笔记

  • 服务的协作:服务间的消息传递——《微服务设计》读书笔记

  • 拆分:分解单块系统——《微服务设计》读书笔记

  • 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

  • 测试——《微服务设计》读书笔记

  • 监控——《微服务设计》读书笔记

  • 安全——《微服务设计》读书笔记

  • 康威定律和系统设计——《微服务设计》读书笔记

  • 规模化微服务——《微服务设计》读书笔记

  • Net分布式系统之:微服务架构

  • 安全事大!来看基于STS和JWT的微服务身份认证

  • 微服务实践(绞杀)

  • 一文读懂企业如何落地微服务,循序渐进5步走

  • 使用istio治理微服务入门

原文:https://www.cnblogs.com/Erik_Xu/p/8495939.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj6344-[NOIP2019模拟2019.9.7]Huge Counting【组合数,状压dp】

正题 题目大意 定义函数f(x)(xf(x)(xf(x)(x为一个序列))) 若任意一个xi1x_i1xi​1那么有f(x)1f(x)1f(x)1 若有一个xi0x_i0xi​0那么有f(x)0f(x)0f(x)0 其他的,有f(x)(∑j1nf(x1...,xj−1,...xn))%2f(x)(\sum_{j1}^nf(x_{1}...,x_j-1,...x_n))\% 2f(x)(j1∑n​f(x1​…

拥抱.NET Core系列:MemoryCache 缓存域

MSCache项目MSCache 目前最新的正式版是 2.0.0,预览版是2.1.0,会与 .NETCore 2.1 一起发布。本篇用了2.0.0版本开源在 GitHub 上,仓库地址是:https://github.com/aspnet/CachingNuGet地址为:https://www.nuget.org/pac…

牛客小白月赛17-记录(附题解)

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1085#question 成绩 总结 除了那道积分数学其他还好 后面没有FFF题的题解 T1:小sun的假期T1:小sun的假期T1:小sun的假期 题目大意 长度为nnn的序列,mmm个区间,求最大的没有被任何区间覆盖的区间…

安全、高效的MySQL DDL解决方案

MySQL作为目前应用最广泛的开源关系型数据库,是许多网站、应用和商业产品的主要数据存储。在生产环境,线上数据库常常面临着持续的、不断变化的表结构修改(DDL),如增加、更改、删除字段和索引等等。其中一些DDL操作在M…

DNS总结

一、DNS (1)简介 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 DNS 协议也是…

谈谈在.NET Core中使用Redis和Memcached的序列化问题

前言在使用分布式缓存的时候,都不可避免的要做这样一步操作,将数据序列化后再存储到缓存中去。序列化这一操作,或许是显式的,或许是隐式的,这个取决于使用的package是否有帮我们做这样一件事。本文会拿在.NET Core环境…

牛客练习赛52-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1084#question 成绩 T1:T1:T1:数数 题目大意 给出nnn,求∑i1n∑j1n(i∗j)\sum_{i1}^n \sum_{j1}^n (i*j)i1∑n​j1∑n​(i∗j) 和 ∏i1n∏j1n(i∗j)\prod_{i1}^n\prod_{j1}^n(i*j)i1∏n​j1∏n​(i∗j) 解题…

Windows Developer Day - Windows AI Platform

本次 Windows Developer Day,最值得期待的莫过于 Windows AI Platform 了,可以说是千呼万唤始出来。观看直播的开发者们,留言最多的也是 Windows AI Platform。下面结合微软提供的展示过程,文档和 Git Sample 来详细分析一下。基础…

EF Core:一统SQL和NoSQL数据库

推出EF Core的初衷之一,就是开发出一种可在很少甚至不更改代码的情况下使用SQL和NoSQL数据库的模型。Microsoft正向此目标迈出第一步,发布了用于Azure Cosmos DB的实验性EF提供程序(provider)。据EF 2.1路线图介绍:Cos…

Java 并发总结——进程与线程

一、进程与线程 (1)线程与进程 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程实体由程序段, 数据段 PCB(进程控制块)组成。 线程可以看做轻量级进程,…

.NET Core使用skiasharp文字头像生成方案(基于docker发布)

一、问题背景目前.NET Core下面针对于图像处理的库微软并没有集成,在.NET FrameWork下我们已经习惯使用System.Drawing类库做简单的图像处理,到了.NET Core下一脸懵逼的我,只能百度谷歌看看有没啥解决方案,好在网上资料也多&#…

jzoj6375-华灵「蝶妄想」【结论题】

正题 题目大意 n∗mn*mn∗m填(((或者)))。求一个方案使得最多的行和列匹配。 解题思路 我们先考虑nnn或mmm为奇数,那么显然奇数的肯定不必配,那么就只需要考虑行或列即可。 若nnn和mmm都为偶数时 我们发现在边边的行列不可能都匹配上,那就…

C# - Span 全面介绍:探索 .NET 新增的重要组成部分

假设要公开特殊化排序例程,以就地对内存数据执行操作。可能要公开需要使用数组的方法,并提供对相应 T[] 执行操作的实现。如果方法的调用方有数组,且希望对整个数组进行排序,这样做就非常合适。但如果调用方只想对部分数组进行排序…

C#中DateTime的缺陷与代替品DateTimeOffset

C#中的DateTime在逻辑上有个非常严重的缺陷:> var d DateTime.Now;> var d2 d.ToUniversalTime();> d d2false> d.Equals(d2);false在C#交互模式中输入以上代码,可以发现尽管一个是本地时间(d),一个是U…

重磅消息-Service Fabric 正式开源

微软的Azure Service Fabric的官方博客在2017.3.24日发布了一篇博客 Service Fabric .NET SDK goes open source ,介绍了社区呼声最高的Service Fabric开源的情况以及当前的情况,当时开源了Service Fabric的.NET SDK部分,社区一直在期盼着Ser…

.NET Core 配置Configuration杂谈

前言.NET Core 在配置文件的操作上相对于.NET Framework做了不少改变,今天来聊一聊。关于Configuration的Package都是以Microsoft.Extensions.Configuration开头的支持多种方式的配置,包括内存、Json文件、XML文件等等,今天我们主要用Json格式…

秘密:从程序员到领导者的微妙之处

读到一篇关于程序员、领导力和领导者的好文章,翻译过来分享下。借用一句文中的话:“好吧,我只是个程序员,为什么需要领导?” ,读完你就知道了。做一个优秀的领导者可能不是大部分程序员会立即认同的东西。许…

老衣的微服务实践简要指引2017版

这是老衣在2017年5月份总结的,适用于中小团队跨平台微服务开发的实践指引(简化版)。若有有不当之处,欢迎指点更正因本文涉及到大量第三方库或工具,详细学习和了解需要参考相关官方文档。若您在使用Mac电脑,…

Entity Framework Core 之数据库迁移

前言最近打算用.NET Core写一份开源的简易CMS系统,来练练手所以又去深入研究了一下Entity Framework Core 发现其实有些细节园子里还是很少讲到.特意整理了几个细节.正文1.数据库迁移先了解一下什么是"数据库迁移",它提供了一种方法,可以逐步将Code First…

随机挑战#4记录

正题 van♂van♂van♂成记录 题目 P2052−[NOI2011]P2052-[NOI2011]P2052−[NOI2011]道路修建【树】 博客链接:https://blog.csdn.net/Mr_wuyongcong/article/details/102249021 P2796−FacerP2796-FacerP2796−Facer的程序【dpdpdp】 博客链接:https://blog.csdn.net/Mr_wuy…