前言
本小節(jié)我們將進(jìn)入學(xué)習(xí)SpringCloud的預(yù)熱階段既學(xué)習(xí)與理解微服務(wù)中的服務(wù)提供者和消費者。
我們知道在微服務(wù)的架構(gòu)體系中服務(wù)與服務(wù)間的通訊可以通過RestTamplate(Spring對RESTful API請求的一種簡單封裝)和Fegin(SpringCloug集成的聲明式客戶端掌眠,后面我們將學(xué)習(xí)到)奏赘。
此處我們對本節(jié)案例中涉及到的一些技術(shù)椓壬粒或知識點不做細(xì)數(shù),學(xué)習(xí)的基礎(chǔ)前提是大家對SpringBoot有比較好的了解并且對SpringCloud有一個整體認(rèn)識磨淌。我們將模擬一個業(yè)務(wù)場景:微服務(wù)中有一個deal模塊作為服務(wù)的提供者(Provider)疲憋,有一個broker模塊作為服務(wù)的消費者(Consumer)。broker通過RestTamplate消費deal即broker模塊調(diào)用deal模塊梁只。
以上業(yè)務(wù)場景是一個在微服務(wù)中常見的服務(wù)調(diào)用場景缚柳。
案例
準(zhǔn)備工作
本案包括以后的案例中我們都是使用的:使用STS IED開發(fā)。因為STS對Spring生態(tài)做了很好的擴展搪锣。
服務(wù)提供者業(yè)務(wù)實現(xiàn)
編寫一個服務(wù)提供者的業(yè)務(wù)用于服務(wù)調(diào)用
項目結(jié)構(gòu)
代碼解讀
使用STS 的Spring Starter Project構(gòu)建Maven WEB項目(STS的SSP Plugin會將該項目構(gòu)建成一個基于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 獲取訂單信息
服務(wù)消費者業(yè)務(wù)實現(xiàn)
項目結(jié)構(gòu)
代碼解讀
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é)
如上案例是一個在微服務(wù)中常用到的業(yè)務(wù)場景即一個服務(wù)消費另一個服務(wù)淤翔,只是實現(xiàn)地比較簡單翰绊。同時這樣實現(xiàn)也存在一些問題:
缺少服務(wù)注冊和發(fā)現(xiàn)機制,無法保證服務(wù)的可用性旁壮。
存在著硬編碼的問題监嗜,服務(wù)的可擴展性極低。
我們將在下一章節(jié)中學(xué)習(xí)服務(wù)的注冊與發(fā)現(xiàn)機制抡谐。