Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个自己的微服务系统。那么 Spring Cloud 究竟是如何使用的呢?他到底有哪些组件?
spring-cloud-commons
组件里面,就有 Spring Cloud 默认提供的所有组件功能的抽象接口,有的还有默认实现。目前的 2020.0.x (按照之前的命名规则应该是 iiford),也就是spring-cloud-commons-3.0.x
包括:
DiscoveryClient
,从注册中心发现微服务。ServiceRegistry
,注册微服务到注册中心。LoadBalancerClient
,客户端调用负载均衡。其中,重试策略从spring-cloud-commons-2.2.6
加入了负载均衡的抽象中。CircuitBreaker
,负责什么情况下将服务断路并降级然后,一般一个完整的微服务系统还包括:
在之前的系列中,我们将 Spring cloud 升级到了 Hoxton 版本,组件体系是:
并且实现了如下的功能:
注册中心相关:
微服务实例相关:
metamap
中的zone
配置,来区分不同集群的实例。只有实例的metamap
中的zone
配置一样的实例才能互相调用。网关相关:
metamap
中的zone
配置鉴别所处集群,仅把请求转发到相同集群的微服务实例在后续的使用,开发,线上运行过程中,我们还遇到了一些问题:
接下来,我们要对现有依赖进行升级,并且对现有的功能进行一些拓展和延伸,形成一套完整的 Spring Cloud 微服务体系与监控体系。
本次项目代码,请参考:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford
这次我们抽象出更加具体的各种场景的依赖。一般的,我们的整个项目一般会包括:
为何微服务要抽象分离出响应式的和传统 servlet 的呢?
org.springframework.boot
spring-boot-starter-parent
2.4.4
4.0.0
com.github.hashjang
spring-cloud-iiford
pom
1.0-SNAPSHOT
1.0-SNAPSHOT
junit
junit
test
org.springframework.boot
spring-boot-starter-test
test
org.mockito
mockito-inline
3.6.28
test
org.springframework.cloud
spring-cloud-dependencies
2020.0.2
pom
import
org.apache.maven.plugins
maven-compiler-plugin
3.6.1
11
spring-cloud-iiford
com.github.hashjang
1.0-SNAPSHOT
4.0.0
spring-cloud-iiford-common
30.1.1-jre
1.2.75
3.4.2
2.3.1
1.1.1
com.github.ben-manes.caffeine
caffeine
com.google.guava
guava
${guava.version}
com.alibaba
fastjson
${fastjson.version}
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
org.projectlombok
lombok
com.lmax
disruptor
${disruptor.version}
javax.xml.bind
jaxb-api
${jaxb.version}
com.sun.xml.bind
jaxb-impl
${jaxb.version}
org.glassfish.jaxb
jaxb-runtime
${jaxb.version}
com.sun.xml.bind
jaxb-xjc
${jaxb.version}
javax.activation
activation
${activation.version}
1. 缓存框架 caffeine
很高效的本地缓存框架,接口设计与 Guava-Cache 完全一致,可以很容易地升级。性能上,caffeine 源码里面就有和 Guava-Cache, ConcurrentHashMap,ElasticSearchMap,Collision 和 Ehcache 等等实现的对比测试,并且测试给予了 yahoo 测试库,模拟了近似于真实用户场景,并且,caffeine 参考了很多论文实现不同场景适用的缓存,例如:
所以,我们选择 caffeine 作为我们的本地缓存框架
参考:https://github.com/ben-manes/caffeine
2. guava
guava 是 google 的 Java 库,虽然本地缓存我们不使用 guava,但是 guava 还有很多其他的元素我们经常用到。
参考:https://guava.dev/releases/snapshot-jre/api/docs/
3. 内部序列化从 fastjson 改为 jackson
json 库一般都需要预热一下,后面会提到怎么做。
我们项目中有一些内部序列化是 fastjson 序列化,但是看 fastjson 已经很久没有更新,有很多 issue 了,为了避免以后出现问题(或者漏洞,或者性能问题)增加线上可能的问题点,我们这一版本做了兼容。在下一版本会把 fastjson 去掉。后面会详细说明如何去做。
4. 日志采用 log4j2
主要是看中其异步日志的特性,让打印大量业务日志不成为性能瓶颈。但是,还是不建议在线上环境输出代码行等位置信息,具体原因以及解决办法后面会提到。由于 log4j2 异步日志特性依赖 disruptor,还需要加入 disruptor 的依赖。
参考:
5. 兼容 JDK 9+ 需要添加的一些依赖
JDK 9之后的模块化特性导致 javax.xml 不自动加载,而项目中的很多依赖都需要这个模块,所以手动添加了这些依赖。
spring-cloud-iiford
com.github.hashjang
1.0-SNAPSHOT
4.0.0
spring-cloud-iiford-service-common
com.github.hashjang
spring-cloud-iiford-common
${project.version}
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-loadbalancer
org.springframework.cloud
spring-cloud-starter-openfeign
io.github.resilience4j
resilience4j-spring-cloud2
io.github.resilience4j
resilience4j-feign
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-undertow
这里面相关的依赖,我们后面会用到。
对于 Webflux 响应式风格的微服务,其实就是将 spring-boot-starter-web
替换成 spring-boot-starter-webflux
即可
参考:[这里是代码022]