前言
本小節(jié)我們將進入學習SpringCloud的預熱階段既學習與理解微服務中的服務提供者和消費者。
我們知道在微服務的架構體系中服務與服務間的通訊可以通過RestTamplate(Spring對RESTful API請求的一種簡單封裝)和Fegin(SpringCloug集成的聲明式客戶端,后面我們將學習到)。
此處我們對本節(jié)案例中涉及到的一些技術?;蛑R點不做細數(shù),學習的基礎前提是大家對SpringBoot有比較好的了解并且對SpringCloud有一個整體認識。我們將模擬一個業(yè)務場景:微服務中有一個deal模塊作為服務的提供者(Provider),有一個broker模塊作為服務的消費者(Consumer)。broker通過RestTamplate消費deal即broker模塊調(diào)用deal模塊。
以上業(yè)務場景是一個在微服務中常見的服務調(diào)用場景。
案例
準備工作
本案包括以后的案例中我們都是使用的:使用STS IED開發(fā)。因為STS對Spring生態(tài)做了很好的擴展。
服務提供者業(yè)務實現(xiàn)
編寫一個服務提供者的業(yè)務用于服務調(diào)用
項目結(jié)構
代碼解讀
使用STS 的Spring Starter Project構建Maven WEB項目(STS的SSP Plugin會將該項目構建成一個基于SpringBoot的web項目然后使用SpringCloud做一次封裝)。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>microservice.deal</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>microservice-deal</name>
<description>Demo project for Spring Boot</description>
<!-- 引入spring boot的依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<!-- 引入spring cloud的依賴 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 添加spring-boot的maven插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
為方便快速演示本案例將使用h2以及Spring JPA做DB和Persistence. properties.yml配置如下
server:
port: 8080
spring:
jpa:
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: none
datasource: # 指定數(shù)據(jù)源
platform: h2 # 指定數(shù)據(jù)源類型
schema: classpath:schema.sql # 指定h2數(shù)據(jù)庫的建表腳本
data: classpath:data.sql # 指定h2數(shù)據(jù)庫的數(shù)據(jù)腳本
logging: # 配置日志級別,讓hibernate打印出執(zhí)行的SQL
level:
root: INFO
org.hibernate: INFO
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
## INFO
info:
app:
name: @project.artifactId@
encoding: @project.build.sourceEncoding@
java:
source: @java.version@
target: @java.version@
management:
security:
enabled: false
Controler
@RestController
public class DealController {
@Autowired
private DealRepository dealRepository;
@GetMapping("/{id}")
public Deal findById(@PathVariable Long id) {
Deal findOne = this.dealRepository.findOne(id);
return findOne;
}
}
訪問 http://localhost:8080/1 獲取訂單信息
服務消費者業(yè)務實現(xiàn)
項目結(jié)構
代碼解讀
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>microservice.deal.broker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>microservice-deal-broker</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
properties.yml
server:
port: 8010
controller
@RestController
public class BrokerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/deal/{id}")
public Deal findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://localhost:8080/" + id, Deal.class);
}
}
訪問?
http://localhost:8010/deal/1 獲取訂單信息
小結(jié)
如上案例是一個在微服務中常用到的業(yè)務場景即一個服務消費另一個服務,只是實現(xiàn)地比較簡單。同時這樣實現(xiàn)也存在一些問題:
缺少服務注冊和發(fā)現(xiàn)機制,無法保證服務的可用性。
存在著硬編碼的問題,服務的可擴展性極低。
我們將在下一章節(jié)中學習服務的注冊與發(fā)現(xiàn)機制。