SpringCloud系列二:硬编码实现简单的服务提供者与服务消费者
从本文开始,以一个电影售票系统为例讲解Spring Cloud
1. 版本
jdk:1.8
SpringBoot:2.0.0.RELEASE
SpringCloud:Finchley.M8
2. 系统信息
使用Spring Data JPA作为持久层框架,使用H2作为数据库
3. 编写服务提供者
开发:
> 创建一个Spring Boot项目。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.itmuch.cloud</groupId>
<artifactId>microservice-simple-provider-user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.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-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
其中,spring-boot-starter-web提供了SpringMVC支持;spring-boot-starter-data-jpa提供了Spring Data JPA的支持。
> 准备好建表语句,在项目的resources目录下创建sql文件夹,在sql文件夹下建立schema.sql,并添加如下内容:
DROP TABLE user if EXISTS;
CREATE TABLE user (
id bigint generated BY DEFAULT AS IDENTITY,
username VARCHAR(40),
name VARCHAR(20),
age INT(3),
balance DECIMAL(10, 2),
PRIMARY KEY (id)
);
> 准备几条数据,在sql文件夹下创建data.sql,并添加如下内容:
INSERT INTO user (id, username, name, age, balance)
VALUES (1, 'account1', '张三', 20, 100.00);
INSERT INTO user (id, username, name, age, balance)
VALUES (2, 'account2', '李四', 28, 180.00);
INSERT INTO user (id, username, name, age, balance)
VALUES (3, 'account3', '王五', 32, 280.00);
> 创建用户实体类
package com.itmuch.cloud.microservicesimpleprovideruser.pojo; import javax.persistence.*;
import java.math.BigDecimal; @Entity
public class User { @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String username;
@Column
private String name;
@Column
private Integer age;
@Column
private BigDecimal balance; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public BigDecimal getBalance() {
return balance;
} public void setBalance(BigDecimal balance) {
this.balance = balance;
}
}
> 创建DAO
package com.itmuch.cloud.microservicesimpleprovideruser.dao; import com.itmuch.cloud.microservicesimpleprovideruser.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository; @Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
> 创建Controller
package com.itmuch.cloud.microservicesimpleprovideruser.controller; import com.itmuch.cloud.microservicesimpleprovideruser.dao.UserRepository;
import com.itmuch.cloud.microservicesimpleprovideruser.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; @RestController
public class UserController { @Autowired
private UserRepository userRepository; @GetMapping("/{id}")
public User findById(@PathVariable Long id) {
User findOne = userRepository.findById(id).get();
return findOne;
} }
> 编写配置文件。将application.properties重命名为application.yml。
server:
port: 8000
spring:
jpa:
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: none
datasource: # 指定数据源
platform: h2 # 指定数据源类型
url: jdbc:h2:mem:cloud # 指定h2数据库的连接地址
driver-class-name: org.h2.Driver # 指定h2数据库的驱动
username: root # 指定h2数据库的登录用户
password: 20121221 # 指定h2数据库的登录密码
schema: classpath:/sql/schema.sql # 指定h2数据库的建表脚本
data: classpath:/sql/data.sql # 指定h2数据库的数据脚本
h2:
console:
path: /h2-console
enabled: true
logging:
level:
org.hibernate: info
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
info:
app:
name: microservice-simple-provider-user
encoding: UTF-8
java:
source: 1.8
target: 1.8
测试:
在开发中整合了actuator模块,Spring Boot Actuator提供了很多监控端点。
具体可查看:http://www.cnblogs.com/jinjiyese153/p/8607895.html
> Spring Boot Actuator测试
启动Spring Boot项目,访问:http://localhost:8000/actuator/health,若如下图,则正常
(默认只展示状态,详细信息不展示。若想查看详细信息,可点击上方URL查看)

> 项目测试
启动Spring Boot项目,访问:http://localhost:8000/1,若如下图,则正常

4. 编写服务消费者
开发:
> 创建一个Spring Boot项目。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.itmuch.cloud</groupId>
<artifactId>microservice-simple-consumer-movie</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.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-actuator</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>
> 创建一个用户实体类
package com.itmuch.cloud.microservicesimpleconsumermovie.pojo;
import java.math.BigDecimal;
public class User {
private Long id;
private String username;
private String name;
private Integer age;
private BigDecimal balance;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
}
> 修改启动类
package com.itmuch.cloud.microservicesimpleconsumermovie; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @SpringBootApplication
public class MicroserviceSimpleConsumerMovieApplication { public static void main(String[] args) {
SpringApplication.run(MicroserviceSimpleConsumerMovieApplication.class, args);
} @Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
> 创建Controller,在其中使用RestTemplate请求用户微服务的API。
package com.itmuch.cloud.microservicesimpleconsumermovie.controller; import com.itmuch.cloud.microservicesimpleconsumermovie.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; @RestController
public class MovieController { @Autowired
private RestTemplate restTemplate; @GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://localhost:8000/" + id, User.class);
} }
> 编写配置文件。将application.properties重命名为application.yml。
server:
port: 8010
info:
app:
name: microservice-simple-consumer-movie
encoding: UTF-8
java:
source: 1.8
target: 1.8
测试:
在开发中同样整合了actuator模块
具体可查看:http://www.cnblogs.com/jinjiyese153/p/8607895.html
> Spring Boot Actuator测试
启动Spring Boot项目,访问:http://localhost:8010/actuator/health,若如下图,则正常

