资深大佬和你分享Spring-Cloud实战

使用Spring Cloud实战微服务 微服务简介 单体架构

一个归纳包(例如WAR格式)包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的方法论,我们称之为传统的单体应用架构。

缺点: 1.复杂性高

​ 以一个百万行级别的单体应用为例,整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐,混乱的堆砌在一起……整个项目非常复杂。每次修改代码都心惊胆颤,甚至添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。

2.技术债务

​ 随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。“不坏补修 (Not broken,don’t fix)”,这在软件开发中非常常见,在单体应用中这种思想更甚。已使用的系统设计或代码难以修改,因为应用程序的其他模块可能会以意料之外的方式使用它。

3.部署频率低

​ 随着代码的增多,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。全量部署的方式耗时长、影响的范围大、风险高,这使得单体应用项目上线部署的频率较低。而部署的频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错概率较高。

4.拓展能力受限

​ 单体应用只能作为一个整体进行拓展,无法结合业务模块的的特点进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,我们不得不在硬件的选择上做出妥协。

5.阻碍技术创建

​ 单体应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和框架,想要引入新的框架或技术平台会非常困难。例如,一个使用Struts2构建的100万行代码的单体应用,如果想要换用Spring MVC,切换成本无疑是非常高的。

架构的演进 单体架构

SOA(分布式,面向服务架构)

微服务

微服务架构 www.martinfowler.com/articles/mi… In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

翻译:简而言之,微服务架构风格这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

微服务特性: 1.每个微服务可独立运行在自己的进程里;

2.一系列独立的微服务共同构建起整个系统;

3.每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等;

4.微服务之间通过一些轻量级的通信机制进行通信,例如通过REST API进行调用;

5.可以使用不同的语言与数据存储技术;

6.全自动的部署机制。

微服务架构的优点与挑战 微服务架构的优点: 1.易于开发和维护

​ 一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对是比较简单的。而整个应用是由若干个微服务构建而成的,所以整个应用也会维持在可控状态。

2.单个微服务启动较快

​ 单个微服务代码量较少,所以启动会比较快。

3.局部修改容易部署

​ 单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。

4.技术栈不受限

​ 在微服务中,我们可以结合项目业务及团队的特点,合理的选择技术栈。例如某些服务可以使用关系型数据库MySQL;某些微服务有图形计算计算的需求,我们可以使用Neo4J;甚至可以根据需求,部分微服务使用JAVA开发,部分微服务使用NodeJS进行开发。

5.按需伸缩

​ 可以根据需求,实现细粒度的拓展。例如:系统中的某个微服务遇到了瓶颈,我们可以结合这个微服务的业务特点,增加内存、升级CPU或者是增加节点。

6.DevOps

微服务架构的挑战: 1.运维要求较高

​ 更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行;而在微服务中,需要保证几十个甚至是几百个服务的正常运行与协作,这个项目的运维带来了很大的挑战。

2.分布式固有的复杂性

​ 使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都给我们带来了很大的挑战

3.接口挑战成本高

​ 微服务之间通过接口进行通行。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。

4.重复劳动

​ 很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。

微服务设计原则 单一职责

​ ref:en.wikipedia.org/wiki/SOLID_…

服务自治

​ 每个微服务应该具备独立的业务能力、依赖于运行环境

轻量级通信

接口明确

​ 每个服务的对外接口应该明确定义,并尽量保持不变。

微服务开发框架浅谈 Spring Cloud:projects.spring.io/spring-clou…

Dubbo:dubbo.io

Dropwizard:www.dropwizard.io

Consl、etcd &etc.

Spring Cloud简介 简介 ​ projects.spring.io/spring-clou…

​ 快速构建分布式系统的工具集

版本 服务注册与发现 创建调用关系的微服务

服务消费者 调用别的微服务的微服务 服务提供者 提供API的微服务

使用Eureka实现服务注册与发现

github.com/netflix/eur…

Coding 客户端负载均衡Ribbon

github.com/netflix/rib…

声明式的Http Client Feign 如果构造的URL是: www.baidu.com/s?ie=utf-8&… 怎么办?

github.com/OpenFeign/f…

微服务容错 雪崩效应

