关于【微服务】,你必须了解这些
微服务Micro service ,就是将单体应用拆分成多个高内聚低耦合的小型服务,每个小型服务运行在独立的进程,当用户请求API Gateway被路由到下游服务,而服务之间采用轻量级通信机制,独立部署。
文章中去掉了那些细枝末节,比如谁谁在哪年提出的呀等等类似的问题,专注于多个微服务之间的通信,微服务与上层的通信机制。希望会对你有所帮助。
微服务很火,火到人人都在讨论,就好像谁不知道微服务谁就算不上一个合格的程序员一样,而关于微服务的帖子真的是随便一搜一大堆(大多却很相似),陆陆续续的看了大概一周的微服务+公司的CloudSop总线路由机制的资料,笔者整合了一些比较重要的点,加上一些自己的理解,为小伙伴们总结了一下。
Two pizza principle
如果你问我,微服务到底哪里好?因为他符合著名的两个披萨原则。
这个由亚马逊 CEO JeffBezos 提出的法则,他认为事实并非公司开会参与人数越多越好,他认为人数越多的会议将不利于决策的形成,而是会导致与会人员的人云亦云,称之为两个披萨原则。
JeffBezos把披萨的数量当做衡量团队大小的标准,而在开发过程中亦然,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了。 符合这一法则,微服务变得如此火热也就不那么奇怪了。
为什么使用微服务?
- 单体架构所有功能耦合在一起,开发效率低
- SOA架构的总线模式与某种技术耦合过高
- 轻量级运行时技术的出现(node.js, WAS Liberty等)
- 新的轻量级协议(RESTful API接口, 轻量级消息机制)
- 新的可替代数据持久化模型:如NoSQL, MapReduce, BASE, CQRS等
WebUI如何访问这些微服务呢?
在传统的应用之中,我们大多数采取WebUI与后台服务直接进行通信的形式。但现在越来越多的情况下,前台和微服务之间,比如:在淘宝的产品展示界面上,可能会有上百个微服务。虽然允许Web前台向后台同时发送多个请求,但是如果与直接进行通信,那么可能造成前台的代码冗余。并且多个服务可能会经常面临重构,如果前台后台直接进行通信,也不利于后台服务代码的重构。
那么针对这一问题,我们解决的方式是:使用API GateWay作代理。如下图所示:
API Gateway本质上是一个服务器,也就是我们进入后台服务的唯一节点,我们可以理解为一个过渡的中转站。API Gateway封装内部系统的架构,并且提供API给各个WebUI。它负责请求转发、合成和协议转换。这样,所有来自WebUI的请求都要先经过API Gateway,然后路由这些请求到对应的微服务。
API Gateway将经常通过调用多个微服务来处理一个请求以及聚合多个服务的结果。它可以在web协议与内部使用的非Web友好型协议间进行转换,如HTTP协议、WebSocket协议。 反之,API Gateway会暴露一个粗粒度【1】的API给WebUI,API GateWay会调用多个服务,来处理这一个请求,并返回结果給Web UI显示。
参考资料和推荐阅读:
http://dockone.io/article/482https://www.cnblogs.com/wintersun/p/6219259.html
微服务之间如何通信呢?
因为所有的微服务都是独立的Java进程跑在独立的虚拟机上,所以服务间的通行就是IPC(inter process communication 进程间通信),现在基本最通用的有两种方式:
- REST API----Spring Boot)
- RPC----(Dubbo)
无论是REST API 还是RPC,其实都是我们上文讲的API GateWay的一个实现。相比较来讲,REST是基于Http协议的,而RPC(远程过程调用协议)则是一种通过网络从远程计算机程序上请求服务的协议,是基于TCP/IP协议的。HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC可能会更胜一筹。
微服务的优缺点:
优点:
- 由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护。
- 微服务架构方式是松耦合的,可以提供更高的灵活性。
- 每个微服务可由不同团队独立开发,互不影响,加快推出市场的速度。
- 技术栈不受限:比如订单微服务和电影微服务原来都是用Java写的,现在我们想把电影微服务改成Nodejs技术,这是完全可以的,而且由于所关注的只是电影的逻辑而已,因此技术更换的成本也就会少很多。
缺点:
- 运维要求高:
对于单体架构来讲,我们只需要维护好这一个项目就可以了,但是对于微服务架构来讲,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为我们无法一步一步通过debug的方式来跟踪,这就对运维人员提出了很高的要求。 - 接口调整成本高:
比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。 - duplicated code:
对于单体架构来讲,如果某段业务被多个模块所共同使用,我们便可以抽象成一个工具类,被所有模块直接调用,但是微服务却无法这样做,因为这个微服务的工具类是不能被其它微服务所直接调用的,从而我们便不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。
以微服务的概念来理解CloudSop平台的总线路由机制
CloudSOP是支撑ICT融合管理的Web云架构平台 。我们主要关注的是CloudSop总线服务的路由机制。有几个主要的概念:ER、IR、BER,这三个概念可以让我们刚好结合着微服务中的API GateWay来理解。
接下来,我们从最简单,最基本的机制,结合上文的API GateWay来深入了解ER、IR、BER的概念。如图所示:
首先来看ER,ER(ERService)是外部接入路由,ER负责将外部请求代理到后端服务。这也就是对应着刚刚讲解的APIGateWay,ER的作用就是将WebUI的多个请求通过ER路由到我们对应的的IR。
再来看IR(BusService) ,用于后端服务间路由转发。在总线路由机制中,IR负责将ER分发过来的请求,继续进行转发给对应的app(后端服务)。IR相当于内部路由,而ER相当于外部路由。
此外,由于不同的App可能部署在不同的服务器上,他们之间构成一个域,由一个,或者多个IR来分发路由,所以当我们需要跨域进行转发请求的时候,就要用的我们的BER啦!
BER:后端服务间路由服务,负责在跨region(域)等场景下的路由。
关于CloudSop总线服务的小总结:
ER,IR,BER也就是实现微服务中的API GateWay的功能,在底层,他们就是一个个ngnix【2】服务,由于他们对外开放端口和安全配置不一样,所以对应的功能也就有些差别,但是通过三者的配合,才可以实现WebUI的请求转发到后台具体的APP服务上。
微服务的开发框架:
- Spring Cloud:http://projects.spring.io/spring-cloud(现在非常流行的微服务架构)
- Dubbo: https://dubbo.incubator.apache.org/
- Dropwizard: http://www.dropwizard.io(关注单个微服务的开发)
附:
文章中出现的一些大家可能不太理解的名词,为小伙伴们在这里进行总结。
什么是粗粒度?
说白了粗粒度就是大局上看,细粒度就是更关注于细节。具体的话,个人理解就是,粗粒度和细粒度的区别主要是出于重用的目的,比如说类的设计,为尽可能重用,所以采用细粒度的设计模式,将一个复杂的类(这里就是粗粒度)拆分成高度重用的职责清晰的类(这就是细粒度)。而对于数据库的设计,原责:尽量减少表的数量与表与表之间的连接,能够设计成一个表的情况就不需要细分,所以可考虑使用粗粒度的设计方式。
什么是nginx?
Nginx 是俄罗斯人编写的十分轻量级的 Http 服务器,使用C语言开发,是一个高性能的Http和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载均衡的服务器。
什么是松耦合?
耦合就是指软件组件之间的依赖程度。简单的理解就是:一个服务没有另一个服务就没办法运行,那么就是紧耦合。反之,这个服务并不依赖于其他服务而存在,则是松耦合。
如小伙伴们有自己的独特见解,也可以在下方评论留言哈~
关于【微服务】,你必须了解这些相关推荐
- 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗
在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...
- 使用feign调用注解在eureka上的微服务,简单学会微服务
使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...
- Spring cloud 微服务docker容器化最佳实践
Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...
- IDEA集成Docker插件实现一键自动打包部署微服务项目
一. 前言 大家在自己玩微服务项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,实现真正所谓的一劳永逸. 二. 配置服务器 1. ...
- etcd 笔记(09)— 基于 etcd 实现微服务的注册与发现
1. 服务注册与发现基本概念 在单体应用向微服务架构演进的过程中,原本的巨石型应用会按照业务需求被拆分成多个微服务,每个服务提供特定的功能,也可能依赖于其他的微服务.此时,每个微服务实例都可以动态部署 ...
- 微服务架构必备的几点知识
微服务架构 网关集群:数据的聚合.实现对接入客户端的身份认证.防报文重放与防数据篡改.功能调用的业务鉴权.响应数据的脱敏.流量与并发控制等 业务集群:一般情况下移动端访问和浏览器访问的网关需要隔离,防 ...
- 【微服务架构】SpringCloud之断路器(hystrix)
说在前面 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用 ...
- 【微服务架构】SpringCloud之路由网关(zuul)
什么是zuul zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架.Zu ...
- 【微服务架构】SpringCloud使用Ribbon实现负载均衡
说在前面 软负载均衡的实现方式有两种,分别是服务端的负载均衡和客户端的负载均衡 服务端负载均衡:当浏览器向后台发出请求的时候,会首先向反向代理服务器发送请求,反向代理服务器会根据客户端部署的ip:po ...
- .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...
最新文章
- 编程模式 之美 -- 抽象工厂模式
- Ubuntu/Fedora 编译内核教程
- 最新性能测试:Kafka、Pulsar 和 Pravega 哪个最强?
- 在尝试重新安装一个服务时遇到这样的错误:指定服务已标记为删除
- 当我们谈论深度学习时,我们在谈论什么?
- 微信登录OpenId和UnionId区别
- 阿里云 ECS迁移数据至腾讯云云服务器
- 导航和路径规划-论文心得
- mac版 IGV(版本2.12.3)安装
- 2016年安防上市公司年报披露情况
- 世界排名前100的古典音乐榜单
- 4.jetson更换python版本
- UDS 关于故障码的学习笔记(0x19和0x14服务)
- Appium环境搭建和检测
- FC5 安装 Xine
- RENIX软件RTSM基本操作_Linux——网络测试仪实操
- 使用SCRAPY框架获取网易云排行榜歌单
- Windos下用setx.exe命令行模式下永久设置系统环境变量(转)
- EtherCAT学习笔记:周期性过程数据通信
- psm倾向得分匹配法举例_一文了解什么是倾向得分匹配PSM?
热门文章
- Git笔记(37) 替换
- 深度学习笔记(5) 深层神经网络
- 新松机器人产业小镇_啃下“硬骨头”!“青岛造”机器人挺进新加坡港
- oracle获取 小时数,Oracle函数 通过秒数或分钟数获取时间段
- dw2019连接mysql数据库_Dreamweaver 8.0连接Mysql数据库全攻略
- 浏览器安全检查己通过_Edge浏览器(Chromium)——从XSS到接管网页
- react入门(1)之阮一峰react教程
- Tomcat系列(6)——Tomcat处理一个HTTP请求的过程
- 【综合】JS跨域方案JSONP与CORS跨域
- 02Framelayout:帧布局