> 项目测试
启动Spring Boot项目,访问:http://localhost:8010/user/1,若如下图,则正常

5. 总结
在传统的应用程序中,一般都是这样做的。然而,这种方式存在问题。
1. 适用场景有限:如果服务提供者的网络地址(IP和端口)发生了变化,将会影响服务消费者。
2. 无法动弹伸缩:在生成环境中,每个微服务一般都会部署多个实例,从而实现容灾和负载均衡。在微服务架构的系统中,还需要系统具备自动伸缩的能力,例如动态增加节点等。硬编码无法适应这种需求。
将会在下一篇博客中,解决这些问题。敬请期待~~~
6. 参考
周立 --- 《Spring Cloud与Docker微服务架构与实战》
SpringCloud系列二:硬编码实现简单的服务提供者与服务消费者的更多相关文章
- springcloud的服务提供者与服务消费者
1.说明 springcloud中由服务消费者调用服务提供者一共有两种方法rest和feign 2.feign (1)使用feign的方式进行服务调,搭建服务提供者. 创建一个web项目(服务提供者) ...
- 《springcloud 一》搭建注册中心,服务提供者,服务消费者
注册中心环境搭建 Maven依赖信息 <parent> <groupId>org.springframework.boot</groupId> <artifa ...
- Spring Cloud(二)服务提供者 Eureka + 服务消费者(rest + Ribbon)
Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...
- SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
1.概念:Restful 基础架构 2.具体内容 对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为 了清 ...
- springcloud系列二 搭建注册中心启动
创建modul 然后就创建完成了 添加yml文件: server: port: eureka: client: register-with-eureka: false #单机版建议设置为false,设 ...
- 历史上最详细的SpringCloud搭建微服务的过程。(包括注册中心,服务提供者和服务消费者)
首先搭建注册中心,创建一个springboot的maven工程. 工程创建完成之后,先在资源文件中的application.properties中写配置文件. server.port= spring. ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- SpringCloud系列使用Eureka进行服务治理
1. 什么是微服务? "微服务"一词来自国外的一篇博文,网站:https://martinfowler.com/articles/microservices.html 如果您不能看 ...
- 学习一下 SpringCloud (二)-- 服务注册中心 Eureka、Zookeeper、Consul、Nacos
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
随机推荐
- virtualbox centos6.6 minimal 与宿主机win7共享文件夹
1.virtualbox, 设置-共享文件夹,设置好共享文件夹win7dir 2.centos 创建文件夹比如share 3.mount -t vboxsf win7dir /root/share 4 ...
- spark完整的数据倾斜解决方案
1.数据倾斜的原理 2.数据倾斜的现象 3.数据倾斜的产生原因与定位 在执行shuffle操作的时候,大家都知道,我们之前讲解过shuffle的原理. 是按照key,来进行values的数据的输出.拉 ...
- 树链剖分【p2590】[ZJOI2008]树的统计
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...
- sql with multiply where
I am wondering if this is a valid query: UPDATE table SET ID = 111111259 WHERE ID = 2555 AND SET ID ...
- 替换Ubuntu默认的登录背景
Ubuntu默认的登录背景看起来还是比较高贵的,但是作为一个爱折腾的人,当然要换成自己喜欢的背景图了.一开始跟着百度走,进了不少坑,最后还是自己走出来的.先上一个成品照 百度得到的答案几乎都是安装ub ...
- luogu P1075 质因数分解
题目描述 已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入输出格式 输入格式: 输入只有一行,包含一个正整数n. 输出格式: 输出只有一行,包含一个正整数p,即较大的那个质数. ...
- 【bzoj4950】【 [Wf2017]Mission Improbable】贪心+二分图匹配
(上不了p站我要死了,侵权度娘背锅) Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙.Patrick在编程竞赛 上豪赌输掉了一大笔钱 ...
- [BZOJ5110]Yazid的新生舞会
题目大意: 给你一个长度为$n(n\leq 5\times 10^5)$的序列$A_{1\sim n}$.求满足区间众数在区间内出现次数严格大于$\lfloor\frac{r-l+1}{2}\rflo ...
- steelray project viewer
steelray project viewer是一款英文语言软件,透过Steelray Project Viewer,可以打开.导航.浏览.打印Microsoft Project的.mpp文件.
- iOS网络编程--ASIHTTPRequest框架安装和配置-图文解说
ASIHTTPRequest框架是优秀的第三方Objective-C的HTTP框架,支持Mac OS X和iOS下的HTTP开发.技术支持网站是http://allseeing-i.com/ASIHT ...