SpringCloud
-
能够理解SpringCloud作用
- 用来做微服务架构的技术解决方案
- SpringCloud基于SpringBoot开发的,SpringCloud整合了很多优秀的第三方微服务开源框架
-
能够使用RestTemplate发送请求
- 封装了基于Rest的Http请求[实现Http请求]
- 可以实现Java对象序列化与反序列化[序列化与反序列化]
-
能够搭建Eureka注册中心
- 用于管理服务、监控服务、服务路由
-
项目注册:服务提供者注册、服务消费者注册、Eureka注册中心(Zookeeper)
-
能够使用Ribbon负载均衡
- 用来实现负载均衡(实现消费方负载均衡)
-
能够使用Hystrix熔断器
- 做服务降级,防止程序发生雪崩
1 初识Spring Cloud
大家谈起的微服务,大多来讲说的只不过是种架构方式。其实现方式很多种:Spring Cloud,Dubbo,华为的Service Combo,Istio 。
那么这么多的微服务架构产品中,我们为什么要用Spring Cloud?因为它后台硬、技术强、群众基础好,使用方便;
1.1 目标
- 了解微服务架构
- 了解SpringCloud技术
1.2 讲解
1.2.1 技术架构演变
(1)单一应用架构
当网站流量很小时,只需要一个应用,所有功能部署在一起,减少部署节点成本的框架称之为集中式框架。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。
(2)垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
(3)分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
(4)面向服务(SOA)架构
典型代表有两个:流动计算架构和微服务架构;
流动计算架构:
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。流动计算架构的最佳实践阿里的Dubbo。
微服务架构
与流动计算架构很相似,除了具备流动计算架构优势外,微服务架构中的微服务可以独立部署,独立发展。且微服务的开发不会限制于任何技术栈。微服务架构的最佳实践是SpringCloud。
1.2.2 SpringCloud简介
(1)SpringCloud介绍
Spring Boot擅长的是集成,把世界上最好的框架集成到自己项目中
Spring Cloud本身也是基于SpringBoot开发而来,SpringCloud是一系列框架的有序集合,也是把非常流行的微服务的技术整合到一起,是属于微服务架构的一站式技术解决方案。
Spring Cloud包含了:
注册中心:Eureka、consul、Zookeeper
负载均衡:Ribbon
熔断器:Hystrix
服务通信:Feign
网关:Gateway
配置中心 :config
消息总线:Bus
集群状态等等…功能。
Spring Cloud协调分布式环境中各个微服务,为各类服务提供支持。
(2)Spring Cloud的版本
版本说明:
SpringCloud是一系列框架组合,为了避免与框架版本产生混淆,采用新的版本命名方式,形式为大版本名+子版本名称
大版本名用伦敦地铁站名
子版本名称三种
SNAPSHOT:快照版本,尝鲜版,随时可能修改
M版本,MileStone,M1表示第一个里程碑版本,一般同时标注PRE,表示预览版
SR,Service Release,SR1表示第一个正式版本,同时标注GA(Generally Available),稳定版
(3)SpringCloud与SpringBoot版本匹配关系
SpringBoot | SpringCloud |
---|---|
1.2.x | Angel版本 |
1.3.x | Brixton版本 |
1.4.x | Camden版本 |
1.5.x | Dalston版本、Edgware |
2.0.x | Finchley版本 |
2.1.x | Greenwich GA版本 (2019年2月发布) |
鉴于SpringBoot与SpringCloud关系,SpringBoot建议采用2.1.x版本
1.3 小结
- 微服务架构:就是将相关的功能独立出来,单独创建一个项目,并且连数据库也独立出来,单独创建对应的数据库。本质:将相关独立的业务完全独立出来,对应的工程和数据库也完全独立出来。
- Spring Cloud本身也是基于SpringBoot开发而来,SpringCloud是一系列框架的有序集合,也是把非常流行的微服务的技术整合到一起。
2 服务调用方式
2.1 目标
- 理解RPC和HTTP的区别
- 能使用RestTemplate发送请求(发送Http请求)
2.2 讲解
2.2.1 RPC和HTTP
常见远程调用方式:
RPC:(Remote Produce Call)远程过程调用
1.基于Socket
2.自定义数据格式
3.速度快,效率高
4.典型应用代表:Dubbo,WebService,ElasticSearch集群间互相调用
HTTP:网络传输协议
1.基于TCP/IP
2.规定数据传输格式
3.缺点是消息封装比较臃肿、传输速度比较慢
4.优点是对服务提供和调用方式没有任何技术限定,自由灵活,更符合微服务理念
RPC和HTTP的区别:RPC是根据语言API来定义,而不是根据基于网络的应用来定义。
Http客户端工具
常见Http客户端工具:HttpClient(发送Http请求)、OKHttp(发送Http请求)、URLConnection(发送Http请求)。
2.2.2 Spring的RestTemplate
(1)RestTemplate介绍
- RestTemplate是Rest的HTTP客户端模板工具类
- 对基于Http的客户端进行封装
- 实现对象与JSON的序列化与反序列化(JSON<->JavaBean)
- 不限定客户端类型,目前常用的3种客户端都支持:HttpClient、OKHttp、JDK原生URLConnection(默认方式)
(2)RestTemplate入门案例
我们可以使用RestTemplate实现上图中的请求,springcloud-day1-resttemplate
通过发送请求,请求springcloud-day1-provider
的/user/list
方法。
(1)搭建springcloud-day1-provider
这里不演示详细过程了,大家直接使用IDEA搭建一个普通的SpringBoot工程即可。
坐标
<groupId>com.itheima</groupId>
<artifactId>springcloud-day1-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
pom.xml依赖
<!--父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
创建com.itheima.domain.User
public class User implements Serializable {
private String name;
private String address;
private Integer age;
public User() {
}
public User(String name, String address, Integer age) {
this.name = name;
this.address = address;
this.age = age;
}
//..get set toString 略
}
application.properties
server.port=18081
创建com.itheima.controller.UserController
,代码如下:
@RestController
@RequestMapping(value = "/user")
public class UserController {
/***
* 提供服务
* @return
*/
@RequestMapping(value = "/list")
public List<User> list(){
List<User> users = new ArrayList<User>();
users.add(new User("王五", "深圳", 25));
users.add(new User("李四", "北京", 23));
users.add(new User("赵六", "上海", 26));
return users;
}
}
创建启动类,并启动工程
@SpringBootApplication
public class SpringcloudDay1ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudDay1ProviderApplication.class, args);
}
}
访问:<http://localhost:18081/user/list>
效果如下:
(2)创建springcloud-day1-resttemplate
创建的详细过程也不讲解了,直接使用IDEA创建一个SpringBoot工程即可。
pom.xml依赖
<!--父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
创建启动类,并在启动类中创建RestTemplate对象
@SpringBootApplication
public class SpringcloudDay1ResttemplateApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudDay1ResttemplateApplication.class, args);
}
/***
* @Bean:创建一个对象实例,并将对象交给Spring容器管理
* <bean id="restTemplate" class="org.springframework.web.client.RestTemplate" />
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
测试
在测试类HttpDemoApplicationTests中@Autowired
注入RestTemplate
通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码
RestTemplate会自动发起请求,接收响应
并且帮我们对响应结果进行反序列化
代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringcloudDay1ResttemplateApplicationTests {
@Autowired
private RestTemplate restTemplate;
/****
* RestTemplate远程调用
*/
@Test
public void testRestTemplateQuery() {
String url = "http://localhost:18081/user/list";
String result = restTemplate.getForObject(url, String.class);
System.out