1. 简介

Spring Cloud现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路 由,负载均衡,熔断器,控制总线,集群状态等等功能。

架构图:

springcloud 多模块打包部署 springcloud工程模块划分_spring cloud

  • Eureka:注册中心
  • Zuul:服务网关
  • Ribbon:负载均衡
  • Feign:服务调用
  • Hystrix:熔断器

Spring Clound 和Spring Boot版本对应关系

springcloud 多模块打包部署 springcloud工程模块划分_spring_02

2. 微服务场景模拟

2.1. 创建父工程

微服务中需要同时创建多个项目,为了方便课堂演示,先创建一个父工程,后续的工程都以这个工程为父,使用 Maven的聚合和继承。统一管理子工程的版本和配置

<?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.lxs</groupId>
    <artifactId>lxs-springcloud</artifactId>
    <packaging>pom</packaging><!--聚合父工程-->
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version><!--注意:spring clound和spring boot 的版本对应 greenwich版本clound对应spring boot 2.1.x-->
        <relativePath/>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        <mapper.starter.version>2.1.5</mapper.starter.version>
        <mysql.version>5.1.46</mysql.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- springCloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 通用Mapper启动器 -->
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>${mapper.starter.version}</version>
            </dependency>
            <!-- mysql驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
       
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

这里已经对大部分要用到的依赖的版本进行了 管理,方便后续使用

3.2.服务提供者

我们新建一个项目,对外提供查询用户的服务。

3.2.1.创建Module

选中lxs-springclound,创建子工程:
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>

    <parent>
     <artifactId>lxs-springcloud</artifactId>
     <groupId>com.lxs</groupId> 						   
     <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>user-service</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
  </project>

项目结构

springcloud 多模块打包部署 springcloud工程模块划分_spring cloud_03

3.2.2.编写配置文件

创建 user-service\src\main\resources\application.yml 属性文件,这里我们采用了yaml语法,而不是 properties:

server:
 port: 9091
 spring:
 datasource:
 driver-class-name: com.mysql.jdbc.Driver
 url: jdbc:mysql://localhost:3306/springclound
 username: root
 password: root 
mybatis: type-aliases-package: com.lxs.user.pojo

使用Mysql图形界面工具,导入springclound.sql脚本
启动类

@SpringBootApplication
@MapperScan("com.lxs.user.mapper") 
public class UserApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserApplication.class, args); 
	} 
}

实体类

@Data 
@Table(name = "tb_user")
	public class User{
	// id
	@Id 
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id; // 用户名 
	private String userName;
	// 密码 
	private String password;
	// 姓名 
	private String name;
	// 年龄 
	private Integer age;
	// 性别,1男性,2女性 
	private Integer sex;
	// 出生日期 
	private Date birthday;
	// 创建时间 
	private Date created;
	// 更新时间 
	private Date updated;
	// 备注 
	private String note;
}

UserMapper

public interface UserMapper extends Mapper<User> {
 }

service:

@Service 
	public class UserService { 
		@Autowired private UserMapper userMapper;
		public User queryById(Long id) { 
		return this.userMapper.selectByPrimaryKey(id);
		} 
	}

controller
对外提供REST风格web 服务,根据id查询用户

@RestController 
@RequestMapping("/user") 
	public class UserController { 
		@Autowired 
		private UserService userService; 
		
		@GetMapping("/{id}") 
		public User queryById(@PathVariable Long id){
		return userService.queryById(id); 
		}
	}

完成上述代码后的项目结构

springcloud 多模块打包部署 springcloud工程模块划分_spring boot_04

3.2.4. 启动并测试

启动项目,访问http://localhost:9091/user/7

springcloud 多模块打包部署 springcloud工程模块划分_springcloud 多模块打包部署_05

4. 服务调用者

4.1.创建工程

与上面类似,这里不再赘述,需要注意的是,我们调用 user-service 的功能,因此不需要Mybatis相关依赖了 拷贝之前的user-service 模块,更改响应的坐标

<?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">
	
	<parent>
		<artifactId>lxs-springcloud</artifactId>
		<groupId>com.lxs</groupId>
		<version>1.0-SNAPSHOT</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>
	
	<artifactId>consumer-demo</artifactId>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
	</dependencies>
</project>

项目结构如下:

springcloud 多模块打包部署 springcloud工程模块划分_springcloud 多模块打包部署_06

4.2. 编写代码

启动器:

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

Spring提供了一个RestTemplate模板工具类,对基于HTTP的客户端进行了封装,并且实现了对象与json的序列化 和反序列化,非常方便。RestTemplate并没有限定HTTP的客户端类型,而是进行了抽象,目前常用的3种都有支 持:

  • HTTPClient
  • OkHTTP
  • JDK原生的URLConnection(默认的)

实体类

@Data
public class User { 
	private Long id;
	// 用户名 
	private String userName;
	// 密码 
	private String password;
	// 姓名 
	private String name;
	// 年龄 
	private Integer age; 
	// 性别,1男性,2女性 
	private Integer sex;
	// 出生日期 
	private Date birthday;
	// 创建时间 
	private Date created;
	// 更新时间 
	private Date updated;
	// 备注 
	private String note;
}

controller

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
	@Autowired 
	private RestTemplate restTemplate;
		
	@GetMapping("/{id}") 
	public User queryById(@PathVariable Long id){
		String url = "HTTP://localhost:9091/user/" + id;
		return restTemplate.getForObject(url, User.class);
	}
}

4.3.启动测试:

springcloud 多模块打包部署 springcloud工程模块划分_springcloud 多模块打包部署_07


一个简单的远程服务调用案例就实现了。