使用Quarkus在Openshift上構建微服務的快速指南
在我的部落格上,您有機會閱讀了許多關於使用Spring Boot或Micronaut之類框架構建微服務的文章。這裡將介紹另一個非常有趣的框架專門用於微服務體系結構,它越來越受到大家的關注– Quarkus。它是作為下一代Kubernetes/Openshift原生Java框架引入的。它構建在著名的Java標準之上,如CDI、JAX-RS和Eclipse MicroProfile,這些標準將它與Spring Boot區別開來。
其他一些可能說服您使用Quarkus的特性包括非常快的啟動時間、為在容器中執行而優化的最小記憶體佔用,以及較短的首次請求時間。此外,儘管它是一個相對較新的框架(當前版本是0.21),但它有很多擴充套件,包括Hibernate、Kafka、RabbitMQ、Openapi和Vert.x等等。
在本文中,我將指導您使用Quarkus構建微服務,並在OpenShift(通過Minishift)上執行它們。我們將討論以下主題:
- 構建基於rest的且包含輸入校驗的應用程式
- 微服務與RestClient之間的通訊
- 開放健康檢查(liveness, readiness)
- 開放OpenAPI /Swagger 文件
- 使用Quarkus Maven外掛在本地機器上執行應用程式
- 使用JUnit和RestAssured進行測試
- 使用source-2映象在Minishift上部署和執行Quarkus應用程式
1. 建立應用程式 - 依賴項
在建立新應用程式時,你可以執行一個Maven命令,該命令使用quarkus-maven-plugin
-Dextensions
中宣告。
mvn io.quarkus:quarkus-maven-plugin:0.21.1:create \ -DprojectGroupId=pl.piomin.services \ -DprojectArtifactId=employee-service \ -DclassName="pl.piomin.services.employee.controller.EmployeeController" \ -Dpath="/employees" \ -Dextensions="resteasy-jackson, hibernate-validator"
下面是我們pom.xml
的結構:
<properties>
<quarkus.version>0.21.1</quarkus.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-bom</artifactId>
<version>${quarkus.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.version}</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
對於使用輸入驗證構建簡單的REST應用程式,我們不需要太多模組。您可能已經注意到,我只聲明瞭兩個擴充套件,這與下面pom.xml
中的依賴項列表相同:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>
2. 建立應用程式 - 程式碼
對於Spring Boot或Micronaut使用者來說,可能有點奇怪的是,沒有使用靜態程式碼main方法的主執行類。resource/controller類實際上就是主類。Quarkus的resource/controller類和方法應該使用javax.ws.rs
庫中的註解進行標記。
下面是employee-service的REST controller 的實現:
@Path("/employees")
@Produces(MediaType.APPLICATION_JSON)
public class EmployeeController {
private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeController.class);
@Inject
EmployeeRepository repository;
@POST
public Employee add(@Valid Employee employee) {
LOGGER.info("Employee add: {}", employee);
return repository.add(employee);
}
@Path("/{id}")
@GET
public Employee findById(@PathParam("id") Long id) {
LOGGER.info("Employee find: id={}", id);
return repository.findById(id);
}
@GET
public Set<Employee> findAll() {
LOGGER.info("Employee find");
return repository.findAll();
}
@Path("/department/{departmentId}")
@GET
public Set<Employee> findByDepartment(@PathParam("departmentId") Long departmentId) {
LOGGER.info("Employee find: departmentId={}", departmentId);
return repository.findByDepartment(departmentId);
}
@Path("/organization/{organizationId}")
@GET
public Set<Employee> findByOrganization(@PathParam("organizationId") Long organizationId) {
LOGGER.info("Employee find: organizationId={}", organizationId);
return repository.findByOrganization(organizationId);
}
}
我們使用CDI進行依賴注入,使用SLF4J進行日誌記錄。 Controller類使用記憶體儲存庫bean儲存和檢索資料。Repository bean使用CDI @ApplicationScoped
註解,並注入controller:
@ApplicationScoped
public class EmployeeRepository {
private Set<Employee> employees = new HashSet<>();
public EmployeeRepository() {
add(new Employee(1L, 1L, "John Smith", 30, "Developer"));
add(new Employee(1L, 1L, "Paul Walker", 40, "Architect"));
}
public Employee add(Employee employee) {
employee.setId((long) (employees.size()+1));
employees.add(employee);
return employee;
}
public Employee findById(Long id) {
Optional<Employee> employee = employees.stream().filter(a -> a.getId().equals(id)).findFirst();
if (employee.isPresent())
return employee.get();
else
return null;
}
public Set<Employee> findAll() {
return employees;
}
public Set<Employee> findByDepartment(Long departmentId) {
return employees.stream().filter(a -> a.getDepartmentId().equals(departmentId)).collect(Collectors.toSet());
}
public Set<Employee> findByOrganization(Long organizationId) {
return employees.stream().filter(a -> a.getOrganizationId().equals(organizationId)).collect(Collectors.toSet());
}
}
最後一個元件是帶驗證的實體類:
public class Employee {
private Long id;
@NotNull
private Long organizationId;
@NotNull
private Long departmentId;
@NotBlank
private String name;
@Min(1)
@Max(100)
private int age;
@NotBlank
private String position;
// ... GETTERS AND SETTERS
}
3. 單元測試
對於大多數流行的Java框架,使用Quarkus進行單元測試非常簡單。如果您正在測試基於REST的web應用程式,您應該在pom.xml
中包含以下依賴項:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
讓我們分析一下來自organization-service(我們的另一個微服務,以及employee-service和department-service)的測試類。測試類應該用@QuarkusTest
註釋。我們可以通過@Inject
註解注入其他bean。其餘部分是典型的JUnit和RestAssured—我們正在測試controller公開的API方法。因為我們使用記憶體儲存庫,所以除了服務間通訊之外,我們不需要模擬任何東西(我們將在本文後面討論)。對於GET、POST方法,我們有一些積極的場景,還有一個不通過輸入驗證的消極場景(testInvalidAdd
)。
@QuarkusTest
public class OrganizationControllerTests {
@Inject
OrganizationRepository repository;
@Test
public void testFindAll() {
given().when().get("/organizations").then().statusCode(200).body(notNullValue());
}
@Test
public void testFindById() {
Organization organization = new Organization("Test3", "Address3");
organization = repository.add(organization);
given().when().get("/organizations/{id}", organization.getId()).then().statusCode(200)
.body("id", equalTo(organization.getId().intValue()))
.body("name", equalTo(organization.getName()));
}
@Test
public void testFindByIdWithDepartments() {
given().when().get("/organizations/{id}/with-departments", 1L).then().statusCode(200)
.body(notNullValue())
.body("departments.size()", is(1));
}
@Test
public void testAdd() {
Organization organization = new Organization("Test5", "Address5");
given().contentType("application/json").body(organization)
.when().post("/organizations").then().statusCode(200)
.body("id", notNullValue())
.body("name", equalTo(organization.getName()));
}
@Test
public void testInvalidAdd() {
Organization organization = new Organization();
given().contentType("application/json").body(organization).when().post("/organizations").then().statusCode(400);
}
}
4. 服務間通訊
由於Quarkus的目標是在Kubernetes上執行,因此它不提供任何對第三方服務發現(例如通過Consul 或Netflix Eureka)和與此發現整合的HTTP客戶機的內建支援。然而,Quarkus為REST通訊提供了專用的客戶端支援。要使用它,我們首先需要包括以下依賴性:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
</dependency>
Quarkus基於MicroProfile REST客戶機提供宣告性REST客戶機。您需要建立一個帶有所需方法的介面,並使用@RegisterRestClient
對其進行註解。其他註解與伺服器端非常相似。因為您使用@RegisterRestClient
來標記Quarkus,所以應該知道這個介面作為REST客戶機可用於CDI注入。
@Path("/departments")
@RegisterRestClient
public interface DepartmentClient {
@GET
@Path("/organization/{organizationId}")
@Produces(MediaType.APPLICATION_JSON)
List<Department> findByOrganization(@PathParam("organizationId") Long organizationId);
@GET
@Path("/organization/{organizationId}/with-employees")
@Produces(MediaType.APPLICATION_JSON)
List<Department> findByOrganizationWithEmployees(@PathParam("organizationId") Long organizationId);
}
現在,讓我們看一下organization-service內的controller類。與@Inject
一起,我們需要使用@RestClient
註解來正確地注入REST客戶機bean。之後,您可以使用介面方法來呼叫其他公開的服務
@Path("/organizations")
@Produces(MediaType.APPLICATION_JSON)
public class OrganizationController {
private static final Logger LOGGER = LoggerFactory.getLogger(OrganizationController.class);
@Inject
OrganizationRepository repository;
@Inject
@RestClient
DepartmentClient departmentClient;
@Inject
@RestClient
EmployeeClient employeeClient;
// ... OTHER FIND METHODS
@Path("/{id}/with-departments")
@GET
public Organization findByIdWithDepartments(@PathParam("id") Long id) {
LOGGER.info("Organization find: id={}", id);
Organization organization = repository.findById(id);
organization.setDepartments(departmentClient.findByOrganization(organization.getId()));
return organization;
}
@Path("/{id}/with-departments-and-employees")
@GET
public Organization findByIdWithDepartmentsAndEmployees(@PathParam("id") Long id) {
LOGGER.info("Organization find: id={}", id);
Organization organization = repository.findById(id);
organization.setDepartments(departmentClient.findByOrganizationWithEmployees(organization.getId()));
return organization;
}
@Path("/{id}/with-employees")
@GET
public Organization findByIdWithEmployees(@PathParam("id") Long id) {
LOGGER.info("Organization find: id={}", id);
Organization organization = repository.findById(id);
organization.setEmployees(employeeClient.findByOrganization(organization.getId()));
return organization;
}
}
通訊中缺少的最後一個東西是目標服務的地址。我們可以使用@RegisterRestClient
註解的欄位baseUri
來提供它們。然而,更好的解決方案似乎是將它們放在application.properties
中。屬性名需要包含客戶端介面的完全限定名和字尾mp-rest/url
。
pl.piomin.services.organization.client.DepartmentClient/mp-rest/url=http://localhost:8090
pl.piomin.services.organization.client.EmployeeClient/mp-rest/url=http://localhost:8080
在前一節中,我已經提到了單元測試和服務間通訊。要測試與其他應用程式通訊的API方法,我們需要模擬REST客戶機。下面是為模擬示例建立了DepartmentClient
。它應該只在測試期間可見,所以我們必須將它放在src/test/java
中。如果我們用@Mock
和@RestClient
註釋它,那麼預設情況下將自動使用這個bean,而不是在src/main/java
中定義的宣告性REST客戶機。
@Mock
@ApplicationScoped
@RestClient
public class MockDepartmentClient implements DepartmentClient {
@Override
public List<Department> findByOrganization(Long organizationId) {
return Collections.singletonList(new Department("Test1"));
}
@Override
public List<Department> findByOrganizationWithEmployees(Long organizationId) {
return null;
}
}
5. 監測和記錄
我們可以輕鬆地使用Quarkus公開健康檢查或API文件。API文件是使用OpenAPI/Swagger構建的。Quarkus利用了 SmallRye專案中可用的庫。我們應該在pom.xml
中包含以下依賴項:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-openapi</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-health</artifactId>
</dependency>
我們可以定義兩種型別的健康檢查:readiness 和liveness。有/health/ready
和/health/live
上下文路徑。要將它們公開到應用程式之外,我們需要定義一個實現MicroProfile HealthCheck
介面的bean。Readiness 端應該用@Readiness
標註,而liveness 端應該用@Liveness
標註。
@ApplicationScoped
@Readiness
public class ReadinessHealthcheck implements HealthCheck {
@Override
public HealthCheckResponse call() {
return HealthCheckResponse.named("Employee Health Check").up().build();
}
}
為了啟用Swagger文件,我們只需要新增一個依賴項即可。Quarkus還為Swagger提供了內建UI。預設情況下,它是在開發模式下啟用的,所以如果您願意在生產環境中使用它,您應該新增quarkus.swagger-ui.always-include=true
到您的application.properties
檔案。現在,如果通過執行Maven命令mvn compile quarkus:dev
在本地以開發模式執行應用程式employee-service,您可以在URLhttp://localhost:8080/swagger-ui下檢視可用的API規範。
這是我從應用程式啟動時的日誌。它列印監聽埠和載入的擴充套件列表。
6. 在本地機器上執行微服務
因為我們希望在同一臺機器上執行多個應用程式,所以需要覆蓋它們的預設HTTP監聽埠。雖然employee-service仍然在預設的8080
埠上執行,但是其他微服務使用不同的埠,如下所示。
department-service:
organization-service:
讓我們測試一下Swagger UI中的服務間通訊。我呼叫了GET /organizations/{id}/with-departments
,它呼叫由department-service公開的端點GET GET /departments/organization/{organizationId}
。結果如下圖所示。
7. 在OpenShift上執行微服務
我們已經完成了示例微服務體系結構的實現,並在本地機器上執行它們。現在,我們可以進行最後一步,並嘗試在 Minishift上部署這些應用程式。在OpenShift上部署Quarkus應用程式時,我們有一些不同的方法。今天,我將向您展示如何利用S2I為此構建的機制。
我們將使用Quarkus GraalVM Native S2I Builder。可以在 quai.io的 quarkus/ubi-quarkus-native-s2i
找到。當然,在部署應用程式之前,我們需要先啟動Minishift。根據Quarkus的文件,基於GraalVM的本機構建佔用了大量記憶體和CPU,所以我決定為Minishift設定6GB和4個核心。
$ minishift start --vm-driver=virtualbox --memor
此外,我們還需要稍微修改一下應用程式的原始碼。您可能還記得,我們使用JDK 11在本地執行它們。Quarkus S2I builder只支援JDK 8,所以我們需要在pom.xml
中更改它。我們還需要包括一個宣告的本機
配置檔案如下:
<properties>
<quarkus.version>0.21.1</quarkus.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
...
<profiles>
<profile>
<id>native</id>
<activation>
<property>
<name>native</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.version}</version>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<configuration>
<enableHttpUrlHandler>true</enableHttpUrlHandler>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.1</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<systemProperties>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
</systemProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
另外在application.properties
檔案需要修改兩處。我們不需要覆蓋埠號,因為 Minishift動態地為每個pod分配虛擬IP。服務間的通訊是通過OpenShift發現實現的,所以我們只需要設定服務的名稱而不是localhost。
quarkus.swagger-ui.always-include=true
pl.piomin.services.organization.client.DepartmentClient/mp-rest/url=http://department:8080
pl.piomin.services.organization.client.EmployeeClient/mp-rest/url=http://employee:8080
最後,我們可以將我們的應用程式部署到Minishift上。為此,你應使用oc
客戶端執行以下命令:
$ oc new-app quay.io/quarkus/ubi-quarkus-native-s2i:19.1.1~https://github.com/piomin/sample-quarkus-microservices.git#openshift --context-dir=employee --name=employee
$ oc new-app quay.io/quarkus/ubi-quarkus-native-s2i:19.1.1~https://github.com/piomin/sample-quarkus-microservices.git#openshift --context-dir=department --name=department
$ oc new-app quay.io/quarkus/ubi-quarkus-native-s2i:19.1.1~https://github.com/piomin/sample-quarkus-microservices.git#openshift --context-dir=organization --name=organization
正如您所看到的,可以在我的GitHub帳戶上找到找到程式原始碼,地址是https://github.com/piomin/sample-quarkus-microservices.git。在Minishift 上執行的版本已經在分支openshift中共享。在本地機器上執行的版本在主分支上可用。因為所有的應用程式都儲存在一個庫中,所以我們需要為每個部署定義一個引數context-dir
。
我很失望。雖然為minishift 設定更多的記憶體和CPU花費了我很長的時間——大約25分鐘。
然而,經過長時間的等待,我的所有應用程式終於都部署好了。
我通過執行下面可見的命令將它們公開在Minishift 外。可以使用DNS http://${APP_NAME}-myproject.192.168.99.100.nip.io
下的OpenShift路由測試它們。
$ oc expose svc employee
$ oc expose svc department
$ oc expose svc organization
此外,您還可以在OpenShift上啟用readiness 和liveness 健康檢查,因為它們在預設情況下是禁用的。
9月福利,關注公眾號
後臺回覆:004,領取8月翻譯集錦!
往期福利回覆:001,002, 003即可領取!
相關推薦
使用Quarkus在Openshift上構建微服務的快速指南
在我的部落格上,您有機會閱讀了許多關於使用Spring Boot或Micronaut之類框架構建微服務的文章。這裡將介紹另一個非常有趣的框架專門用於微服務體系結構,它越來越受到大家的關注– Quarkus。它是作為下一代Kubernetes/Openshift原生Java框架引入的。它構建在著名的Java標準
Maven安裝 &快速構建微服務項目
maven3 成功 open ext mis 創建 根目錄 unable 安裝 Maven安裝手冊 1、準備安裝包 安裝包: apache-maven-3.5.4-bin.zip (最好JDK 1.7及以上版本) 集成包: eclipse-maven3-plugi
構建微服務:快速搭建Spring Boot專案
Spring Boot簡介: Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力於在蓬勃發展的快速應用開發領域
可持續自動化構建微服務(10)SpringCloud 快速入門
第十章 SpringCloud 快速入門 按照官方的話說:Spring Cloud 為開發者提供了在分散式系統(如配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、一次性 Token、全域性鎖、決策競選、分散式會話和叢集狀態)操作的開發工具。最關鍵的是它足夠簡單,一般
可持續自動化構建微服務(1)快速搭建虛擬機器環境
1.1 軟體需求1) vagrant_1.9.6_x86_64.msi2) VirtualBox-5.1.24-117012-Win.exe3) vagrant-centos-7.2.box 1.2 準備工作1.2.1 安裝 virtualBox到 官 網 https://w
《Spring Boot揭祕:快速構建微服務體系》讀書筆記
第一章 瞭解微服務 火車模型:交付的服務就像一輛火車,這個服務相關的所有功能對應的專案成果,就是要裝上火車車廂的一件件貨物,交付的列車只有等到所有專案都開發測試完成之後才可以裝車觸發,完成這個服務的交付。 微服務的益處:獨立,進而可擴充套件性;多語言生態;
python程式設計基礎:快速微服務框架指南:flask:2: 使用頁面模版
在flask中可以像go和angular那樣使用頁面模版(template),可以將HTML頁面顯示進行模版化,通過引數傳遞與頁面進行資料互動。 概要資訊 事前準備:flask liumiaocn:flask liumiao$ whi
python程式設計基礎:快速微服務框架指南:flask:1: 簡介與Hello World
flask是一個純python實現的開源microframework,使用flask可以像java的spring boot一樣快速開始基於RestApi的微服務開發。 概要資訊 事前準備 python和pip [root@liu
Spring-Boot:Spring Cloud構建微服務架構
xmlns art 超時 客戶 微服務架構 cover lns created 搭建 概述: 從上一篇博客《Spring-boot:5分鐘整合Dubbo構建分布式服務》 過度到Spring Cloud,我們將開始學習如何使用Spring Cloud 來搭建微服務。繼續采
Chris Richardson微服務翻譯:構建微服務之微服務架構的進程通訊
標記 pac blog ural action 客戶端 靈活 dso 不兼容 Chris Richardson 微服務系列翻譯全7篇鏈接: 微服務介紹 構建微服務之使用API網關 構建微服務之微服務架構的進程通訊(本文) 微服務架構中的服務發現 微服務之事件驅動的數據管理
Spring Cloud構建微服務架構分布式配置中心
post ast github 構造 clas mas files cli .class 在本文中,我們將學習如何構建一個基於Git存儲的分布式配置中心,並對客戶端進行改造,並讓其能夠從配置中心獲取配置信息並綁定到代碼中的整個過程。 準備配置倉庫 準備一個git倉庫,可
SpringBoot構建微服務實戰
自動 als star wire 文件內容 date arc dem char 1. 創建一個Maven項目, 目錄結構: pom.xml文件內容如下: <project xmlns="http://maven.apache.org/POM/4.0
構建微服務架構Spring Cloud:服務註冊與發現(Eureka、Consul)
comm 簡介 foundry 架構 eas args 包含 什麽 其他 Spring Cloud簡介 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全
構建微服務架構Spring Cloud:服務消費(基礎)
成了 cloud framework shadow 即將 nbu 註冊中心 obj client 使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的與服務治理相關的抽象接口,包括DiscoveryClient、這裏我們即將介紹
構建微服務架構Spring Cloud:服務消費(Ribbon)
架構 pid 編寫 動手 tap consumer pre 攔截器 over Spring Cloud Ribbon Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。它是一個基於HTTP和TCP的客戶端負載均衡器。它可
構建微服務架構Spring Cloud:分布式配置中心
文件的 文件 項目 proc enc tid 部分 中心 並且 Spring Cloud Config是Spring Cloud團隊創建的一個全新項目,用來為分布式系統中的基礎設施和微服務應用提供集中化的外部配置支持,它分為服務端與客戶端兩個部分。其中服務端也稱為分布式配置
構建微服務架構Spring Cloud:服務消費(Feign)
進行 string oca 成對 rest server 之前 int netflix Spring Cloud Feign Spring Cloud Feign是一套基於Netflix Feign實現的聲明式服務調用客戶端。它使得編寫Web服務客戶端變得更加簡單。我們只需
Spring Cloud構建微服務架構—創建“服務註冊中心”
springboot springcloud mybatis eureka config 創建一個基礎的Spring Boot工程,命名為eureka-server,並在pom.xml中引入需要的依賴內容: <parent> <groupId>org.springf
Spring Cloud構建微服務架構服務註冊與發現
springboot springcloud mybatis eureka config Spring Cloud簡介Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局
Spring Cloud構建微服務架構-創建“服務提供方”
spring Spring Cloud Spring Boot config 下面我們創建提供服務的客戶端,並向服務註冊中心註冊自己。本文我們主要介紹服務的註冊與發現,所以我們不妨在服務提供方中嘗試著提供一個接口來獲取當前所有的服務信息。 首先,創建一個基本的Spring Boot應用。命名為