基础知识
微服务架构
- 微服务是系统架构的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于
HTTP
的RESTful API
进行通信协作。被拆分成的每一个小型服务都围绕着系统中的某一项或一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储、业务开发、自动化测试案例以及独立部署机制。由于有了轻量级的通信协作基础,所以这些微服务以使用不同的语言来编写。
与单体系统的区别
- 单体系统部署在一个进程内,往往我们修改了一个很小的功能,为了部署上线会影响其他功能的运行。并且,单体应用中的各个功能模块的使用场景、并发量、消耗的资源类型都各不相同,对资源的利用又互相影响,这样使得对于各个业务模块的系统容量很难给出较为准确的评估。
- 微服务因将服务拆分从而引发了如下一些单体应用这没有的问题:
- 接口的一致性:服务的拆分,但是业务逻辑上的依赖并不会消除,只是从单体应用中的代码依赖变为了服务间的通信依赖。
- 分布式的复杂性:分布式环境的问题都将是微服务架构系统设计时要考虑的重要因素,比如网络延迟、分布式事务、异步消息等。
微服务架构的九大特性
- 服务组件化。
- 按业务组织团队。
- 做产品的态度。
- 智能端点与哑管道。
- 去中心化治理。
- 去中心环管理数据。
- 基础设施自动化。
- 容错设计。
- 演进式设计。
Spring Cloud
Spring Cloud
是一个基于Spring Boot
实现的微服务架构开发工具。它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
#微服务构建:Spring Boot
Spring Boot
自身拥有自动化配置、快速开发、轻松部署等优点,非常适合用作微服务架构中各项具体微服务的开发框架。Spring Boot
本身可以很好地融入Docker
容器,并且自身就支持嵌入式的Tomcat、Jetty
等容器。所以对于一个web
应用只需要打成jar
包,然后通过java -jar
命令直接运行就能启动,这使得Spring Boot
应用变得非常轻便。- 如何使用
Spring Boot
快速构建一个项目,可参考相关官方文档。
配置详解
配置文件
Spring Boot
的配置文件除了可以使用传统的properties
文件之外,还支持现在被广泛推荐使用的YAML
文件。在yaml
文件中,还可以在一个单个文件中通过spring.properties
属性来定义多个不同的环境配置。如下:
server:
port: 8080
---
spring:
profiles: test
server:
port: 8081
---
spring:
profiles: prod
server:
port: 8082
- 注意:
yaml
目前还无法通过@PropertySources
注解来加载配置。如果想要加载,需要自己手写一个类,继承DefaultPropertySourceFactory
类重写createPropertySource
方法。
自定义参数和参数引用
- 首先在配置文件中定义参数,如
app.name=****
- 使用
${参数名}
,如${ap.name}
即可。
多环境配置
- 在
Spring Boot
中,多环境配置的文件名需要满足application-{profile}.properties
的格式,其中{profile}
对应环境标识。如下:applcation-dev.properties
:开发环境application-test.properties
:测试环境application-prod.properties
:生产环境
- 然后在
application-prooperties
文件中通过spring.profiles.active
属性来设置。
加载顺序
- 在命令行中传入的参数;
SPRING_APPLICATION_JSON
中的属性。它是以JSON
格式配置在系统环境变量中的内容。java:comp/env
中的JNDI
属性。Java
的系统属性,可以通过System.getProperties()
获得的内容。- 操作系统的环境变量;
- 通过
random.*
配置的随机属性。 - 位于当前应用
jar
包之外,针对不同{profile}
环境的配置文件内容。 - 位于当前应用
jar
包之内,这对不同{profile}
环境的配置文件内容。 - 位于当前应用
jar
包之外的application.properties
和yaml
配置内容。 - 位于当前应用
jar
包之内的application.properties
和yaml
配置内容。 - 在
@Configuration
注解修改的类中,通过@PropertySource
注解定义的属性。 - 应用默认属性,使用
SpringApplication.setDefaultProperties
定义的内容。
优先级按上面的顺序由高到低,数字越小优先级越高。
监控与管理
- 为了让运维系统能够获取各个微服务应用的相关指标以及实现一些常规操作控制,需要开发一套专门用于植入各个微服务应用的接口供监控系统采集信息。
- 引入
spring-boot-starter-actuator
模块,能够自动为Spring Boot
构建的应用提供一系列用于监控的端点。 - 可以将原生的断点分为以下三个大类:
- 应用配置类。获取应用程序中加载的应用配置、环境变量、自动化配置报告等与
Spring Boot
应用密切相关的配置类信息。 - 度量指标类。获取用于监控的度量指标,如内存信息、线程池信息、
HTTP
请求统计等。 - 操作控制类。提供对应用关闭等操作类功能。
- 应用配置类。获取应用程序中加载的应用配置、环境变量、自动化配置报告等与
应用配置类
该端点提供的信息报告可以说是一种静态报告。
/autoconfig:
该断点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。postiveMatches
返回的是条件匹配成功的自动化配置;negativeMatches
返回的是条件匹配不成功的自动化配置。
/beans:
用来获取应用上下文中创建的所有Bean
。/configprops:
该端点用来获取应用配置的属性信息报告。/env:
该端点与/configprops
不同,它用来获取应用所有可能的环境属性报告。包括环境变量、JVM
属性、应用的配置属性、命令行中的参数。/mappings:
该端点用阿里返回所有Spring MVC
的控制器映射关系报告。/info:
返回一些应用自定义的信息。
度量指标类
该端点提供的报告内容则可以说是动态变化的,提供了一些应用程序运行过程中的一些快照信息。如内存使用情况、HTTP
请求统计、外部资源指标等。
/metrics:
返回当前应用的各类重要度量指标。/health:
获取应用的各类健康指标信息。/dump:
用来暴露程序运行中的线程信息。/trace:
返回基本的HTTP
跟踪信息。
控制操作类
他们都是默认启动的。并且他们拥有更强大的控制能力,如果想要使用他们,需要通过属性来配置并开启操作。