您的位置:首页 > 编程语言 > Java开发

SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo

2019-03-30 14:35 519 查看

SpringCloud-02-SpringCloud实战-创建简单的微服务demo

SpringCloud简介

SpringCloud:SpringCloud是基于SpringBoot的基础上构建的,用于快速构建分布式系统的通用模式的工具集

SpringCloud的特点:

  • 约定优于配置
  • 使用各种环境
  • 隐藏组件的复杂性
  • 开箱即用
  • 轻量级的组件
  • 组件丰富,功能齐全
  • 灵活

SpringCloud的版本:

不同于大多数的Spring项目都是以“主版本号.次版本号.增量版本号.里程牌版本号”的形式,SringCloud采用的是特殊的版本号:SpringCloud利用的是英文单词SRX(X为数字)来命名版本号。其中英文单词可以理解为主版本,而SR则是:"ServiceRelease"表示Bug修复,而数字表示第几次。

例如 Edgware SR4则是表明Edgware版本的第四次bug修复

SpringCloud 技术以及工具

SpringCloud的开发之前需要我们了解如下的技术:

  • java基础开发
  • SpringBoot的基础开发
  • Maven项目构建工具

服务提供者和服务消费者

在微服务中,我们可以用服务提供者和服务消费者来表示微服务之间的关系

服务提供者:提供服务的一方

服务消费者:调用服务的一方

下面我们利用IDEA来分布编写服务提供者和服务消费者

服务提供者:

1、新建一个Project


我们使用mybatis作为持久层框架,使用Mysql数据库

项目完成后如下:

2、编写pom文件,导入SpringCloud需要的依赖:
完整的pom文件如下:

<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springbootdemo</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>

<properties>
<project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<scope>runtime</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--添加spring cloud 依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencides</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

3、创建数据库以及对于的表:

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', 'limi', '123', '123');
INSERT INTO `user` VALUES ('2', 'io', '123', '123');

4、创建用户实体类

package com.springbootdemo.demo.model;

public class User {

private Integer id;
private String username;
private String password;
private String  phone;

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 getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}
}

5、创建Dao层访问数据库

package com.springbootdemo.demo.mapper;

import com.springbootdemo.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {

@Select(value="select * from user where id=#{id}")
public User select(Integer id);
}

6、创建service层和其实现层serviceImpl

UserService接口如下:

package com.springbootdemo.demo.service;

import com.springbootdemo.demo.model.User;

public interface UserService {

User select (Integer id );
}

UserServiceImpl接口实现如下:

package com.springbootdemo.demo.service.Impl;

import com.springbootdemo.demo.mapper.UserMapper;
import com.springbootdemo.demo.model.User;
import com.springbootdemo.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

@Override
public User select (Integer id){
return userMapper.select(id);
}
}

7、创建Controller如下:

package com.springbootdemo.demo.controller;

import com.springbootdemo.demo.model.User;
import com.springbootdemo.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;

@RequestMapping("/select/{id}")
public User select(@PathVariable Integer id){
return userService.select(id);
}

}

8、编写application.yml配置文件如下:

spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver

#配置数据源
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver

9、完整的项目结构如下显示:

10、在postman中访问http://127.0.0.1:8080/user/select/1,可以得到如下的结果:

服务消费者:

服务消费者主要使用的是RestTemplate来访问对应的微服务的api接口,从而查询到指定的微服务提供的数据

1、新建一个springcloude项目 主要的步骤和服务提供者的类似,并且其pom文件导入的依赖也和上面的相同。这里不再赘述:直接给出项目的完整的结构图:
注意:这里的pom不需要再和之前一样导入mybatis的依赖,否则会报数据库没有配置的错误,完整的pom文件如下:

<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springCloudDemo</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>

<properties>
<project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.mybatis.spring.boot</groupId>-->
<!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--<version>2.0.0</version>-->
<!--</dependency>-->

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--添加spring cloud 依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencides</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>

2158d
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

2、创建Pojo类

package com.springclouddemo.demo.pojo;

public class User {

private Integer id;
private String username;
private String password;
private String phone;

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 getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}
}

3、application.yml的配置文件如下:

server:
#  注意这里的端口和服务提供者的不能是同一个端口
port: 8082

4、主启动类如下:

package com.springclouddemo.demo;

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 DemoApplication {

@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

}

5、Controller创建如下:

package com.springclouddemo.demo.controller;

import com.springclouddemo.demo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class Usercontroller {
@Autowired
private RestTemplate restTemplate;

@RequestMapping("/user/select/{id}")
public User select(@PathVariable Integer id){
return this.restTemplate.getForObject("http://localhost:8080/user/select/"+id,User.class);
}

}

6、启动:注意要先启动服务提供者,才可以启动服务消费者

然后在postman中访问服务消费者的端口:http://127.0.0.1:8082/user/select/1
注意:8082是服务消费者的端口,而8080是服务提供者的端口,但是这里我们通过服务消费者来访问服务提供者的服务,就是最简单的微服务的调用。

思考

我们这个简单demo中服务消费者使用服务提供者的微服务是利用RestTemplate的模板,我们的地址也是用的直接的地址:http://localhost:8080/user/sleect/{#id}。
但是在实际的开发过程中,这种硬编码的方式基本是不可取的,仔细想想要是我们服务提供者的服务地址发生了改变,我们的服务调用者就要重新修改地址然后来调用服务,是不是觉得非常的繁杂和低效,SpringCloud当然知道这个问题,所以给我们一个服务发现组件-来进行服务的注册和发现,但是这些要在Eureka,Zookeeper,那里我们在做讲解。

今日分享:

如果打算爱一个人,你要想清楚,是否愿意为了他,放弃如上帝般自由的心灵,从此心甘情愿有了羁绊。
——菲茨杰拉德 《了不起的盖茨比》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