实现容错的方案 为请求设置超时 通过网络请求其他服务时,都必须设置超时。正常情况下,一个远程调用一般在几十毫秒内就能得到响应了。如果依赖的服务不可用,或者网络有问题,响应时间将会变得很长(几十秒)。 通常情况下,一次远程调用对应着一个线程/进程。如果响应太慢,这个线程/进程就得不到释放。而线程/进程又对应着系统资源,如果得不到释放的线程/进程越积越多,服务资源就会被耗尽,从而导致服务不可用。 因此,必须为每个请求设置超时,让资源尽快地得到释放。

使用断路器 试想一下,如果家庭里没有断路器,电流过载了(例如功率过大、短路等),电路不断开,电路就会升温,甚至是烧断电路、起火。有了断路器之后,当电流过载时,会自动切断电路(跳闸),从而保护了整条电路与家庭的安全。当电流过载的问题被解决后,只要将关闭断路器,电路就又可以工作了。 同样的道理,当依赖的服务有大量超时时,再让新的请求去访问已经没有太大意义,只会无谓的消耗现有资源。譬如我们设置了超时时间为1秒,如果短时间内有大量的请求(譬如50个)在1秒内都得不到响应,就往往意味着异常。此时就没有必要让更多的请求去访问这个依赖了,我们应该使用断路器避免资源浪费。 断路器可以实现快速失败,如果它在一段时间内侦测到许多类似的错误(譬如超时),就会强迫其以后的多个调用快速失败,不再请求所依赖的服务,从而防止应用程序不断地尝试执行可能会失败的操作,这样应用程序可以继续执行而不用等待修正错误,或者浪费CPU时间去等待长时间的超时。断路器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。 断路器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。 断路器开关相互转换的逻辑如下图:

Coding API网关 Why API Gateway blog.daocloud.io/microservic…

Zuul API Gateway github.com/netflix/zuu…

Coding 统一配置中心 配置的管理 /{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties

配置的刷新 /refresh /bus/refresh ===> amqp

最终架构

Spring Cloud是什么? Cloud?云计算?不是 Spring boot 快速构建分布式系统的工具集 关于Spring Cloud的版本 大部分Spring软件的版本是以:主版本.次版本.增量版本.里程碑版本的形式命名 Spring Cloud Angel SR6??? Service Release WIN7 Service Pack

Spring Cloud特点 约定优于配置 开箱即用、快速启动 适用于各种环境 PC Server 云环境 容器(Docker) 轻量级的组件 服务发现 Euraka 组件的支持很丰富,功能很齐全 配置中心 注册中心 智能路由 选型中立 服务发现 Eureka Zookeeper Consul 需要的技术储备 JAVA Scala/Groovy 构建工具 Maven Gradle(如何将Maven项目转为Gradle项目?maven -gradle gradle init –type pom) Spring Boot 服务提供者与服务消费者 概念 服务提供者:服务的被调用方(即:为其他服务提供服务的服务)

服务调用者:服务的调用方(即:依赖其他服务的服务)

用户–购票–>电影微服务—查询用户信息–>用户微服务

编写一个服务提供者

编写一个服务消费者

服务发现与服务注册 如何解决硬编码问题? 用户–购票–>电影微服务—查询用户信息–>用户微服务

服务发现

服务发现组件的功能 服务注册表 服务注册表是一个记录当前可用服务实例的网络信息的数据库,是服务发现机制的核心。服务注册表提供查询API和管理API,使用查询API获得可用的服务实例,使用管理API实现注册和注销;

服务注册 服务注册很好理解,就是服务启动时,将服务的网络地址注册到服务注册表中;

健康检查 服务发现组件会通过一些机制定时检测已注册的服务,如果发现某服务无法访问了(可能是某几个心跳周期后),就将该服务从服务注册表中移除。

服务发现的方式 客户端发现 Eureka ZK 服务器端发现 Consul+nginx 术语解释 目前市面上的书籍,服务注册、服务发现、注册中心,在很多场景下,都可以理解为是服务发现组件。

微信扫码领取java全套资料哦~

转载于:https://juejin.im/post/5c1e26b7e51d4516da70fe90

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值