一、概念
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注解,如下图所示:
重新启动访问项目:
简单的服务提供者与消费者完成。