MicroservicesGuide
Inshort,themicroservicearchitecturalstyleisanapproachtodevelopingasingleapplicationasasuiteofsmallservices,eachrunninginitsownprocessandcommunicatingwithlightweightmechanisms,,whichmaybewrittenindifferentprogramminglanguagesandusedifferentdatastoragetechnologies.
--JamesLewisandMartinFowler(2014)
简言之,微服务体系结构风格是一种将单个应用程序开发为一套小型服务的方法,每个服务都在自己的流程中运行,并与轻量级机制(通常是HTTP资源API)通信。这些服务是围绕业务能力构建的,可通过完全自动化的部署机制独立部署。对这些服务的集中管理是最低限度的,这些服务可以用不同的编程语言编写,并使用不同的数据存储技术。
--詹姆斯·刘易斯和马丁·福勒(2014)
架构演进Dubbo文档
网站应用的演进
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。好的架构并不是一开始就设计出来的,而是不断演进过来的
单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
垂直应用架构当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
分布式服务架构当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
流动计算架构当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
SOA服务架构和微服务架构推荐架构SpringCloud官网
SpringCloudprovidestoolsfordeveloperstoquicklybuildsomeofthecommonpatternsindistributedsystems(,servicediscovery,circuitbreakers,intelligentrouting,micro-proxy,controlbus,one-timetokens,globallocks,leadershipelection,distributedsessions,clusterstate).Coordinationofdistributedsystemsleadstoboilerplatepatterns,andusingSpringClouddeveloperscan,includingthedeveloper’sownlaptop,baremetaldatacentres,andmanagedplatformssuchasCloudFoundry.
SpringCloud为开发人员提供工具,用于快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)。分布式系统的协调导致锅炉板模式,使用Spring云开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云铸造等托管平台。
SpringCloudAlibaba官网
SpringCloudAlibaons,makingiteasyforyoutodevelopyourapplicationsusingSpringCloud.
WithSpringCloudAlibaba,youonlyneedtoaddsomeannotationsandasmallamountofconfigurationstoconnectSpringCloudapplicationstothedistributedsolutionsofAlibaba,andbuildadistributedapplicationsystemwithAlibabamiddleware.
阿里云为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用SpringCloud开发应用程序。
通过阿里云Spring云,您只需添加一些注释和少量配置,即可将Spring云应用连接到阿里云的分布式解决方案,并使用阿里云中间件构建分布式应用系统。
Sentinel:流量控制和服务降级:阿里巴巴Sentinel流量控制、断路和系统自适应保护
Nacosregistrationanddiscovery:服务注册和发现:可以向阿里巴巴Nacos注册实例,客户端可以使用spring管理的bean发现实例。支持Ribbon,通过SpringCloudNetflix的客户端负载均衡器
Nacosconfig:分布式配置:使用阿里巴巴Nacos作为数据存储
Seata:一种高性能、易于使用的分布式事务解决方案,适用于微服务架构。解决微服务中的分布式事务问题
Dubbo:ApacheDubbo是一款高性能、轻量级的开源服务框架,提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
SpringCloudStream:事件驱动,使用RocketMQBinder构建高度可伸缩的事件驱动微服务
SpringCloudBus:消息总线:使用SpringCloudBus连接分布式系统的节点
SpringCloudNetflixRibbon:客户端负载均衡器:Nacos客户端默认集成ribbon
AppacheSkyWalking:分布式系统的应用程序性能监控工具,特别为微服务,云本地和基于容器(Docker,Kubernetes,Mesos)架构设计。
基于SpringCloudAlibaba推荐的微服务生态架构,基于分层架构实现。
接入层:最外层为LVS+Keepalived,可承受几十万级高并发流量洪峰,然后再通过内层的nginx集群将客户端请求通过负载均衡策略转发至基于JAVA后端技术栈的SpringCloudGateway集群;
业务中台层:SpringCloudGateway微服务通过Nacos获取路由配置信息和路由后端微服务提供者的发现,通过OAuth2做统一登录授权,并集成整合Sentinel针对请求做限流、熔断、降低,基于dubbo协议的高性能RPC进行微服务调用或者服务聚合调用,而后端微服务之间调用也是采用dubbo协议的rpc,对于需要分布式事务服务端则通过Seata实现。
技术中台层:数据存储层包括内存、数据库、全文检索搜索引擎存储层;基础服务层提供分布式系统常见基础组件功能;日志采集层采用ELK
系统监控层:分布式链路追踪、基于容器化的监控和告警
Maven简易整合工程入门案例shopping-demo源码地址
功能简介本示例主要对微服务使用Nacos实现配置中心读取、服务注册和服务发现,微服务网关实现路由策略并整合sentinel实现限流,微服务之间使用Dubbo高性能RPC进行调用。
本案例主要包含一下几个demo模块
commons:公共服务模块,存放公共pojo实体类和微服务接口模块,比如Dubbo服务提供者接口定义、基于OpenFeign远程调用服务提供者接口定义等,公共模块pom可以配置一些公共引用依赖如spring-cloud-starter-alibaba-nacos-config和spring-cloud-starter-alibaba-nacos-discovery等,这样其他微服务只需依赖公共模块即可
gateway:微服务入口网关模块,负责微服务路由、授权认证、微服务聚合等功能处理
users:用户模块,提供获取用户接口
good:商品模块,提供商品接口,需要调用用户接口
核心源码和配置工程父pom文件主要包含SpringBoot、SpringCloud、SpringCloudAlibaba的父依赖
?xmlversion="1.0"encoding="UTF-8"?projectxmlns=""xmlns:xsi=""xsi:schemaLocation=""//groupIdartifactIdshopping/artifactIdpackagingpom///groupIdartifactIdspring-boot-starter-parent//version/parentmodulesmoduleshopping_commons/modulemoduleshopping_goods/modulemoduleshopping_users/modulemoduleshopping_gateway/module//////groupIdartifactIdspring-cloud-depencies/artifactIdversion${}/versiontypepom/typescopeimport/scope//groupIdartifactIdspring-cloud-alibaba-depencies/artifactIdversion${}/versiontypepom/typescopeimport/scope/depency/depencies/depencyManagement/project微服务yml配置文件,微服务的配置都放在Nacos配置中心,每个微服务本地配置文件只需配置服务名称、激活的环境以及配置中心地址、配置文件扩展名、命名空间和组即可。下面为网关配置文件,其他模块配置文件与此类似
spring:profiles:active:devcloud:nacos:config:server-addr:localhost:8848file-extension:yamlnamespace:54c53c3a-6008-4ecc-90fe-2ffcae64b95bgroup:shoppingapplication:name:gateway
commons实体类和暴露获取用户接口服务
;;publicclassUserimplementsSerializable{privateStringname;privateIntegerage;publicUser(Stringname,Integerage){=name;=age;}};;publicinterfaceUserService{UsergetUser(StringuserId);}users微服务获取用户接口实现
;;;@ServicepublicclassUserServiceImplimplementsUserService{@OverridepublicUsergetUser(StringuserId){("userId:"+userId);returnnewUser("zhangsan",16);}}userscontroller实现类,在这里也提供http协议调用方式
;;;@RestControllerpublicclassUserController{@RequestMapping("/users/1")publicStringgetUser(){return"hellousers";}}goodscontroller
;;;;;;@RestControllerpublicclassGoodsController{@ReferenceUserServiceuserService;@RequestMapping("/goods/1")publicStringgetGoods(){return"hellogoods";}@RequestMapping("/goods/user")publicStringgetUserInfo(){Useruser=("a1001");();}}Nacos配置中心启动本地Nacosserver端,访问本地nacos管理界面http://localhost:8848/nacos,默认端口是8848,默认用户密码nacos/nacos,在dev命名空间下有网关、用户、商品微服务配置文件,都使用shoopping组
server:port:8081spring:profiles:active:devcloud:nacos:discovery:server-addr:192.168.3.3:8848namespace:54c53c3a-6008-4ecc-90fe-2ffcae64b95bgroup:shoppingsentinel:enabled:truetransport:dashboard:localhost:8888port:8719application:name:users
server:port:8082spring:profiles:active:devcloud:nacos:discovery:server-addr:192.168.3.3:8848namespace:54c53c3a-6008-4ecc-90fe-2ffcae64b95bgroup:shoppingsentinel:enabled:truetransport:dashboard:localhost:8888port:8729application:name:goods
server:port:8083spring:profiles:active:devmain:allow-bean-definition-overriding:truecloud:nacos:discovery:server-addr:192.168.3.3:8848namespace:54c53c3a-6008-4ecc-90fe-2ffcae64b95bgroup:shoppingsentinel:enabled:truetransport:dashboard:localhost:8080port:8719gateway:discovery:locator:lowerCaseServiceId:trueenabled:trueroutes:-id:users_routeuri:lb://userspredicates:-Path=/users/**-id:goods_routeuri:lb://goodspredicates:-Path=/goods/**application:name:gatewaymanagement:points:web:exposure:include:"*"Sentinel控制台
通过Sentinel源码项目启动Sentinel控制台,是一个SpringBoot项目
访问本地Sentinel控制台界面http://localhost:8080/,默认端口是8080,默认用户密码sentinel/sentinel,由于暂时没有做持久化功能,所以刚进来是内容是空的
微服务启动启动网关、用户、商品三个微服务,用户微服务端口为8081,商品微服务端口为8082,网关微服务端口为8083
先不通过网关直接访问goods微服务http://localhost:8082/goods/1,走http方式调用接口
通过网关路由配置我们访问用户服务http://localhost:8083/users/users/1,访问结果正确
继续访问商品接口服务http://localhost:8083/goods/goods/1,访问结果正确
访问商品服务调用用户服务http://localhost:8083/goods/goods/user,访问结果正确
Sentinel控制台设置下限流规则,针对goods/goods/user这个触点链路进行流控设置
当我们每秒访问在两次内还是会访问正常,我们连续快速按F5刷新则会出现BlockedbySentinel:FlowException,这个是默认Sentinel返回限流提供,我们也可以实现自定义限流提示