SpringCloud微服務 之 Provider & Cosumer

前言

本小節(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)機制。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容