SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo
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,那里我们在做讲解。
今日分享:
如果打算爱一个人,你要想清楚,是否愿意为了他,放弃如上帝般自由的心灵,从此心甘情愿有了羁绊。
——菲茨杰拉德 《了不起的盖茨比》
- SpringCloud入门:03-SpringCloud实战-微服务注册和发现Eureka
- SpringCloud Finchley 实战入门(基于springBoot 2.0.3)【五 Hystrix 服务容错保护】
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- SpringCloud Finchley 实战入门(基于springBoot 2.0.3)【四 Ribbon 服务负载均衡】
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 一:springCloud服务发现者,服务消费者(方志朋《史上最简单的 SpringCloud 教程》专栏读后感)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- SpringCLoud实战微服务之——微服务简介以及入门使用
- SpringCloud实战之初级入门(二)— 服务注册与服务调用
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- SpringCloud Finchley 实战入门(基于springBoot 2.0.3)【八 config 微服务配置中心】
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- SpringCloud Finchley 实战入门(基于springBoot 2.0.3)【二 服务治理 Eureka】
- SpringCloud自学入门-服务提供者创建和服务中心高可用
- SpringCloud Finchley 实战入门(基于springBoot 2.0.3)【七 Fegin 声明式服务调用】
- Spring Cloud实战微服务入门
- Spring Cloud实战之初级入门(四)— 利用Hystrix实现服务熔断与服务监控