前言
本文首先簡單介紹了微服務的概念以及使用微服務所能帶來的優勢,然后結合實例介紹了幾個常見的Java微服務框架。
微服務在開發領域的應用越來越廣泛,因為開發人員致力于創建更大、更復雜的應用程序,而這些應用程序作為微小服務的組合能夠更好地得以開發和管理。這些微小的服務可以組合在一起工作,并實現更大、應用更廣泛的功能。現在出現了很多的工具來滿足使用逐段法而不是一次性地設計和構建應用程序的所有需求。今天,我們來看一下什么是微服務、使用微服務的好處,以及幾個代碼示例。
微服務是什么?
微服務是一種面向服務的架構風格(Java開發人員最重要的技能之一),其中,應用程序被構建為多個不同的小型服務的集合而不是單個應用程序。與單個程序不同的是,微服務讓你可以同時運行多個獨立的應用程序,而這些獨立的應用程序可以使用不同的編碼或編程語言來創建。龐大而又復雜的應用程序可以由多個可自行執行的簡單而又獨立的程序所組成。這些較小的程序組合在一起,可以提供龐大的單程序所具備的所有功能。
微服務捕獲了你的業務場景,回答了“你想要試著解決什么問題”這個問題。微服務的開發團隊的成員數量比較少,而且可以用任何語言、任何框架進行開發。每個相關的程序都是獨立地版本化、執行和擴展。這些微服務可以與其他微服務進行交互,并且具有唯一的URL或名字,同時,即使遇到故障,也能始終保持可用性和一致性。
微服務能帶來哪些好處?
使用微服務能帶來多個好處,其中有一個好處是,由于這些較小的應用程序無需使用相同的編程語言,因此,開發人員可以使用他們最熟悉的語言。這有助于開發人員用更低的成本和更少的錯誤來開發程序。靈活性和低成本這兩個特點也表現在可以將這些較小的程序重用在其他項目中,從而使其更有效率。
幾個Java微服務框架的例子
這里有幾個可用于Java開發的微服務框架:
Spring Boot:這可能是最好的Java微服務框架了,它適用于控制反轉、面向切面編程等等。
Jersey:這個開源框架支持Java的JAX-RS API,使用起來非常容易。
Swagger:在為你提供開發門戶網頁的同時,能幫助你生成API文檔,以允許用戶測試你的API。
你也可以考慮使用其他一些框架,包括:Dropwizard、Ninja Web框架、Play框架、RestExpress、Restlet、Restx和Spark Framework。
如何使用DropWizard來創建微服務
DropWizard將成熟穩定的Java庫集成在一個輕量級的包中,你可以在自己的應用程序中使用這個包。它使用了Jetty for HTTP、Jersey for REST和Jackson for JSON,以及Metrics、Guava、Logback、Hibernate Validator、Apache HttpClient、Liquibase、Mustache、Joda Time和Freemarker。
你可以使用Maven來設置Dropwizard應用程序。怎么做呢?
在你的POM文件中,添加一個dropwizard.version屬性,值為DropWizard的最新版本。
<--Then list the dropwizard-core library:-->
這將為你設置一個Maven項目。在這里,你可以創建配置類、應用程序類、表現類,資源類或一個健康檢查,還可以構建Fat JARS,然后運行應用程序。
在此鏈接中可以查看Dropwizard用戶手冊,這個鏈接是GitHub庫。
示例代碼:
package com.example.helloworld;
import com.yammer.dropwizard.config.Configuration;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;
public class HelloWorldConfiguration extends Configuration {
@NotEmpty
@JsonProperty
private String template;
@NotEmpty
@JsonProperty
private String defaultName = “Stranger”;
public String getTemplate() {
return template;
}
public String getDefaultName() {
return defaultName;
}
}
Spring Boot微服務
Spring Boot讓你可以通過嵌入式服務器將它提供的Java應用程序與你自己的應用程序一起使用。它使用了Tomcat,因此你不必使用其他的Java EE容器。Spring Boot的教程示例可以訪問這里。
你可以在這里找到所有的Spring Boot工程,你會發現Spring Boot擁有你的應用程序所需的所有基礎架構。無論你是在編寫安全類、配置類或是大數據類的應用程序,總能找到對應的Spring Boot工程。
Spring Boot的工程包括:
- Spring IO Platform:用于版本化應用程序的企業級分發。
- Spring Framework:用于事務管理、依賴注入、數據訪問、消息傳遞和Web應用程序。
- Spring Cloud:用于分布式系統,用于構建或部署你的微服務。
- Spring Data:用于與數據訪問相關的微服務,不管是映射還是歸約,關系型還是非關系型。
- Spring Batch:用于高級別的批量操作。
- Spring Security:用于授權和認證支持。
- Spring REST文檔:用于RESTful服務文檔化。
- Spring Social:用于連接社交媒體API。
- Spring Mobile:適用于移動網絡應用。
示例代碼:
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping(“/”)
String home() {
return “Hello World!”;
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
Jersey
Jersey RESTful框架是開源的,它基于JAX-RS規范。Jersey應用程序可以擴展現有的JAX-RS實現,并通過添加功能和實用工具,使得RESTful服務更為簡單,客戶端開發變得更加輕松。
Jersey最好的一點是,它的文檔很詳細,有很多例子。它的速度很快,路由也非常簡單。
關于如何開始使用Jersey的文檔在這里,而更多的文檔可以在這里找到。
你可以嘗試運行下面的示例代碼:
package org.glassfish.jersey.examples.helloworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path(“helloworld”)
public class HelloWorldResource {
public static final String CLICHED_MESSAGE = “Hello World!”;
@GET
@Produces(“text/plain”)
public String getHello() {
return CLICHED_MESSAGE;
}
}
Jersey可以很容易地與其他庫一起使用,如Netty或Grizzly,它支持異步連接。它不需要servlet容器。然而,它確實很粗魯地依賴注入實現。
Play框架
Play框架可以讓你很方便地使用Scala和Java來構建、創建和部署Web應用程序。對于需要并行處理遠程調用的RESTful應用程序來說,Play框架是理想的選擇。它是模塊化的,支持異步。Play框架的社區也是所有微服務框架中最大的社區之一。
你可以嘗試運行下面的示例代碼:
package controllers;
import play.mvc.*;
public class Application extends Controller {
public static void index() {
render();
}
public static void sayHello(String myName) {
render(myName);
}
}
Restlet
Restlet可以幫助開發人員創建遵循RESTful架構模式的快速而又可擴展的Web API。它具有不錯的路由和過濾功能,可用于Java SE/EE、OSGi、Google AppEngine(Google Compute的一部分)、Android和其他主要的平臺。
由于它的社區是封閉的,因此Restlet的學習曲線比較陡峭,但是你可以從StackOverflow上獲得幫助。
示例代碼:
package firstSteps;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
/**
* Resource which has only one representation.
*/
public class HelloWorldResource extends ServerResource {
@Get
public String represent() {
return “hello, world”;
}
}
發布評論請先 登錄
相關推薦
評論