SpringCloud微服务 之 Provider & Cosumer

前言

本小节我们将进入学习SpringCloud的预热阶段既学习与理解微服务中的服务提供者和消费者。

我们知道在微服务的架构体系中服务与服务间的通讯可以通过RestTamplate(Spring对RESTful API请求的一种简单封装)和Fegin(SpringCloug集成的声明式客户端,后面我们将学习到)。

此处我们对本节案例中涉及到的一些技术栈或知识点不做细数,学习的基础前提是大家对SpringBoot有比较好的了解并且对SpringCloud有一个整体认识。我们将模拟一个业务场景:微服务中有一个deal模块作为服务的提供者(Provider),有一个broker模块作为服务的消费者(Consumer)。broker通过RestTamplate消费deal即broker模块调用deal模块。

以上业务场景是一个在微服务中常见的服务调用场景。

案例

准备工作

本案包括以后的案例中我们都是使用的:使用STS IED开发。因为STS对Spring生态做了很好的扩展。

服务提供者业务实现

编写一个服务提供者的业务用于服务调用

项目结构

SpringCloud微服务 之 Provider & Cosumer_第1张图片

代码解读

使用STS 的Spring Starter Project构建Maven WEB项目(STS的SSP Plugin会将该项目构建成一个基于SpringBoot的web项目然后使用SpringCloud做一次封装)。

pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.example

microservice.deal

0.0.1-SNAPSHOT

jar

microservice-deal

Demo project for Spring Boot

org.springframework.boot

spring-boot-starter-parent

1.5.9.RELEASE

UTF-8

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-data-jpa

com.h2database

h2

org.springframework.boot

spring-boot-starter-actuator

org.springframework.boot

spring-boot-starter-test

org.springframework.cloud

spring-cloud-dependencies

Edgware.RELEASE

pom

import

org.springframework.boot

spring-boot-maven-plugin

为方便快速演示本案例将使用h2以及Spring JPA做DB和Persistence. properties.yml配置如下

server:

port: 8080

spring:

jpa:

generate-ddl: false

show-sql: true

hibernate:

ddl-auto: none

datasource: # 指定数据源

platform: h2 # 指定数据源类型

schema: classpath:schema.sql # 指定h2数据库的建表脚本

data: classpath:data.sql # 指定h2数据库的数据脚本

logging: # 配置日志级别,让hibernate打印出执行的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 获取订单信息

服务消费者业务实现

项目结构

SpringCloud微服务 之 Provider & Cosumer_第2张图片

代码解读

pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.example

microservice.deal.broker

0.0.1-SNAPSHOT

jar

microservice-deal-broker

Demo project for Spring Boot

org.springframework.boot

spring-boot-starter-parent

2.0.5.RELEASE

UTF-8

UTF-8

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

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 获取订单信息

SpringCloud微服务 之 Provider & Cosumer_第3张图片

小结

如上案例是一个在微服务中常用到的业务场景即一个服务消费另一个服务,只是实现地比较简单。同时这样实现也存在一些问题:

缺少服务注册和发现机制,无法保证服务的可用性。

存在着硬编码的问题,服务的可扩展性极低。

我们将在下一章节中学习服务的注册与发现机制。

你可能感兴趣的:(java,spring,cloud,微服务,java,程序人生,架构)