概述
第一章 了解微服务
火车模型:交付的服务就像一辆火车,这个服务相关的所有功能对应的项目成果,就是要装上火车车厢的一件件货物,交付的列车只有等到所有项目都开发测试完成之后才可以装车触发,完成这个服务的交付。
微服务的益处:独立,进而可扩展性;多语言生态;
带来的挑战:服务的实例数量增多,管理等麻烦;
架构设计上有一种实践模式,即隔板模式(bulkhead pattern),首要目的就是为了隔离系统中的各个功能单元和实体,使得系统不会因为一个单元或者服务的失败而导致整体失败。
第二章 spring框架的本质
IoC有两种方式,DI(Dependency Injection,当前软件实体被动接受其依赖的其它组件被IoC容器注入)和DL(Dependency Lookup,当前软件实体主动去某个服务注册地查找其依赖的那些服务)依赖查找,一个例子context.getBean()
。
Spring IoC容器的依赖注入工作的两个阶段:
收集和注册,构建和收集bean定义的阶段;
分析和组装,IoC容器分析这些容器中的bean,根据它们之间的依赖关系先后组装它们。
常用注解:@ComponentScan、@PropertySource/@ PropertySources(同PropertySourcesPlaceholderConfigurer配合使用)、@Import(注解形式)/@ImportResource(xml形式)
第三章 spring boot工作机制
虽然Dropwizard是公认的最早的微框架,但是spring boot是CoC(Convention over Configuration)概念的最佳实践;
@SpringBootApplication三位一体==SpringBootConfiguration + EnableAutoConfiguration + ComponentScan
;@ EnableAutoConfiguration借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。
@EnableAutoConfiguration==@AutoConfigurationPackage+@Import,借助于SpringFactoriesLoader的支持,这个类可以智能地自动配置生效;SpringFactoriesLoader是spring框架的一种扩展方案,类似于java的SPI方案ServiceLoader,从指定的配置文件META-INF/spring.factories
加载配置,配置格式为完整的类名形式的key-value。
SpringApplication的执行流程;
精简后的流程图:
启动过程中的重要的扩展点:
SpringApplicationRunListener
ApplicationListener
ApplicationContextInitializer
CommandLineRunner
基于条件的自动配置有:
@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingClass
@ConditionalOnMissingBean
@ConditionalOnProperty
@Conditional注解,使用这个注解,可以实现自己的自定义条件注解。
另外,还可以对当前要提供的配置或者组件的加载顺序进行调整,使用@AutoConfigureAfter/@AutoConfigureBefore
第四章 了解常用的spring-boo-starter
对spring boot的行为进行干预的配置方式有以下几类(优先级从高到低):
命令行参数:如–spring.profiles.active
系统环境变量
文件系统中的配置文件
classpath中的配置文件
代码中的配置项
默认的配置文件名application.properties,放在根目录或者config子目录下。
-
logging
默认的实现是logback;想要自定义的话,添加logback.yml/xml等,然后在application.properties加以配置。 -
web
资源文件统一放在src/main/resources下面,如static/img等;自动配置的SpringMVC的必要组件;还可以对嵌入式的web容器进行定制; -
jdbc
如果在ApplicationContext里面配置有多个DataSource实例,指向多个数据库,则会启动失败,解决方法是取消DataSourceAutoConfiguration的自动配置,在SpringBootApplication的注解里面配置exclude;方法二,@Primary注解。 -
aop
两个配置项:
apring.aop.auto=false #关闭自动的aop配置
apring.aop.proxy-target-class=true#启用针对class而不是interface级别的aop代理。
APM(application performance monitoring)的开发,可以考虑dropwizard.metrics的依赖导入;metrics-annotation依赖包提供的注解:@Timed、@Gauge、@Counted、@Metered、@ExceptionMetered
-
security
Acegi->spring security;security默认提供一个基于HTTP basic认证的安全防护策略,用户名为use,密码是32位uuid;
Spring security提供的配置项:
security.user.name=
security.user.password=
security.user.role=
核心给你图:
AbstractSecurityInterceptor是抽象类,一般通过实现类来拦截。
AccessDecisionManager是控制机构,决定谁可以访问哪些资源。
AuthenticationManager解决访问者的身份验证的问题。
这三者是spring security的核心,后两者负责制定规则,前者负责执行。
Spring security的web安全方案基于servlet API规范构建;
-
actuator与应用监控
actuator自动配置模块默认提供很多endpoint,可以分成两类,监和控:
Sensor类监:
autoconfig、beans、configprops、info、health、env、metrics、trace、mapping
actuator类控:
shutdown(关闭应用)、dump(执行线程的dump操作)
默认情况下,除shutdown是关闭的,其他endpoints是开启的;这有安全隐患,因此建议如果在生产环境中引入actuator模块,建议遵循deny by default原则,将所有的endpoints都关掉,然后再根据需求在application.properties
文件里面单独开启某些需要监控的endpoints:
endpoints.enabled=false
endpoints.info.enabled=true
endpoints.health.enabled=true
还可以自定义应用的健康检查状态;
Endpoints信息只有开放出去才有价值,提供给外部的监控者;这些endpoint实例以JMX bean的形式开放的;默认情况下,在org.springframework.boot
命名空间下,通过配置项可以加以更改:endpoints.jmx.domain=com.johnny.management
;
另外,还可以以HTTP协议开放,通过management.
为前缀的配置项对endpoints的HTTP开放行为进行调整,如management.port=-1
,则表示关闭HTTP对外服务;
注意,由于Java的序列号漏洞,以及JMX的远程访问防火墙问题,建议使用HTTP协议。
总结:
约定配置三板斧:
建议优先使用相应的spring-boot-starter默认的约定配置;
建议约定配置无法满足需求的前提下,再基于spring-boot-starter原有约定配置的基础上进行适当的扩展配置。
如果约定加适当的扩展配置还是无法满足需求,则允许开发者推倒重来,基于spring框架的一些原有特性直接实现自己想要的功能。
第五章 spring boot微服务实践探索
5.1 构建
任何注册到springboot应用的CommandLineRunner都将在SpringApplication.run执行完成之后再执行。
Dubbo自身定位为一款基于TCP长连接通信的高性能服务治理框架。
使用springboot构建web API有几种选择:starter-jersey构建restful API;starter-hateoas;
一般情况下,starter-web够用,虽然不规范。
Builder模式;
Spring框架设计不足之处:循环条件判断应用哪个类的时候,条件判断API开放不足。
Akka框架是scale语言里面的一种,典型Actor模型;
5.2 发布与部署
发布不等于部署;一先一后,后者还要确定服务正常启动;发布的形式多种多样,传统如jar包,war包,流行如images,面向平台/系统如rpm、deb包等;
借助于maven来发布的话,需要先搭建Nexus服务器(或者artifactory)
Pom文件:
<distributionManagement>
<repository>
<id>deployment</id>
<name>internal</name>
<url>http://{nexus_server}/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>deployment</id>
<name>internal</name>
<url>http://{nexus_server}/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
Settings.xml文件:
<server>
<id>deployment</id>
<username>root</username>
<password>root</password >
</server>
rpmbuild文件用来构建rpm包,使用系统的rpmbuild工具完成,需要一个构建描述文件,即.spec文件;
5.3 注册与发现
可选项,基于Redis、zookeeper、DNS的服务注册与发现机制。
5.4 监控与运维
Zabbix/Nagios;ElasticSearch对高频度的写入并没有很高的承受力?故而使用Kafka作为数据采集的缓冲区,以便减轻从大量应用结点采集日志并写入ES的负担;
同前文,不建议使用JMX的方式来进行暴露MBean状态数据,而是使用Jolokia方案,无侵入(启动时/后挂载javaagent)提供一种基于HTTP的JMX Mbean访问通道。
数据采集,数据客户端主动上报(PUSH),采集服务端主动拉取(PULL)
5.5 安全和防护
5.6 发布和部署平台
第六章 springboot与Scala
java平台:语言,类库和虚拟机;
6.1 基于maven构建和发布
基于maven构建Scala项目,引入Dependency:
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>${scala.version}</version>
</dependency>
还需要引入build插件:
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version></version>
<executions>
<execution>
<id>compile-scala</id>
<phase>compile</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile-scala</id>
<phase>test-compile</phase>
<goals>
<goal>add-source</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<recompileMode>incremental</recompileMode>
<scalaVersion>${scala.version}</scalaVersion>
<args>
<arg>-deprecation</arg>
</args>
<jvmArgs>
<jvmArg>-Xms64m</jvmArg>
<jvmArg>-Xmx1024m</jvmArg>
</jvmArgs>
</configuration>
</plugin>
</plugins>
</build>
还有< properties ></ properties>
里面配置的scala.version
以及scala.maven.version
Maven项目的依赖Dependency可以传递依赖(transitive Dependency),但是插件却不行。解决方法:
- 使用gist工具(无论是本地还是在线的),然后复制粘帖
- 在公司内部搭建一个私有的Spring initializer服务实例,如https://start.spring.io/,到https://github.com/spring-io/initializr获取项目然后部署到自己的服务,然后…
- 创建公司组织级别的parent工程,package方式为pom。在这里定义所有的Dependency和plugin。因为maven的插件可以通过继承实现重用,不能通过组合实现重用。
- 使用maven archetype简化项目创建
包括从零开始创建和在已有的项目的基础之上创建两种方式,无论是哪种方式,都需要注意遵守规范。在已有的项目下,创建archetype的步骤:先执行mvn archetype:create-from-project命令,在项目的target/generated-sources/archetype
目录下面生成初版的archetype项目,注意这个项目的结构,还需要进行适当的裁剪,之后cd到上述目录,执行mvn install/deploy
命令完成最终的archetype项目的发布,以后要创建项目的话,只需要执行命令:
mvn archetype:generate -DarchetypeGroupId= -DarchetypeArtifactId= -DarchetypeVersion= -DGroupId= -DArtifactId= -DVersion=
即可。
上述便是创建一个可以通过命令行的方式快速搭建项目的自定义脚手架项目的大致流程;
更进一步,开发用IDE的情况下,可以把上述成果搬到IDEA里面去。点击Add archetype即可。
6.2 基于SBT构建和发布
SBT(simple build tool),triggered execution特性,写代码的同时实时获得编译结果反馈。
在不能引入spring-boot-starter-parent的情况下,引入spring-boot-dependencies;why?因为spring-boot-starter-parent是一个空项目,只有pom.xml文件的定义,其parent就是spring-boot-dependencies,然后spring-boot-dependencies也是一个空项目。
无论什么starter模块,都依赖spring-boot-starter模块,其pom.xml文件依赖spring-boot、spring-boot-autoconfigure、spring-boot-starter-logging、spring-core以及snakeyaml。这几个也是一个springboot项目得以成型的必备依赖。
SBT项目类似与spring initializer这样的脚手架工具是typesafe activator,执行命令:
activator new scala-project minimal-scala
minimal-scala是为模版的项目名。对应的文件是build.sbt
。
sbt-native-packageer插件,可以将SBT项目发布为ZIP、tar、rpm、deb甚至docker images形式。注意发布时,声明当前应用是java应用(JavaAppPackaging), 而不是Scala应用,因为编译完成之后运行器都是java字节码;要指定mainClass声明启动类。
最后
以上就是简单楼房为你收集整理的《Spring Boot:快速构建微服务体系》读书笔记的全部内容,希望文章能够帮你解决《Spring Boot:快速构建微服务体系》读书笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复