微服务:简单服务提供者与服务消费者

一、概念

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注解,如下图所示:


 重新启动访问项目:



简单的服务提供者与消费者完成。




猜你喜欢

转载自blog.csdn.net/moxiaoya1314/article/details/80038225