Quarkus服务
Quarkus是作为一种应对新部署环境和应用程序架构等挑战的工具而引入的,在框架上编写的应用程序将具有低内存消耗和更快的启动时间。此外,对开发人员也很友好,例如,开箱即用的实时重新加载。
Quarkus 应用程序目前没有 main 方法,但也许未来会出现(GitHub 上的问题)。
对于熟悉 Spring 或 Java EE 的人来说,Controller 看起来非常熟悉:
@Path("/application-info") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) class ApplicationInfoResource( @Inject private val applicationInfoService: ApplicationInfoService ) { @GET fun get(@QueryParam("request-to") requestTo: String?): Response = Response.ok(applicationInfoService.get(requestTo)).build() @GET @Path("/logo") @Produces("image/png") fun logo(): Response = Response.ok(applicationInfoService.getLogo()).build() }
如你所见,bean 是通过@Inject注解注入的,对于注入的 bean,你可以指定一个范围,例如:
@ApplicationScoped class ApplicationInfoService( ... ) { ... }
为其他服务创建 REST 接口,就像使用 JAX-RS 和 MicroProfile 创建接口一样简单:
@ApplicationScoped @Path("/") interface ExternalServiceClient { @GET @Path("/application-info") @Produces("application/json") fun getApplicationInfo(): ApplicationInfo } @RegisterRestClient(baseUri = "http://helidon-service") interface HelidonServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://ktor-service") interface KtorServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://micronaut-service") interface MicronautServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://quarkus-service") interface QuarkusServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://spring-boot-service") interface SpringBootServiceClient : ExternalServiceClient
但是它现在缺乏对服务发现 ( Eureka和Consul ) 的内置支持,因为该框架主要针对云环境。因此,在 Helidon 和 Ktor 服务中, 我使用了Java类库方式的Consul 客户端。
首先,需要注册应用程序:
@ApplicationScoped class ConsulRegistrationBean( @Inject private val consulClient: ConsulClient ) { fun onStart(@Observes event: StartupEvent) { consulClient.register() } }
然后需要将服务的名称解析到其特定位置;
解析是通过从 Consul 客户端获得的服务的位置替换 requestContext的URI 来实现的:
@Provider @ApplicationScoped class ConsulFilter( @Inject private val consulClient: ConsulClient ) : ClientRequestFilter { override fun filter(requestContext: ClientRequestContext) { val serviceName = requestContext.uri.host val serviceInstance = consulClient.getServiceInstance(serviceName) val newUri: URI = URIBuilder(URI.create(requestContext.uri.toString())) .setHost(serviceInstance.address) .setPort(serviceInstance.port) .build() requestContext.uri = newUri } }
Quarkus也支持通过properties 或 YAML 文件进行配置(参考Quarkus 配置指南了解更多详细信息)。
Spring Boot服务
创建该框架是为了使用 Spring Framework 生态系统,同时有利于简化应用程序的开发。这是通过auto-configuration实现的。
Spring Boot 基础就不介绍了,推荐下这个实战教程: https://github.com/javastacks/javastack
以下是控制器代码:
@RestController @RequestMapping(path = ["application-info"], produces = [MediaType.APPLICATION_JSON_VALUE]) class ApplicationInfoController( private val applicationInfoService: ApplicationInfoService ) { @GetMapping fun get(@RequestParam("request-to") requestTo: String?): ApplicationInfo = applicationInfoService.get(requestTo) @GetMapping(path = ["/logo"], produces = [MediaType.IMAGE_PNG_VALUE]) fun getLogo(): ByteArray = applicationInfoService.getLogo() }
微服务由 YAML 文件配置:
spring: application: name: spring-boot-service server: port: 8085 application-info: name: ${spring.application.name} framework: name: Spring Boot release-year: 2014
也可以使用properties文件进行配置(更多信息参考Spring Boot 配置文档)。
启动微服务
在启动微服务之前,你需要安装Consul和 启动代理-例如,像这样:consul agent -dev。
你可以从以下位置启动微服务:
IDE中启动微服务IntelliJ IDEA 的用户可能会看到如下内容:
要启动 Quarkus 服务,你需要启动quarkusDev的Gradle 任务。
console中启动微服务在项目的根文件夹中执行:
java -jar helidon-service/build/libs/helidon-service-all.jar
java -jar ktor-service/build/libs/ktor-service-all.jar
java -jar micronaut-service/build/libs/micronaut-service-all.jar
java -jar quarkus-service/build/quarkus-service-1.0.0-runner.jar
java -jar spring-boot-service/build/libs/spring-boot-service.jar
启动所有微服务后,访问http://localhost:8500/ui/dc1/services,你将看到:
API测试
以Helidon服务的API测试结果为例:
GET http://localhost:8081/application-info { "name": "helidon-service", "framework": { "name": "Helidon SE", "releaseYear": 2019 }, "requestedService": null }
GET http://localhost:8081/application-info?request-to=ktor-service { "name": "helidon-service", "framework": { "name": "Helidon SE", "releaseYear": 2019 }, "requestedService": { "name": "ktor-service", "framework": { "name": "Ktor", "releaseYear": 2018 }, "requestedService": null } }
GET http://localhost:8081/application-info/logo返回logo信息
你可以使用Postman 、IntelliJ IDEA HTTP 客户端 、浏览器或其他工具测试微服务的 API接口 。