5.Spring Cloud快速入门
Ø微服务是一种架构方式,最终肯定需要技术架构去实施。
Ø微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?
Ø 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。
Ø 技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑。
Ø 群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。
Ø 使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架搭建
5.1简介
SpringCloud是Spring旗下的项目之一
https://spring.io/projects/spring-cloud
Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。
SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:
Netflix:微服务大规模的应用,在技术上毫无保留的把一整套微服务架构核心技术栈开源了出来,叫做Netflix OSS
Ø Eureka:注册中心
Ø Zuul:服务网关
Ø Ribbon:负载均衡
Ø Feign:服务调用
Ø Hystix:熔断器
以上只是其中一部分,架构图:
5.2 版本
SpringCloud的版本命名比较特殊,因为它不是一个组件,而是许多组件的集合,它的命名是以A到Z的为首字母的一些单词组成,也叫Train Version(火车头命名方式),每个版本是伦敦地铁站的名字,最新稳定版 Hoxton.SR7
我们在项目中,目前使用的版本
https://docs.spring.io/spring-cloud/docs/Hoxton.SR7/reference/html/
6微服务场景模拟
首先,我们需要模拟一个服务调用的场景。方便后面学习微服务架构
6.1创建父工程(project)
6.1.1 创建maven的project
6.1.2 修改pom文件
修改spring-cloud-learn/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>edu.xja</groupId>
<artifactId>spring-cloud-learn</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR7</spring-cloud.version>
<mysql.version>5.1.49</mysql.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!--lombok所有的子工程都有,而下面的需要在子工程中手动添加。-->
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
6.2服务提供者(module)
新建模块microservice-provider-user
选择刚创建的父工程cloud
然后Next
创建成功
microservice-provider-user/pom.xml文件中加入依赖
<dependencies>
<!--支持全栈web开发,里面包括了Tomcat和Spring-webmvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot 测试 依赖jar -->
<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-actuator</artifactId>
</dependency>
<!-- mybatis 依赖jar 这块可以挪到父工程中定义版本-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!-- mysql 依赖jar -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- swagger 依赖jar -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
然后将之前创建的工程provider-user中的src拷贝过来,其中的src就是你之前写好的springboot项目
如果有需要修改的地方修改一下
启动测试
6.3服务消费者(module)
创建module工程microservice-consumer-movie
consumer和provider是在同一级目录下,都在spring-cloud-learn父工程下。
创建成功后,我们看下spring-cloud-learn父工程的pom.xml
spring-cloud-learn/pom.xml
microservice-consumer-movie/pom.xml 加入依赖
<dependencies>
<!--支持全栈web开发,里面包括了Tomcat和Spring-webmvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot 测试 依赖jar -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
拷贝之前consumer-movie-resttemplate工程中src文件夹
添加controller
package edu.xja.controller;
import edu.xja.vo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
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;
import javax.annotation.Resource;
@RestController
@RequestMapping("/consumer")
@Slf4j
public class MovieController {
@Resource
private RestTemplate restTemplate;
@GetMapping("/user/{id}")
public User findById(@PathVariable Integer id) {
return restTemplate.getForObject("http://localhost:8888/user/" + id, User.class);
}
}
可以实验一下使用mvn编译多个工程
mvn clean package -Dmaven.test.skip=true
启动ConsumerApplication,老版本会出现提示如下图,新版本idea在view->tool windows->services中,或者右下角提示
在Dashboard中可以同时监控多个项目
启动后如下:
http://localhost:8080/consumer/user/3
小结:
provider:一个提供根据id查询用户的微服务
consumer:一个服务调用者,通过RestTemplate远程调用provider中的 UserController类中的getById(Long id)
存在什么问题?
在consumer中,我们把url地址硬编码到了代码中,不方便后期维护
consumer需要记忆provider的地址,如果出现变更,可能得不到通知地址将失效
consumer不清楚provider的状态,服务宕机也不知道。
provider只有1台服务,不具备高可用性
其实上面说的问题,概括一下就是分布式服务必然要面临的问题:
服务管理
Ø 如何自动注册和发现
Ø 如何实现状态监管
Ø 如何实现动态路由
Ø 服务如何实现负载均衡
Ø 服务如何解决容灾问题
Ø 服务如何实现统一配置
-1602570682310)]
存在什么问题?
在consumer中,我们把url地址硬编码到了代码中,不方便后期维护
consumer需要记忆provider的地址,如果出现变更,可能得不到通知地址将失效
consumer不清楚provider的状态,服务宕机也不知道。
provider只有1台服务,不具备高可用性
其实上面说的问题,概括一下就是分布式服务必然要面临的问题:
服务管理
Ø 如何自动注册和发现
Ø 如何实现状态监管
Ø 如何实现动态路由
Ø 服务如何实现负载均衡
Ø 服务如何解决容灾问题
Ø 服务如何实现统一配置
以上的问题,都将在SpringCloud中得到答案。