现代Java技术栈里我们已经有了JDK 11,Kotlin,Spring 5,Spring Boot 2以及Gradle 5,还有可以用于生产环境的kotlin DSL,Junit 5,以及一大堆SpringCloud的类库,它们可以用来进行服务发现,创建API网关,客户端负载均衡,实现熔断器模式,编写声明式HTTP客户端,分布式跟踪系统,所有的这些。当然,要创建一个微服务的架构的话,并不需要上面所有的组件——但是这个过程会很有趣!
Microservices in Java
简介
在这篇文章里,你会了解一个使用Java技术栈的微服务架构,主要的组件列表如下(下面所列的版本是截止文章目前发布所使用的):
micro-service
我们的项目包含5个微服务:3个基础服务(配置服务Config Server,服务发现Service discovery server,UI网关 UI gateway)以及用于示例的前端(Item UI)和后端(Item Service):
micro-service2
接下来会依次介绍上面的组件。在实际的项目中,要实现具体的业务逻辑,所使用的微服务会比这个多。但是,在这个架构上只需要加上和Item UI以及Item Service类似的组件就可以了。
声明
这篇文章没有将容器化和微服务编排考虑进来,因为目前这个项目里还没有用到它们。
配置服务Config Server
我们这里使用Spring Cloud Config来作为统一的配置中心。配置可以从多种不同的数据源进行读取,例如,一个单独的git仓库。在这个项目里,为了方便,我们把它们放在应用资源里:
microservice-3
Config server的配置(application.yml)如下:
yml
spring:
profiles:
active: native
cloud:
config:
server:
native:
search-locations: classpath:/config
server:
port: 8888
使用8888端口,可以让Config service客户端使用默认的配置,不需要在bootstrap.yml里指定端口。在启动的时候,客户端会用一个GET请求来通过Config server的HTTP API获取配置。
这个微服务应用本身的代码只有一个文件,它里面包含应用类(applicaiton class)的声明以及main方法,main方法和java代码有些不同,它是一个顶级函数:
@SpringBootApplication
@EnableConfigServer
class ConfigServerApplication
fun main(args: Array<String>) {
runApplication<ConfigServerApplication>(*args)
}
其它微服务里的应用类(Application class)以及main方法都是类似的形式。
服务发现(Service Discover Service)
服务发现是一种微服务架构模式,它能隐藏应用之间的交互细节,让你不用关心应用实例的数量以及网络位置的变动。它的关键组件包含服务注册,微服务的存储,微服务实例以及网络位置(更多信息请参考这个)。
在这个项目里,服务发现是基于Netflix Eureka实现的,它是一个客户端服务发现:Eureka服务端会负责服务注册,客户端会请求Eureka服务端来获取应用实例列表,然后在向微服务发送请求之前通过Netflix Robbon来进行负载均衡。Netflix Eureka和很多其他Netflix OSS技术栈的其他组件(例如Hystrix和Ribbon)相似,都使用Spring Cloud Netflix来和Spring进行整合。
服务发现的配置文件,在资源文件里(bootstrap.yml),它只包含应用名以及标明在连接不上Config server的时候是否要中断服务启动的配置。
spring:
application:
name: eureka-server
cloud:
config:
fail-fast: true
其他的