赞
踩
此文章是入门Spring Cloud入门的基础内容,倘若基本了解,可直接阅读Spring Cloud入门的基础篇,学习记录的资料主要来源于(~ ̄▽ ̄)~ 书籍Spring Cloud微服务入门、实战与进阶(尹吉欢)ヽ(゚∀゚)メ(゚∀゚)ノ ,基础篇:
一、Eureka注册中心
二、客户端负载均衡Ribbon
持续更新中~~~(~ ̄▽ ̄)~
是一种架构风格(而分布式是系统部署的方式)。开发单个应用作为一系列小型服务的套件,其中每个服务都运行在自己的进程中,并且通过轻量级的机制实现彼此间的通信,这通常是HTTP资源API。这些服务是围绕着业务功能构建的,并且可以通过完全自动化的部署机制进行独立部署。这些服务的集中式管理做到了最小化(例如docker相关技术,可了解此文章:点我(✪ω✪)),每—种服务都可以通过不同的编程语言进行编写,并且可以使用不同的数据存储技术。
优势
使用微服务架构能够为我们带来如下好处:
1)、服务的独立部署:每个服务都是一一个独立的项目,可以独立部署,不依赖于其他服务,耦合性低。
2)、服务的快速启动:拆分之后服务启动的速度必然要比拆分之前快很多,因为依赖的库少了,代码量也少了。
3)、更加适合敏捷开发:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行。服务拆分可以快速发布新版本,修改哪个服务只需要发布对应的服务即可,不用整体重新发布。
4)、职责专一,由专门的团队负责专门的服务:业务发展迅速时,研发人员也会越来越多,每个团队可以负责对应的业务线,服务的拆分有利于团队之间的分工。
5)、服务可以动态按需扩容:当某个服务的访问量较大时,我们只需要将这个服务扩容即可。
6)、代码的复用:每个服务都提供REST API,所有的基础服务都必须抽出来,很多的底层实现都可以以接口方式提供。
缺点
微服务其实是一把双刃剑,既然有利必然也会有弊。下面我们来谈谈微服务有哪些弊端,以及能采取什么办法避免。
1)、分布式部署,调用的复杂性高:单体应用的时候,所有模块之前的调用都是在本地进行的,在微服务中,每个模块都是独立部署的,通过HTTP来进行通信,这当中会产生很多问题,比如网络问题、容错问题、调用关系等。
2)、独立的数据库,分布式事务的挑战:每个微服务都有自己的数据库,这就是所谓的去中心化的数据管理。这种模式的优点在于不同的服务,可以选择适合自身业务的数据,比如订单服务可以用MySQL、评论服务可以用Mongdb、商品搜索服务可以用Elasticsearch。缺点就是事务的问题了,目前最理想的解决方案就是柔性事务中的最终一致性, 后面的章节会给大家做具体介绍。
3)、测试的难度提升:服务和服务之间通过接口来交互,当接口有改变的时候,对所有的调用方都是有影响的,这时自动化测试就显得非常重要了,如果要靠人工一个个接口去测试,那工作量就太大了。这里要强调一点,就是API文档的管理尤为重要。
4)、运维难度的提升:在采用传统的单体应用时,我们可能只需要关注一个 Tomcat的集群、一个MySQL的集群就可以了,但这在微服务架构下是行不通的。当业务增加时,服务也将越来越多,服务的部署、监控将变得非常复杂。这个时候对于运维的要求就高了。
什么时候进行服务化拆分
第一阶段的主要目标是快速开发和验证想法
进一步增加更多的新特性来吸引更多的目标用户
同时进行开发的人员超过10人,这个时候就该考虑进行服务化拆分了
不适合拆分的情况
小团队,技术基础较薄弱
流量不高,压力小,业务变化也不大
对延迟很敏感的低延迟高并发系统
业务稳定、迭代周期长
服务化拆分的两种姿势
纵向拆分
横向拆分
结合业务综合分析
Spring Cloud是一系列框架的有序集合。 它利用 Spring Boot的开发便利性, 巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用Spring Boot的开发风格做到一键启动和部署。通俗地讲,Spring Cloud就是用于构建微服务开发和治理的框架集合(并不是具体的一个框架),主要贡献来自Netflix OSS。
(注:Netflix是一家互联网流媒体播放商,是美国视频巨头,随着Netflix转型为一家云计算公司,它也开始积极参与开源项目。Netflix OSS(Open Source)就是由Netflix公司主持开发的一套代码框架和库,目的是解决上了规模之后的分布式系统可能出现的一些有趣问题)。
Spring Cloud模块介绍
1、Eureka: 服务注册中心,用于服务管理。
2、Ribbon: 基于客户端的负载均衡组件。
3、Hystrix: 容错框架,能够防止服务的雪崩效应。
4、Feign: Web 服务客户端,能够简化HTTP接口的调用。
5、Zuul: API网关,提供路由转发、请求过滤等功能。
6、Config: 分布式配置管理。
7、Sleuth: 服务跟踪。
8、Stream: 构建消息驱动的微服务应用程序的框架。
9、Bus: 消息代理的集群消息总线。
除了上述模块,还有Cli、Tas…就不在这里一一介绍了。
Spring Boot简单入门:https://blog.csdn.net/weixin_45537947/article/details/105909671
Spring Boot常用开发技术的集合:https://blog.csdn.net/weixin_45537947/article/details/108214875
Spring Boot实现用户账号的CRUD小案例:https://blog.csdn.net/weixin_45537947/article/details/108214952
Spring Boot实现简单微信小程序小案例:https://blog.csdn.net/weixin_45537947/article/details/108568018
Spring Boot常用的开发技术:
开发过程中经常改动代码,此时若想看下效果,就不得不停下项目然后重启。对于Sning Boot项目来说,启动时间是非常快的,在微服务的架构下,每个服务只关注自己的业务,代码量也非常小,这个启动时间是可以容忍的。对于那些臃肿的单体老项目,启动时间简直是浪费生命。虽然Spring Boot 启动很快,但是我们还是要自己去重启。能不能做到有改动,它就会悄无声息地自己把改动的地方重新加载一遍?答案是肯定的,通过spring-boot-devools就可以实现。
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
开启自动编译:
然后点击OK后,同时按下Shift+Ctrl+Alt+/,选择Registry:
勾起后点击Close,重启IDEA,这样配置就完成了,之后的使用只需要Ctrl+s的保存操作,Spring Boot就会重新加载被修复的Class。
Spring Boot提供了一个用于监控和管理自身应用信息的模块,它就是spring-boot-starter-actuator。只需引入依赖便可使用:
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
当我们访问 /actuator/health可以得到下面的信息:
{
"status": "UP"
}
Actuator端点信息
UP表示当前应用处于健康状态,如果是DOWN就表示当前应用不健康。
添加下面的配置:
#显示健康信息的详情
management.endpoint.health.show-details=always
访问 /actuator/health:
可以看出大部分的端点都不暴露出来,我们可以手动配置需要暴露的端点。如果需要暴露多个端点,可以用逗号分隔,例如下:
management.endpoints.web.exposure.include=configprops,beans
如果想全部暴露直接配置下面方式:
management.endpoints.web.exposure.include=*
下面是简单的统一异常处理模板:
GlobalExceptionHandler.java:
@ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(value = Exception.class) @ResponseBody public ResponseDate defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { logger.error("", e); ResponseDate r = new ResponseDate(); r.setMessage(e.getMessage()); if (e instanceof org.springframework.web.servlet .NoHandlerFoundException) { r.setCode(404); } else { r.setCode(500); } r.setData(null); r.setStatus(false); return r; } }
统一异常处理的实体类:
ResponseDate.java:
@Data
public class ResponseDate {
private Boolean status = true;
private int code = 200;
private String message;
private Object data;
//get set
}
application.properties配置:
#统一异常处理配置
#出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
欢迎继续阅读Spring Cloud基础篇 (✪ω✪)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。