SpringCloud认知
# Spring Cloud 认知
Spring Cloud 是一系列框架的集合,它整合了优秀框架到自己项目中。其中实现了:配置管理、服务发现、智能路由、负载均衡、熔断器、控制总线等功能。
主要涉及到的组件:
Eureka
:服务注册中心,用于服务管理Ribbon
:基于客户端的负载均衡组件Hystrix
:容错框架,能够防止服务的雪崩效应Feign
:Web 服务客户端,能够简化 HTTP 接口的调用Zuul
:API 网关,提供路由转发、请求过滤等功能Config
:分布式配置管理Sleuth
:服务跟踪Stream
:构建消息驱动的微服务应用程序的框架Bus
:消息代理的集群消息总线
# Spring Cloud版本
Spring Cloud 是个众多 子项目 综合起来的大项目,因此对 微服务构架 解决方案有 综合的组件,其中组件之间都是独立的,它们各自维持着自己版本号的 迭代与更新
Spring Cloud 和 Spring Boot版本 对应关系
Release Train | Boot Version |
---|---|
Hoxton | 2.2.x |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
# 首次应用
微服务模拟场景
微服务是由多个子项目组合而成的父项目。以下首次应用模拟 服务 提供 和 调用 应用(查数据测试
创建 ==父项目== 无骨架Maven项目
配置父项目
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.sans</groupId> <artifactId>springcloud-father</artifactId> <!--配置 聚合父工程--> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>user-service</module> <module>consumer-demo</module> </modules> <!--配置 父项目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> </parent> <!--Spring 与 Spring Cloud 版本号必须对应--> <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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
<dependencyManagement>
可统一配置 子项目的版本号 (子项目无需在进行版本号的锁定- Spring Cloud 和 Spring Boot 版本 必须严格对应指定版本
- 配置该项目为聚合父工程
<packaging>pom</packaging>
在父项目下创建 ==提供者== 无骨架Maven项目(用于 用户业务操作服务
提供者项目
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"> <parent> <artifactId>springcloud-father</artifactId> <groupId>com.sans</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>
组件依赖的版本号由父项目的pom进行配置
提供者项目 大致流程 (opens new window) (==controller、mapper、pojo、service、启动类 组件==
- 配置需要改 端口号 , 提供者 和 调用者 端口以防冲突
- controller提供的接口: http://localhost:80/user/2 (按ID查用户)
在父项目下创建 ==调用者== 无骨架Maven项目 (通过提供者获取接口进行 用户业务操作服务
调用者项目 只需 ==添加web依赖 、模板方法、实体pojo、contoller==
调用者项目
pom.xml
<!--调用者只需一个web依赖--> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
调用者项目 启动器类 添加模板工具方法
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
调用者项目 contoller ( pojo的User实体类、端口无配置默认8080
@RestController @RequestMapping("consumer") public class ConsumerController { @Autowired private RestTemplate restTemplate; @RequestMapping("{id}") public User findById(@PathVariable Long id) { String url = "HTTP://localhost:9091/user/"+id; return restTemplate.getForObject(url , User.class); } }
Spring提供了一个 RestTemplate模板工具类,对基于HTTP的客户端进行了封装,并且实现了 对象 与 json的序列化 、反序列化,非常方便。RestTemplate并没有限定HTTP的客户端类型,而是进行了抽象,目前常用的3种都有支持:
- HTTPClient
- OkHTTP
- JDK原生的URLConnection(默认的)
测试 分别启动两个子项目
通过 调用者接口中应用 提供者的接口
访问 http://localhost:8080/consumer/2 (按ID查用户)
仓库代码 : https://gitee.com/Bozhu12/spring-cloud-examples.git (opens new window)