一、概念
1.服务提供者:被其他微服务调用的微服务
2.服务消费者:调用的其他微服务的微服务
二、服务提供者
首先打开http://start.spring.io,如下图所示,
如下图,创建报名,项目名
最后点击下方的“Generate Project”按钮, 将会生成 zip包。
我们打开编辑器,我这边使用的是STS ,打开软件导入项目,
1、导入maven 项目,选择解压后的文件目录
2、配置maven
3、创建sql数据库及表 和 表数据
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.wyt.cloud</groupId>
<artifactId>microservice-simple-provider-user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>microservice-simple-provider-user</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.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>
<repositories><!-- 代码库 -->
<repository>
<id>maven-ali</id>
<url>http://maven.aliyun.com/nexus/content/groups/public//</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
schema.sql 建表
data.sql 表数据
下面我们新建一个实体类User,目录结构如下图所示,需要注意的是,由于我们这里用的是Mysql,因此@GeneratedValue策略要使用Mysql的主键生成策略,不同的数据库主键生成策略不同。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String username;
@Column
private String name;
@Column
private Short age;
@Column
private BigDecimal balance;
public Integer getId() {
return id;
}
public void setId(Integer 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 Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
}
创建一个接口类UserRepository(也就是我们所熟悉的Dao),如下图所示,之所以让UserRepository继承JpaRepository是为了直接使用JpaRepository的接口方法,而不必自己再写接口了。
public interface UserRepository extends JpaRepository<User, Integer> {
}
创建UserController.java
// @RestController 相当于@Controller 和 @Response两个注解
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
// @GetMapping 相当于 @RequestMapping(value="/simple/{id}", method = RequestMethod.GET)
@GetMapping("/simple/{id}")
public User findById(@PathVariable Integer id) {
return this.userRepository.findById(id).orElse(null);
}
}
application.yml 配置
server:
port: 8787
spring:
jpa:
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: none
datasource:
platform: mysql
url: jdbc:mysql://localhost:3306/dbdemo?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 12345
driver-class-name: com.mysql.jdbc.Driver
schema: classpath:schema.sql
data: classpath:data.sql
logging:
level:
root: INFO
org.hibernate: INFO
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
com.itmuch: DEBUG
application.yml文件中配置的内容如下,下面说下配置的意思,
首先port:8787的意思是访问端口,
generate-ddl: false表示sping启动的时候不自动生成增删改查接口(因为我们自己会写增删改查接口),
show-sql: true表示会在控制台输出sql语句,
hibernate.ddl-auto: none的意思是hibernate加载的时候也不自动生成增删改查接口。
datasource.platform: mysql表示使用的数据库是mysql,(注意:datasource.url、datasource.username、datasource.password、datasource.driver-class-name这四项配置是在非H2数据库的情况下必须配置的,我们使用的是mysql,因此配置的也是mysql数据库的信息,如果使用的是别的数据库相应的做调整就可以了。另外,由于查询数据库可能会出现乱码情况,因此我们在驱动jdbc:mysql://localhost:3306/microservice后面加上了"?useUnicode=true&characterEncoding=utf-8&useSSL=false"这句编码配置)
datasource.schema: classpath:schema.sql表示指定建表的sql文件,
datasource.data: classpath:data.sql表示指定插入数据的sql文件。
logging下面配置的是日志的输出级别,其中关于sql的那两个配置跟show-sql: true是基本一样的。
在spring boot中有一种规定,那就是启动类必须与controller、entity、repository在同一级!否则会有问题!
下面俩运行程序,MicroserviceSimpleProviderUserApplication 文件右击Run as 选择spring boot app
当看到如下图所示的启动信息,表示启动成功。
输入地址 http://localhost:8787/simple/1 可以看到如下图所示的界面,说明我们的服务提供者部署成功了!!!
三、服务消费者
同样打开http://start.spring.io/ 创建项目 这里我们只选择 web
同样导入项目, 首先创建个User实体
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String name;
private Short age;
private BigDecimal balance;
public Integer getId() {
return id;
}
public void setId(Integer 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 Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
}
MovieController.java
在这里使用RestTempalte
ResponseEntity<SsoUrlPrm>result = restTemplate.getForEntity(requestPathUrl,SsoUrlPrm.class);
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/movie/{id}")
public ResponseEntity<User> findById(@PathVariable Integer id) {
return this.restTemplate.getForEntity("http://127.0.0.1:8787/simple/" + id, User.class);
}
}
application.yml
server:
port: 8789
启动项目,然后访问地址:http://localhost:8789/movie/1 后台会报错
Description:
Field restTemplate in com.itmuch.cloud.controller.MovieController required a bean of type 'org.springframework.web.client.RestTemplate' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.web.client.RestTemplate' in your configuration.
这是因为没有找到RestTemplate的实例,因此为了解决该问题,我们在movie的启动类中添加RestTemplate的Bean注解,如下图所示:
重新启动访问项目:
简单的服务提供者与消费者完成。